JSP - 调试 debug
在本章中,我们将讨论调试JSP。 测试/调试JSP和servlet总是很困难。 JSP和Servlet往往涉及大量的客户端/服务器交互,使得错误可能但很难重现。
以下是一些可能有助于您进行调试的提示和建议。
Using System.out.println()
System.out.println()很容易用作标记来测试某段代码是否正在执行。 我们也可以打印出变量值。 考虑以下附加点 -
由于System对象是核心Java对象的一部分,因此可以在任何地方使用它,而无需安装任何额外的类。 这包括Servlets, JSP, RMI, EJB's, ordinary Beans和classes以及standalone applications 。
与在断点处停止相比,写入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,则还会在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获得其他信息。 我们将使用记录器的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 Framework根据其严重性级别和重要性在不同文件中记录消息。
调试工具
NetBeans是一个免费的开源Java集成开发环境,支持开发支持JSP和servlet规范的独立Java应用程序和Web应用程序,并且还包括JSP调试器。
NetBeans支持以下基本调试功能 -
- Breakpoints
- 单步执行代码
- Watchpoints
您可以参考NetBeans documentation以了解上述调试功能。
使用JDB调试器
您可以使用用于调试applet或应用程序的相同jdb命令来调试JSP和servlet。
要调试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注释, single line (// ...)和multiple line (/* ... */)注释可用于临时删除部分Java代码。 如果错误消失,请仔细查看您刚评论的代码并找出问题所在。
客户端和服务器标头
有时,当JSP没有按预期运行时,查看原始HTTP请求和响应很有用。 如果您熟悉HTTP的结构,则可以阅读请求和响应,并了解这些标头的确切内容。
重要的调试技巧
以下列出了一些关于JSP调试的更多调试技巧 -
请求浏览器显示其正在显示的页面的原始内容。 这有助于识别格式问题。 它通常是“视图”菜单下的一个选项。
通过强制完全重新加载页面,确保浏览器不缓存先前请求的输出。 使用Netscape Navigator ,使用Shift-Reload ; 使用Internet Explorer Shift-Refresh使用Shift-Refresh 。