橘子味的心
标题:JSP调试方法

在本章中,我们将讨论学习如何调试JSP。JSP和servlet总是难以测试/调试。 JSP和Servlet往往涉及到大量的客户端/服务器交互,使错误可能难以复制。

以下是一些提示和建议,可能会帮助您对JSP和servlet进行调试。

1. 使用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,还将在logs目录中的stdout.log文件末尾看到输出了这些行。

counter = 1
counter = 2
counter = 3
counter = 4
counter = 5
counter = 6
counter = 7
counter = 8
counter = 9
counter = 10

这样,可以将变量和其他信息输入到系统日志中,以便分析问题的根本原因或其他原因。

2. 使用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中将会有其他信息。我们将使用信息记录器的info()方法,因为并记录信息仅供参考。 以下是stdout.log文件的快照 -

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

消息可以通过使用函数severe()warning()info()config()fine()finer()finest()来发送到各个级别的信息。 这里可以使用severe()方法来记录信息,并使用strict()方法来记录严重的信息。

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

调试工具

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

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

  • 断点
  • 逐步通过代码
  • 观察点

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

1. 使用JDB调试器

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

要调试JSP或servlet,可以调试sun.servlet.http.HttpServer,然后观察HttpServer是否执行JSP/servlet以响应从浏览器进行的HTTP请求。这非常类似于applet的调试方式。与applet不同的是,被调试的实际程序是sun.applet.AppletViewer

大多数调试器通过自动知道如何调试小程序来隐藏这些细节。直到它们对JSP执行相同操作,必须通过考虑以下内容来使用调试器 -

  • 设置调试器的类路径。这有助于找到sun.servlet.http.Http-Server和关联的类。
  • 设置调试器的类路径。这有助于找到JSP和支持类,通常是{WebApp}\WEB-INF\classes

当设置了正确的classpath,开始调试sun.servlet.http.HttpServer。就可以在任何调试感兴趣的JSP中设置断点,然后使用Web浏览器向HttpServer发送给定JSP(http:// localhost:8080/JSPToDebug)的请求。这里的执行停止在设置的断点处。

2. 使用注释

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

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

3. 客户端和服务器头

有时,当JSP不按预期行为时,查看原始HTTP请求和响应是有用的。如果熟悉HTTP的结构,可以阅读请求和响应,并查看这些标题究竟是什么。

重要的调试提示

以下是有关JSP调试的更多调试提示的列表:

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

  • 确保浏览器不通过强制完全重新载入页面来缓存先前请求的输出。如果使用的浏览器是:Netscape Navigator,则使用Shift-Reload; 使用的浏览器是:Internet Explorer使用Shift-Refresh

分类