- JSP 基础教程
- JSP - 首页
- JSP - 概述
- JSP - 环境设置
- JSP - 架构
- JSP - 生命周期
- JSP - 语法
- JSP - 指令
- JSP - 动作
- JSP - 隐式对象
- JSP - 客户端请求
- JSP - 服务器响应
- JSP - HTTP 状态码
- JSP - 表单处理
- JSP - 编写过滤器
- JSP - Cookie 处理
- JSP - 会话跟踪
- JSP - 文件上传
- JSP - 处理日期
- JSP - 页面重定向
- JSP - 点击计数器
- JSP - 自动刷新
- JSP - 发送邮件
- 高级 JSP 教程
- JSP - 标准标签库
- JSP - 数据库访问
- JSP - XML 数据
- JSP - Java Bean
- JSP - 自定义标签
- JSP - 表达式语言
- JSP - 异常处理
- JSP - 调试
- JSP - 安全性
- JSP - 国际化
- JSP 有用资源
- JSP - 问题与解答
- JSP - 快速指南
- JSP - 有用资源
- JSP - 讨论
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 集成开发环境,支持开发独立的 Java 应用程序和 Web 应用程序,支持 JSP 和 servlet 规范,并且还包括一个 JSP 调试器。
NetBeans 支持以下基本调试功能:
- 断点
- 单步执行代码
- 观察点
您可以参考NetBeans 文档以了解上述调试功能。
使用 JDB 调试器
您可以使用与调试 applet 或应用程序相同的jdb命令来调试 JSP 和 servlet。
要调试 JSP 或 servlet,您可以调试sun.servlet.http.HttpServer,然后观察 HttpServer 如何响应我们从浏览器发出的 HTTP 请求来执行 JSP/servlet。这与调试 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 的请求(https://127.0.0.1:8080/JSPToDebug)。这里的执行在断点处停止。
使用注释
代码中的注释可以以多种方式帮助调试过程。注释可以在调试过程中以多种其他方式使用。
JSP 使用 Java 注释,并且单行 (// ...) 和多行 (/* ... */) 注释可用于暂时删除 Java 代码的部分。如果错误消失了,仔细查看您刚刚注释掉的代码并找出问题所在。
客户端和服务器标头
有时,当 JSP 的行为与预期不符时,查看原始 HTTP 请求和响应很有用。如果您熟悉 HTTP 的结构,您可以阅读请求和响应,并查看这些标头到底发生了什么。
重要的调试技巧
以下是有关 JSP 调试的一些更多调试技巧:
要求浏览器显示它正在显示的页面的原始内容。这可以帮助识别格式问题。通常在“查看”菜单下有一个选项。
通过强制完全重新加载页面来确保浏览器没有缓存先前请求的输出。使用Netscape Navigator,使用Shift-Reload;使用Internet Explorer,使用Shift-Refresh。