以下内容引用自http://wiki.jikexueyuan.com/project/servlet/debugging.html:

测试/调试Servlet始终是困难的。Servlets往往涉及大量的客户端/服务器交互,可能会出现错误但是又难以重现。

这里有一些提示和建议,可以帮助调试。

一、System.out.println()

System.out.println()作为一个标记用来测试某一代码片段是否被执行,使用方法非常简单。也可以输出变量值。另外:

  • 由于System对象是核心Java对象的一部分,它可以用于任何不需要安装任何额外类的地方。这包括Servlets、JSP、RMI、EJB's、普通的Beans和类,以及独立的应用程序。

  • 与在断点处停止相比,写入System.out不会对应用程序的正常执行流程有太多干扰,这使得它在时序重要的时候显得非常有价值。

以下使用System.out.println()的语法:

System.out.println("Debugging message");

通过上述语法生成的所有消息将被记录在Web服务器的日志文件中。

二、消息记录

利用标准日志记录方法,使用适当的日志记录方法来记录所有调试、警告和错误消息是非常好的想法,使用的是log4J来记录所有的消息。

Servlet API还提供了一个简单的输出信息的方式,使用log()方法,如下所示:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ContextLog extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {   String par = request.getParameter("par1");//Call the two ServletContext.log methodsServletContext context = getServletContext( );if (par == null || par.equals(""))//log version with Throwable parametercontext.log("No message received:",new IllegalStateException("Missing parameter"));elsecontext.log("Here is the visitor's message: " + par);      response.setContentType("text/html");java.io.PrintWriter out = response.getWriter( );String title = "Context Log";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +"transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<h2 align=\"center\">Messages sent</h2>\n" +"</body></html>");} //doGet
}

ServletContext把它的文本消息记录到Servlet容器的日志文件中。使用Tomcat,这些日志可以在<Tomcat-installation-directory>/logs目录中找到。

这些日志文件确实为新出现的错误或问题的频率给出了指示。正因为如此,在通常不会出现的异常catch子句中使用log()函数是很好的。

三、使用JDB调试器

可以使用调试applet或应用程序的相同的jdb命令来调试Servlet。

为了调试一个Servlet,可以调试sun.servlet.http.HttpServer,然后把它看成是HttpServer执行Servlet来响应来自浏览器端的HTTP请求。这与调试applet小程序的方式非常相似。与调试applet不同的是,被调试的实际程序是sun.applet.AppletViewer。

大多数调试器会自动隐藏了解如何调试applet的细节。直到他们为Servlet做同样的事情,必须做以下操作来帮助调试器:

  • 设置调试器的类路径,以便它可以找到sun.servlet.http.Http-Server和相关的类。

  • 设置调试器的类路径,以便它可以找到Servlet和支持的类,通常是在server_root/servlets和server_root/classes中。

通常不会希望server_root/servlets在classpath中,因为它会禁用Servlet的重载。然而这种包含对于调试是有用的。在HttpServer中的自定义的Servlet加载器加载Servlet之前,它允许调试器在Servlet中设置断点。

