位置:首页 > > JSP调试

JSP调试

JSP和servlet始终是难以测试/调试的。 JSP和Servlet的往往涉及大量的客户端/服务器交互,使得错误的可能,但难以重现。

这里有一些提示,并且可以帮助您在调试时提供一些建议。

使用System.out.println():

System.out.println()是很容易作为一个标记,以测试是否正在执行或没有一定的一段代码使用。我们可以打印出变量的值也是如此。此外:

  • 由于该系统的对象是核心Java对象的一部分,它可以在任何地方使用,而无需安装任何额外的类。这包括Servlets和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。这里我们使用的是记录的信息的方法,因为我们正在记录的消息只是信息的目的。这里是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(), and finest(). 这里finest()方法可用于记录最好的信息和severe() 方法可用于记录严重信息。

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

调试工具:

NetBeans是一个支持独立的Java应用程序和支持JSP和Servlet规范的Web应用程序的开发,并包括一个JSP调试器,以及一个自由和开放源码的Java集成开发环境。

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

  • 断点

  • 单步执行代码

  • 观察点

您可以参考NteBeans文档来了解上面的调试功能。

使用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和支持类,通常在 ROOTWEB-INFclasses.

一旦您已设置正确的类路径,开始调试sun.servlet.http.HttpServer。可以在任何JSP中感兴趣的调试设置断点,然后使用Web浏览器发出请求到HttpServer为给定的JSP(http://localhost:8080/JSPToDebug)。您应该看到执行停在你的断点。

使用注释:

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

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

客户端和服务器连接头:

有时,当一个JSP并没有像预期的那样,是看原始的HTTP请求和响应是非常有用的。如果你熟悉HTTP的结构,可以读取请求和响应,看看那些头到底是怎么回事。

重要的调试提示:

下面是一些关于JSP调试调试更多的提示列表:

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

  • 确保浏览器不缓存前一个请求的输出通过强制页面重新加载。与Netscape Navigator,请按住Shift-Reload; 而Internet Explorer使用Shift-Refresh。