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("Debugging message");

以下示例显示如何使用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,您还会发现这些行附加到日志目录中的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 记录器 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中获得其他信息。我们将使用记录器的info方法,因为记录消息只是为了提供信息。以下是 stdout.log 文件的快照 -

24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 1 myCount = -4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 2 myCount = -3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 3 myCount = -2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 4 myCount = -1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 5 myCount = 0
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 6 myCount = 1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 7 myCount = 2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 8 myCount = 3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 9 myCount = 4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 10 myCount = 5

通过使用便利函数severe()、warning()、info()、config()、fine()、finer()finest() ,可以在各个级别发送消息。这里finest()方法可以用来记录最精细的信息,severe()方法可以用来记录严重的信息。

您可以使用Log4J 框架根据消息的严重性级别和重要性将消息记录在不同的文件中。

调试工具

NetBeans 是一个免费的开源 Java 集成开发环境,支持开发支持 JSP 和 servlet 规范的独立 Java 应用程序和 Web 应用程序,并且还包括 JSP 调试器。

NetBeans 支持以下基本调试功能 -

  • 断点
  • 单步执行代码
  • 观察点

您可以参考NetBeans 文档来了解上述调试功能。

使用 JDB 调试器

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

要调试 JSP 或 servlet,您可以调试sun.servlet.http.HttpServer,然后观察 HttpServer 执行 JSP/servlet 以响应我们从浏览器发出的 HTTP 请求。这与小程序的调试方式非常相似。不同之处在于,对于小程序,正在调试的实际程序是sun.applet.AppletViewer

大多数调试器通过自动了解如何调试小程序来隐藏此细节。在他们对 JSP 做同样的事情之前,您必须通过考虑以下内容来帮助您的调试器 -

  • 设置调试器的类路径。这可以帮助您找到sun.servlet.http.Http-Server和关联的类。

  • 设置调试器的类路径。这可以帮助您找到 JSP 和支持类,通常是ROOT\WEB-INF\classes

设置正确的类路径后,开始调试sun.servlet.http.HttpServer。您可以在您想要调试的任何 JSP 中设置断点,然后使用 Web 浏览器向 HttpServer 发出给定 JSP 的请求(http://localhost:8080/JSPToDebug)。这里的执行在断点处停止。

使用注释

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

JSP 使用 Java 注释,单行 (// ...)多行 (/* ... */)注释可用于临时删除部分 Java 代码。如果错误消失了,请仔细查看您刚刚注释的代码并找出问题所在。

客户端和服务器标头

有时,当 JSP 的Behave不符合预期时,查看原始 HTTP 请求和响应会很有用。如果您熟悉 HTTP 的结构,则可以读取请求和响应并查看这些标头到底发生了什么。

重要的调试技巧

以下是有关 JSP 调试的更多调试技巧的列表 -

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

  • 通过强制完全重新加载页面,确保浏览器不会缓存先前请求的输出。对于Netscape Navigator,请使用Shift-Reload;对于Internet Explorer,请使用Shift-Refresh