共计 3807 个字符,预计需要花费 10 分钟才能阅读完成。
导读 | JSP(全称 JavaServer Pages)是由 Sun Microsystems 公司主导创建的一种动态网页技术标准。JSP 部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者。JSP 技术以 Java 语言作为脚本语言,为用户的 HTTP 请求提供服务,并能与服务器上的其它 Java 程序共同处理复杂的业务需求。 |
要测试 / 调试一个 JSP 或 servlet 程序总是那么的难。JSP 和 Servlets 程序趋向于牵涉到大量客户端 / 服务器之间的交互,这很有可能会产生错误,并且很难重现出错的环境。
接下来将会给出一些小技巧和小建议,来帮助您调试程序。
System.out.println() 可以很方便地标记一段代码是否被执行。当然,我们也可以打印出各种各样的值。此外:
1. 自从 System 对象成为 Java 核心对象后,它便可以使用在任何地方而不用引入额外的类。使用范围包括 Servlets,JSP,RMI,EJB’s,Beans,类和独立应用。
2. 与在断点处停止运行相比,用 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>
现在,如果运行上面的例子的话,它将会产生如下的结果:
-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
使用这种方法可以将变量和其它的信息输出至系统日志中,用来分析并找出造成问题的深层次原因。
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 文件中。在这我们使用了 logger 中的 info 方法。下面我们给出 stdout.log 文件中的一个快照:
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=1 myCount=-4
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=2 myCount=-3
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=3 myCount=-2
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=4 myCount=-1
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=5 myCount=0
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=6 myCount=1
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=7 myCount=2
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=8 myCount=3
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=9 myCount=4
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter=10 myCount=5
消息可以使用各种优先级发送,通过使用 sever(),warning(),info(),config(),fine(),finer(),finest() 方法。finest() 方法用来记录最好的信息,而 sever() 方法用来记录最严重的信息。
使用 Log4J 框架来将消息记录在不同的文件中,这些消息基于严重程度和重要性来进行分类。
NetBeans 是树形结构,是开源的 Java 综合开发环境,支持开发独立的 Java 应用程序和网络应用程序,同时也支持 JSP 调试。
NetBeans 支持如下几个基本的调试功能:
1. 断点
2. 单步跟踪
3. 观察点
详细的信息可以查看 NetBeans 使用手册。
可以在 JSP 和 servlets 中使用 jdb 命令来进行调试,就像调试普通的应用程序一样。
通常,我们直接调试 sun.servlet.http.HttpServer 对象来查看 HttpServer 在响应 HTTP 请求时执行 JSP/Servlets 的情况。这与调试 applets 非常相似。不同之处在于,applets 程序实际调试的是 sun.applet.AppletViewer。
大部分调试器在调试 applets 时都能够自动忽略掉一些细节,因为它知道如何调试 applets。如果想要将调试对象转移到 JSP 身上,就需要做好以下两点:
1. 设置调试器的 classpath,让它能够找到 sun.servlet.http.Http-Server 和相关的类。
2. 设置调试器的 classpath,让它能够找到您的 JSP 文件和相关的类。
设置好 classpath 后,开始调试 sun.servlet.http.Http-Server。您可以在 JSP 文件的任意地方设置断点,只要你喜欢,然后使用浏览器发送一个请求给服务器就应该可以看见程序停在了断点处。
程序中的注释在很多方面都对程序的调试起到一定的帮助作用。注释可以用在调试程序的很多方面中。
JSP 使用 Java 注释。如果一个 BUG 消失了,就请仔细查看您刚注释过的代码,通常都能找出原因。
有时候,当 JSP 没有按照预定的方式运行时,查看未加工的 HTTP 请求和响应也是很有用的。如果对 HTTP 的结构很熟悉的话,您可以直接观察 request 和 response 然后看看这些头模块到底怎么了。
这里我们再透露两个调试 JSP 的小技巧:
1. 使用浏览器显示原始的页面内容,用来区分是否是格式问题。这个选项通常在 View 菜单下。
2. 确保浏览器在强制重新载入页面时没有捕获先前的 request 输出。若使用的是 Netscape Navigator 浏览器,则用 Shift-Reload;若使用的是 IE 浏览器,则用 Shift-Refresh。