由于需要与服务器进行交互,调试JSP和Servlet比较麻烦,下面介绍几种常见方法。
一、Eclipse调试工具
Eclipse支持JSP和Servlet规范,也包括一个JSP调试器。
Eclipse支持以下基本的调试功能:
- 断点
- 单步调试
- 监视点
调试方法与Java基本相同。步骤如下:
- 首先打开自己的项目
- 在项目中找到想要调试的地方,如图,在代码行的前方点击设置断点,或者把鼠标移动到代码行,用快捷键“Ctrl+Shift+b”设置断点
- 然后在菜单中,点击“调试”或F11
- 在弹出的对话框点击“Yes”,进入“debug模式”
- 在窗口的右上方可以看到 代码中的相对应得值
F5是单步跳进,F6是执行下一步,F7是跳出
以上是Java的调试方法,JSP基本相同,但支持得不好,有时得不到正确结果。所以用下面的方法更好。
二、使用System.out.println()
System.out.println()在测试中作为一个标记很容易使用,不管某段代码是否被执行。也可以输出变量值。另外:
- 由于System对象是Java对象核心的一部分,它可以在任何地方被使用而不需要安装额外的类。这包括Servlets,JSP,RMI,EJB's,ordinary Beans和classes,和独立的应用程序。
- 与停在断点相比较,写到System.out中并没有对应用程序正常的执行流产生过多的干扰,当时间至关重要时,这使得它非常有价值。
下面是使用System.out.println()的语法:
System.out.println("Debugging message");
下面是使用System.out.println()的一个简单的例子:
@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head><title>System.out.printlntitle>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,它将会在浏览器上产生以下的结果:
如果使用的是Tomcat,还将发现这些行会被附加到日志目录里stdout.log文件的末尾。
这样可以把变量和其他信息打印到系统日志中,可以分析找到问题的根本原因或者其他各种原因。
三、使用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.infotitle>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文件的一个快照:
可以通过使用方便的函数发送各种级别的消息,如severe(),warning(),info(),config(),fine(),finer()和finest()。这里,finest()方法可以用于记录最好的信息,severe()方法可以用于记录严峻的消息。
可以使用Log4J Framework在不同的文件中根据消息的严重水平和重要性来记录他们。
四、使用JDB调试器
可以使用用来调试小程序和应用程序相同的jdb命令来调试JSP和Servlets 。
为了调试JSP和Servlets,可以调试sun.servlet.http.HttpServer,然后在来自浏览器的HTTP请求的响应里查看HttpServer正在执行的JSP/Servlets。这和如何调试小程序非常相似。不同不处是,在小程序里,真正的程序是在sun.applet.AppletViewer里调试的。
大多数调试器通过自动得知如何调试小程序来隐藏这些细节。直到它们对JSP做着同样的操作,必须帮助调试器执行以下操作:
- 设置调试器的类路径,以便于找到sun.servlet.Http-Server和与其相关的类。
- 设置调试器的类路径,以便于找到JSP和支持的类,典型的是ROOT\WEB-INF\classes。
一旦已经正确的设置了类路径,开始调试sun.servlet.http.HttpServer。对于一个给定的JSP,可以感兴趣的任何地方设置断点,然后通过一个Web浏览器来发送一个请求到HttpServer (http://localhost:8080/JSPToDebug
)。会看到执行设置的断点处停止。
详细参考:http://www.jianshu.com/p/c11ad97d5bec
五、使用注释
代码中的注释可以用不同的方法帮助调试过程。注释可以用于调试过程的很多其他方面。
JSP使用Java命令和单线(//...)和多线(/*...(/)命令,可以暂时删除Java代码的一部分。如果错误消失,仔细看看代码注释并找出问题所在。
六、客户端和服务器端头文件
有时,当一个JSP表现的不像预期的那样,查看一下原始的HTTP请求和响应是非常有用的。如果熟悉HTTP的结构,可以读取请求和响应,看看那些头文件中到底是社么信息。
七、重要的调试技巧
这里是一些关于JSP调试的调试技巧:
- 向浏览器查看它显示的页面的原始内容。这可以帮助识别格式问题。它通常是视图菜单下的一个选项。
- 确保浏览器不会通过强迫一个完全加载的页面来缓存先前的请求的输出。在 Internet Explorer,使用Shift-Refresh。(Ctrl+F5)
测试工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test23