开发使用过程中始终是难以测试/调试servlet。 Servlet往往涉及大量的客户端/服务器交互,可能会出现错误但难以重现。
这里有一些提示和建议,可以帮助你调试。
System.out.println() 是作为一个标记,以测试是否有一定的一段代码被执行或不使用。我们可以打印出变量的值。此外:
由于系统对象是核心Java对象的一部分,它可以被用于任何地方,而不需要安装任何额外的类中。这包括Servlets和JSP,RMI,EJB,普通Bean和类,以及独立的应用程序。
相比在断点处停止,写入到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 - by www.gitbook.net }
ServletContext中文本消息记录到servlet容器的日志文件。对于Tomcat,这些日志可在<Tomcat-installation-directory>/logs目录中找到。
这些日志文件做给新出现的错误或问题的频率的记录。通常不在发生异常catch子句中使用log()函数。
可以具有相同的jdb命令您使用调试applet或应用程序的调试Servlet。
为了调试一个servlet,我们可以调试sun.servlet.http.HttpServer,然后看HttpServer的执行Servlet的响应HTTP请求从浏览器。这是调试applets小程序非常相似。与applet不同的是,实际被调试的程序是sun.applet.AppletViewer。
大多数调试器会自动知道如何调试applet隐藏这个细节。对于servlet同样的,你一定要帮调试器通过执行以下操作:
设置您的调试器的类路径,以便它可以找到 sun.servlet.http.Http-Server 和相关的类
设置调试器的类路径中,因此它也可以找到servlet和支持类,通常是在server_root/servlet和server_root/class。
通常你不会希望server_root/Servlet在classpath中,因为它会禁用servlet的重新加载。这种包容性,对于调试非常有用。它允许在一个servlet调试器设置断点之前自定义servlet加载器在HttpServer加载的servlet。
如果已经设置了正确的classpath,就可以开始调试sun.servlet.http.HttpServer。可以在感兴趣的servlet代码中调试设置断点,然后使用Web浏览器请求给定的servlet(http://localhost:8080/servlet/ServletToDebug)。您应该看程序执行到停止的断点。
代码中的注释可以帮助调试过程中的各种方式。注释可用于很多其他的方法在调试过程中。
该Servlet使用Java注释和多行单行(//...)(/* ...*/)注释可用于暂时删除Java代码部分作用。如果错误消失,仔细看看你刚才注释的代码,并找出问题。
有时,当一个Servlet并没有像预期的那样,它是非常有用的,看看原始的HTTP请求和响应。如果你熟悉HTTP的结构,你可以阅读的请求和响应,看看这些响应头究竟会发生什么事情。
下面是更多一些的servlet调试的调试技巧的列表:
请注意,server_root/class不会重载,而server_root/Servlet 可能会。
要求浏览器显示它会显示在页面的原始内容。这可以帮助识别格式的问题。它通常是“视图”菜单下的选项。
确保浏览器还没有缓存的前一个请求的强制执行完全重新加载页面的输出。在Netscape Navigator中,使用Shift-RELOAD;与Internet Explorer使用Shift刷新。
请确认servlet的init()方法接受一个ServletConfig参数,并马上调用super.init(config)。