📜  Servlet-调试

📅  最后修改于: 2020-11-12 05:46:19             🧑  作者: Mango


测试/调试servlet总是很困难。 Servlet往往涉及大量的客户端/服务器交互,因此可能会出错,但很难重现。

这里有一些提示和建议,可能会帮助您进行调试。

System.out.println()

System.out.println()易于用作标记,以测试是否正在执行某些代码。我们也可以打印出变量值。另外-

  • 由于System对象是核心Java对象的一部分,因此可以在任何地方使用它,而无需安装任何其他类。这包括Servlet,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 =
         ""-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "\n" +
            "" + title + "\n" +
            "\n" +
               "

" + title + "

\n" + "

Messages sent

\n" + " " ); } //doGet }

ServletContext将其文本消息记录到Servlet容器的日志文件中。对于Tomcat,这些日志可在 / logs中找到。

日志文件确实表明了新出现的错误或出现问题的频率。因此,最好在异常的catch子句中使用log()函数,该异常通常不应该发生。

使用JDB调试器

您可以使用与调试小程序或应用程序相同的jdb命令来调试servlet。

为了调试servlet,我们调试sun.servlet.http.HttpServer并仔细观察HttpServer执行servlet以响应浏览器发出的HTTP请求。这与调试小程序的方式非常相似。区别在于,使用applet进行调试的实际程序是sun.applet.AppletViewer。

大多数调试器通过自动知道如何调试小程序来隐藏此细节。在对Servlet执行相同操作之前,您必须通过执行以下操作来帮助调试器-

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

  • 设置调试器的类路径,以便它也可以找到您的servlet和支持类,通常是server_root / servlet和server_root / classes。

通常,您不希望在类路径中使用server_root / servlet,因为它会禁用servlet的重新加载。但是,此包含对于调试很有用。它允许调试器在HttpServer中的自定义servlet加载程序加载servlet之前在servlet中设置断点。

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

使用评论

代码中的注释可以通过各种方式帮助调试过程。注释可以在调试过程中以许多其他方式使用。

Servlet使用Java注释,单行(// …)和多行(/ * … * /)注释可用于暂时删除Java代码的一部分。如果错误消失,请仔细查看您刚才评论的代码,然后找出问题所在。

客户端和服务器头

有时,当servlet的行为不符合预期时,查看原始HTTP请求和响应会很有用。如果您熟悉HTTP的结构,则可以阅读请求和响应,并确切了解这些标头到底在做什么。

重要的调试技巧

这是有关servlet调试的更多调试提示的列表-

  • 请记住,server_root / classes不会重新加载,而server_root / servlets可能会重新加载。

  • 要求浏览器显示所显示页面的原始内容。这可以帮助识别格式问题。通常是“查看”菜单下的一个选项。

  • 通过强制完全重新加载页面,确保浏览器没有缓存先前请求的输出。在Netscape Navigator中,使用Shift-Reload;与Internet Explorer一起使用Shift-Refresh。

  • 验证您的Servlet的init()方法采用ServletConfig参数并立即调用super.init(config)。