• Servlet的调试


    以下内容引用自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">
    ";
          out.println(docType +
            "<html>
    " +
            "<head><title>" + title + "</title></head>
    " +
            "<body bgcolor="#f0f0f0">
    " +
            "<h1 align="center">" + title + "</h1>
    " +
            "<h2 align="center">Messages sent</h2>
    " +
            "</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

  • 相关阅读:
    List的Select 和Select().tolist()
    lambda中FirstOrDefault和First
    EF时,数据库字段和实体类不一致问题
    用户变量问题
    实验十二:字符串和结构
    实验十一:指针(2)
    实验十:指针(1)
    实验九:二维数组和字符数组的应用
    实验八:一维数组的应用
    实验七:函数及数组(1)
  • 原文地址:https://www.cnblogs.com/EasonJim/p/6985944.html
Copyright © 2020-2023  润新知