一旦设置了正确的类路径,就可以开始调试sun.servlet.http.HttpServer。可以在任何想要调试的Servlet中设置断点,然后使用Web浏览器为给定的Servlet(http://localhost:8080/servlet/ServletToDebug) 向HttpServer发出请求。会看到程序执行到设置的断点处停止。

四、使用注释

代码中的注释有助于以各种方式调试程序。注释可用于调试过程中的许多其他方式中。

Servlet使用Java注释,单行注释(//...)和多行注释(/*...*/)可用于暂时移除部分Java代码。如果bug消失,仔细看看之前注释的代码并找出问题所在。

五、客户端和服务器端头信息

有时,当一个Servlet并没有像预期那样工作时,查看原始的HTTP请求和响应是非常有用的。如果对HTTP结构很熟悉,可以阅读请求和响应,看看这些头信息中究竟是什么。

六、重要的调试技巧

这里是Servlet调试中的一些调试技巧列表:

  • 请注意server _ root/classes不会重载,而server_root/servlets可能会。

  • 要求浏览器显示它所显示的页面的原始内容。这有助于识别格式的问题。它通常是视图菜单下的一个选项。

  • 通过强制执行完全重载页面,来确保浏览器还没有缓存前一个请求的输出。在Netscape Navigator中,使用Shift-Reload;在 IE 浏览器中,请使用Shift-Refresh(Ctrl+F5更快)。

  • 确认Servlet的init()方法接受一个ServletConfig参数并立即调用super.init(config)。

测试工程:https://github.com/easonjim/5_java_example/tree/master/servletbasics/test17

转载于:https://www.cnblogs.com/EasonJim/p/6985944.html

Servlet的调试相关推荐

  1. Eclipse tomcat Web页面调试

    Visual Age for Java是IBM所开发的Java IDE开发环境.早在几年前,就已经占了Java开发平台的半壁江山,而近来已有好长时间没出新版本了,原因在于IBM全心投入了Eclipse ...

  2. JSP 与 Servlet重要部分

    1.讲下servlet的执行流程. Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()<启动顺序根据web.xml里的startup-o ...

  3. java调试器jdb_Java调试教程-Java调试器(JDB)概述

    Java调试教程-Java调试器(JDB)概述 (2010-12-24 10:44:44) 标签: 杂谈 摘要 虽然现在有一些很好的调试工具,然而 Java 调试器 (JDB) 提供了一些优点.最重要 ...

  4. linux eclipse web插件,使用Tomcat插件开发WEB应用

    在Eclipse中,可以安装Tomcat插件,实现WEB应用的开发调试工作,Tomcat插件还可以支持WEB应用的热部署. 一.安装配置Tomcat插件 可以通过拷贝安装和Links方式安装Tomca ...

  5. java判断时间区间 隔天_Java初中级程序员面试题宝典

    Java基础部分 &与&&区别? &和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假:但是&&当第一个条件不成之后,后面的条件都 ...

  6. 《Tomcat权威指南》读书笔记

    第一章 Tomcat的开幕式 1.Tomcat是以Java编写的,这表示在能够构建和测试它之前,必须安装最新的.完整的JAVA运行环境(JRE,Java runtime). 2.Catalina To ...

  7. 2018年在武汉面试java软件开发所遇到的一些问题

    前言: 本人就我自己在面试中遇到的一些问题做了一个总结,在面试过程中有的问题答上来了,有些回答的感觉不尽人意,有些的遇到的问题问我的一脸懵逼.所以写一个文档出来,以激励自己还有不足的地方,遇到一次不会 ...

  8. 2019年最全的java面试题总结

    从网上下载搜罗了一些最常用的面试题,希望正在面试的小伙伴们能够早点找到称心如意的工作! Java基础部分 &与&&区别? &和&&都是逻辑运算符,都是判 ...

  9. 微信公众号token验证失败的一些总结

    本文转载自: https://www.cnblogs.com/sunnor/p/5958272.html 作者:Sunnor 转载请注明该声明. 这几天准备弄一个微信公众号,在进行服务器配置的时候出现 ...

最新文章

  1. 糟心!苹果无人车裁员190人,程序员却首当其冲
  2. flashpaper打印机没有被正确安装_没有正确保存与安装,可导致80%的轴承提早失效...
  3. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏的解决方案
  4. linux——系统日志的信息、采集、查看、保存
  5. Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成
  6. python多线程实现方式_python中实现多线程有几种方式?
  7. python 字符串替换_学完Python打算出去找工作,怕找不到?看完这篇你可以提高通过率...
  8. python概念-Socket到底有多骚
  9. Android 学习笔记 Service服务与远程通信...(AIDL)
  10. (1)数据库和MySql初步认识
  11. (Network Analysis)graph centrality measures
  12. [BZOJ4816][SDOI2017]数字表格(反演)
  13. Unity_AR制作_80
  14. linux 分区 intel raid,linux on intel sata raid
  15. mounted钩子函数_解决Vue中mounted钩子函数获取节点高度出错问题
  16. 第五次网页前端培训(JavaScript)
  17. 计算机主机和外设的接口是,外设接口
  18. linux控制wifi的设备,WIFI控制的遥控车
  19. thinkpad怎么把计算机设置到桌面,联想ThinkPad笔记本Fn键关闭与启用方法
  20. HTML5的字体样式设置方法

热门文章

  1. 【Linux】一步一步学Linux——bzip2命令(65)
  2. java.util 常见_Java基础知识-java.util.concurrent包下常见类的使用
  3. 【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
  4. 数据结构-----AVL树的旋转操作
  5. php递归多维数组为缩进列表,php – 缩进列表到多维数组
  6. Tensorflow—tfrecord数据集生成与使用
  7. windows + vscode 远程配置
  8. php使mysql显示错误_如何针对依赖用户输入的长查询在PHP中显示MySQL错误?
  9. Pixhawk原生固件以往代码版本的下载
  10. 最后一块石头的重量II