以下内容引用自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 methods
ServletContext context = getServletContext( );
if (par == null || par.equals(""))
//log version with Throwable parameter
context.log("No message received:",
new IllegalStateException("Missing parameter"));
else
context.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

Servlet的调试的更多相关文章

  1. servlet基础(组成与生命周期)

    servlet基础作用:servlet是运行在Web服务器或应用服务器上的程序:担当web浏览器或其他HTTP客户程序发出的请求与HTTP服务器上的数据库或应用程序之间的中间层.1.读取客户程序发送的 ...

  2. JSP和Servlet面试题

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

  3. Java温故系列之web项目复习

    如果从外面导入项目 操作方法为: File->Import -->General-->Existing Project into Workspace 搭建sqlserver数据库连接 ...

  4. 对session和cookie的一些理解

    由于项目需要,最近用session容器比较多,传载的同时加上了自己的一些理解,不足之处还请大家补充和纠正.);                  response.addCookie(c1);   * ...

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

    这几天准备弄一个微信公众号,在进行服务器配置的时候出现总是出现token验证失败的报错. 实际上,这个问题很好解决.既然微信平台没有给我们很明确的报错提示,那么我们就可以通过跟踪获取到的请求参数进行分 ...

  6. spring4全注解web项目demo

    记得没接触框架的时候,写demo测试时真的很爽,新建web项目,然后随便写写servlet随便调试 框架越来越多,配置记不得了,整合容易出问题,集成新东西越来越少了,不敢动了. 这是个spring4的 ...

  7. java笔试题三(javaWeb)

    1.讲一下Servlet的执行过程,doGet和doPost的区别. 执行过程: 比如注解配置版本,先继承httpServlet,一旦发送get请求 调用,再执行post方法. doGet和doPos ...

  8. javaWeb后端学习记录

    java后端学习重点: 1.java语言特性: 基础知识,集合,多线程,并发,JVM,NIO,网络编程,设计模式.  (★★★★★) jdk源码中有大量的数据结构与java语言细节.jdk源码着重看c ...

  9. Java初中级程序员面试题宝典

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

随机推荐

  1. 归并排序算法及其JS实现

    归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(con ...

  2. InChatter系统之客户端消息处理中心

    一.模块结构 首先来看下客户端消息处理中心模块的简单结构: ChatCallback:服务器端我们定义的回调接口IChatCallback的客户端实现 ChatMsgCenter:服务端的消息处理中心 ...

  3. python strip() 函数探究

    strip()方法语法:str.strip([chars]); 声明:str为字符串,rm为要删除的字符序列 str.strip(rm) 删除字符串中开头.结尾处,位于rm删除序列的字符 eg1: # ...

  4. (转)淘淘商城系列——SSM框架整合之Dao层整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72721093 一个项目中往往有三层即Dao层.Service层和Web层,看标题就知道了,本文 ...

  5. 循环和递归的区别(以前以为递归就是for循环!错的!)

    这里直接上代码!!!! //代码1:(for循环实现的代码) void main() { ; ; i<;i++) { n++; } printf("%d",n); } //代 ...

  6. MIPS的寄存器、指令和寻址方式的分类

    MIPS的32个寄存器 助记符 编号 作用 zero 0 恒为0 at 1 (assembly temporary)保留给汇编器使用 v0,v1 2-3 (values)子程序返回,即函数调用时的返回 ...

  7. C3P0连接池参数配置说明

    C3P0连接池参数配置说明 created by cjk on 2017.8.15 常用配置 initialPoolSize:连接池初始化时创建的连接数,default : 3(建议使用) minPo ...

  8. 使用soapUI5.3.0调试webservice接口(参数为XML格式)

    最近项目中经常要调试webservice接口,从朋友处了解到他们经常使用SoapUI,因此学习一下这个工具的使用,为避免遗忘,特地记录下来,分享分享... 下载 #####首先,下载SoapUI,我下 ...

  9. 工具:docs网页笔记

    用到工具python 网页笔记工具:mkdocs https://www.cnblogs.com/bigmagic/p/10309260.html 案例: https://github.com/zha ...

  10. No-7.运算符

    数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成基本的算术运算使用的符号,用来处理四则运算 运算符 描述 实例 + 加 10 + 20 ...