JSP - 调试

在本章中,我们将讨论调试JSP.测试/调试JSP和servlet总是很困难. JSP和Servlet往往涉及大量的客户端/服务器交互,使得错误很可能但很难重现.

以下是一些可能有助于您进行调试的提示和建议.

使用System.out.println()

System.out.println()很容易用作用于测试某段代码是否正在执行的标记.我们也可以打印出变量值.考虑以下附加点:

  • 由于System对象是核心Java对象的一部分,因此它可以在任何地方使用无需安装任何额外的类.这包括 Servlets,JSP,RMI,EJB,普通Bean ,以及独立应用程序.

  • 与在断点处停止相比,写入 System.out 不会干扰应用程序的正常执行流程,这使得当iming至关重要时非常有价值.

以下是使用 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 Logger

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 .我们将使用记录器的 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

可以使用便利功能在各个级别发送消息严重(),警告(),信息(),配置(),罚款(),更精细(),最好().这里finest()方法可用于记录最精细的信息,而strict()方法可用于记录严重信息.

您可以使用 Log4J Framework 根据严重性级别和重要性在不同文件中记录消息.

调试工具

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

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

  • 断点

  • 步进通过代码

  • 观察点

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

使用JDB调试器

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

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

大多数调试器通过自动知道如何调试applet来隐藏这个细节.在他们对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没有按预期运行,查看原始HTTP请求和响应很有用.如果你熟悉HTTP的结构,你可以阅读请求和响应,看看这些标题究竟是什么.

重要的调试技巧

以下列出了一些有关JSP调试和减号的更多调试技巧;

  • 请求浏览器显示原始它正在显示的页面的内容.这有助于识别格式问题.它通常是View菜单下的一个选项.

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