JSP 调试

  • 调试

    在本章中,我们将讨论调试JSP。测试/调试JSP和servlet总是很困难。JSP和Servlet往往涉及大量的客户机/服务器交互,因此可能会出错,但很难重现。以下是一些提示和建议,可以帮助您进行调试。
  • 使用System.out.println()

    System.out.println()易于用作标记,以测试是否正在执行某些代码。我们也可以打印出变量值。考虑以下附加点-
    • 由于System对象是核心Java对象的一部分,因此可以在任何地方使用它,而无需安装任何其他类。这包括Servlet,JSP,RMI,EJB,普通Bean和类以及独立应用程序。
    • 与在断点处停止相比,写入System.out不会对应用程序的正常执行流程产生多大的干扰,这在绑定非常关键时非常有价值。
    以下是使用System.out.println()的语法-
    
    System.out.println("调试消息");
    
    以下示例显示如何使用System.out.print() -
    
    <%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
    
    <html>
       <head><title>System.out.println</title></head>
       <body>
          <c:forEach var = "counter" begin = "1" end = "10" step = "1" >
          
             <c:out value = "${counter-5}"/></br>
             <% System.out.println( "counter = " + pageContext.findAttribute("counter") ); %>
          </c:forEach>
          
       </body>
    </html>
    
    访问上面的JSP,浏览器将显示以下结果-
    
    -4
    -3
    -2
    -1
    0
    1
    2
    3
    4
    5
    
    如果使用的是Tomcat,您还将在logs目录中的stdout.log末尾找到这些行。
    
    counter = 1
    counter = 2
    counter = 3
    counter = 4
    counter = 5
    counter = 6
    counter = 7
    counter = 8
    counter = 9
    counter = 10
    
    这样,您可以将变量和其他信息带入系统日志,可以对其进行分析以找出问题的根本原因或其他各种原因。
  • 使用JDB记录器

    在J2SE日志框架被设计为运行在JVM中的任何类提供日志服务。我们可以利用这个框架来记录任何信息。让我们使用JDK logger API重写以上示例-
    
    <%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
    <%@page import = "java.util.logging.Logger" %>
    
    <html>
       <head><title>Logger.info</title></head>
       
       <body>
          <% Logger logger = Logger.getLogger(this.getClass().getName());%>
    
          <c:forEach var = "counter" begin = "1" end = "10" step = "1" >
          <c:set var = "myCount" value = "${counter-5}" />
          <c:out value = "${myCount}"/></br>
             <% String message = "counter = "
                + pageContext.findAttribute("counter") + "myCount = "
                + pageContext.findAttribute("myCount");
                logger.info( message );
             %>
          </c:forEach>
          
       </body>
    </html>
    
    上面的代码将在浏览器和stdout.log中生成类似的结果,但是您将在stdout.log中获得更多信息。我们将使用logger的info方法,因为并将日志记录为仅供参考。以下是stdout.log文件的快照-
    
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 1 myCount = -4
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 2 myCount = -3
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 3 myCount = -2
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 4 myCount = -1
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 5 myCount = 0
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 6 myCount = 1
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 7 myCount = 2
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 8 myCount = 3
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 9 myCount = 4
    24-Mar-2020 11:32:31 org.apache.jsp.main_jsp _jspService
    INFO: counter = 10 myCount = 5
    
    可以使用便利函数everage(),warning(),info(),config(),fine(),finer()和finest()在不同级别发送消息。在这里,finest()方法可用于记录最精细的信息,而strictever()方法可用于记录重要的信息。您可以使用Log4J Framework根据消息的严重性级别和重要性将消息记录在不同的文件中。
  • 调试工具

    NetBeans是一个免费的开源Java集成开发环境,支持开发支持JSP和Servlet规范的独立Java应用程序和Web应用程序,并且还包括JSP调试器。NetBeans支持以下基本调试功能-
    • 断点
    • 单步执行代码
    • 观察点
    您可以参考NetBeans文档以了解上述调试功能。
  • 使用JDB调试器

    您可以使用与调试小程序或应用程序相同的jdb命令来调试JSP和servlet 。要调试JSP或servlet,可以调试sun.servlet.http.HttpServer,然后观察HttpServer响应我们从浏览器发出的HTTP请求执行JSP/servlet的过程。这与调试小程序的方式非常相似。区别在于,使用applet进行调试的实际程序是sun.applet.AppletViewer。大多数调试器通过自动知道如何调试applet来隐藏此细节。在对JSP执行相同操作之前,您必须考虑以下因素来帮助调试器-
    • 设置调试器的类路径。这可以帮助您找到sun.servlet.http.Http-Server及其关联的类。
    • 设置调试器的类路径。这可以帮助您找到JSP和支持类,通常是ROOT\WEB-INF\classes。
    设置正确的类路径后,开始调试sun.servlet.http.HttpServer。您可以在要调试的任何JSP中设置断点,然后使用Web浏览器向给定JSP (http://localhost:8080/JSPToDebug)的HttpServer发出请求。此处的执行在断点处停止。
  • 使用注释

    代码中的注释可以通过各种方式帮助调试过程。注释可以在调试过程中以许多其他方式使用。JSP使用Java注释,单行(// ...)和多行(/ * ... * /)注释可用于临时删除Java代码的一部分。如果错误消失了,请仔细查看您刚才注释的代码,找出问题所在。
  • 客户端和服务端头

    有时,当JSP的运行不正常时,查看原始HTTP请求和响应会很有用。如果您熟悉HTTP的结构,则可以阅读请求和响应,并查看这些标头到底在做什么。
    重要的调试技巧 - 这是有关JSP调试的更多调试提示列表-
    • 要求浏览器显示所显示页面的原始内容。这可以帮助识别格式问题。通常是“查看”菜单下的一个选项。
    • 通过强制完全重新加载页面,确保浏览器未缓存先前请求的输出。在Netscape Navigator中,使用Shift-Reload ; 与Internet Explorer一起使用Shift-Refresh。