JSP 调试 (debug)
写代码容易调试难
日常开发要测试/调试一个 JSP 或 Servlet 程序总是那么的难
JSP 和 Servlets 程序趋向于牵涉到大量客户端/服务器之间的交互,这很有可能会产生错误,并且很难重现出错的环境
我们现在分享一些小技巧和小建议,来帮助你调试 JSP
使用 System.out.println()
System.out.println() 可以说是一个万能工具,感觉哪个地方会出 bug 就调用它乱输出异同,好像总能找到 BUG 所在
System.out.println() 可以很方便地标记一段代码是否被执行,也可以打印出各种各样的值
System 是 Java 的核心对象,不用加载额外的其它包就能使用,于是乎 Servlets,JSP,RMI,EJB's,Beans,类和独立应用等等,都可以 println() 一下
System.out.println() 的另一个优势就是它的输出不会对应用程序的运行流程造成重大的影响,
接下来给出了使用 System.out.println() 的语法
System.out.println("Debugging message");
这是一个使用 System.out.print() 的简单例子
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!doctype html> <meta charset="utf-8" /> <title>System.out.println</title> <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>
如果运行上面的例子的话,它将会产生如下的结果:
-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 Logger
J2SE 日志框架可为任何运行在 JVM中的类提供日志记录服务
因此我们可以利用这个框架来记录任何信息
让我们来重写以上代码,使用JDK中的 logger API:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page import="java.util.logging.Logger" %> <!doctype html> <meta charset="utf-8" /> title>Logger.info</title> <% 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>
它的运行结果与先前的类似,但是,它可以获得额外的信息输出至 stdout.log 文件中
在这我们使用了 logger 中的 info 方法
下面我们给出stdout.log文件中的一个快照:
24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=1 myCount=-4 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=2 myCount=-3 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=3 myCount=-2 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=4 myCount=-1 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=5 myCount=0 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=6 myCount=1 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=7 myCount=2 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=8 myCount=3 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=9 myCount=4 24-Sep-2017 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=10 myCount=5
消息可以使用各种优先级发送,通过使用sever(),warning(),info(),config(),fine(),finer(),finest()方法
finest()方法用来记录最好的信息,而 sever() 方法用来记录最严重的信息
使用 Log4J 框架来将消息记录在不同的文件中,这些消息基于严重程度和重要性来进行分类
调试工具
现在各个比较流行的 Java 继承环境都有非常好的 JSP 调试工具,包括:
- 断点
- 单步跟踪
- 观察点
使用JDB Debugger
jdb 命令可以用来调试 JSP 和 servlets
一般情况下我们会直接调试 javax.servlet.http.HttpServer 对象来查看 HttpServer 在响应 HTTP 请求时执行 JSP/Servlets 的情况
当然了,要熟练使用 JDB 需要做好以下几点:
-
设置调试器的 classpath,让它能够找到 javax.servlet.http.HttpServer 和相关的类
-
设置调试器的 classpath,让它能够找到我们的 JSP 文件和相关的类
设置好classpath后,开始调试 javax.servlet.http.HttpServer
我们可以在 JSP 文件的任意地方设置断点,只要你喜欢,然后使用浏览器发送一个请求给服务器就应该可以看见程序停在了断点处
使用注释
善用注释是每个高级程序员的绝技,如果我们注释一段代码后 BUG 消失了,那么就应该仔细查看注释的代码,通常都能找到原因
客户端的请求头和服务器的响应头
如果 JSP 页面没有按照预定的方式显示时,查看原始的 HTTP 请求信息和响应信息是非常必要的,而且是有用的
如果对 HTTP 的结构很熟悉的话,可以直接观察 request 和 response 出了什么问题
其它重要调试技巧
这里我们再告诉你两个调试 JSP 的小技巧
-
使用浏览器查看网页源码,检测是否是格式问题
-
使用强制刷新来防止浏览器缓存