要測(cè)試/調(diào)試一個(gè)JSP或servlet程序總是那么的難。JSP和Servlets程序趨向于牽涉到大量客戶(hù)端/服務(wù)器之間的交互,這很有可能會(huì)產(chǎn)生錯(cuò)誤,并且很難重現(xiàn)出錯(cuò)的環(huán)境。
接下來(lái)將會(huì)給出一些小技巧和小建議,來(lái)幫助您調(diào)試程序。
System.out.println()可以很方便地標(biāo)記一段代碼是否被執(zhí)行。當(dāng)然,我們也可以打印出各種各樣的值。此外:
接下來(lái)給出了使用System.out.println()的語(yǔ)法:
System.out.println("Debugging message");
這是一個(gè)使用System.out.print()的簡(jiǎn)單例子:
<%@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>
現(xiàn)在,如果運(yùn)行上面的例子的話,它將會(huì)產(chǎn)生如下的結(jié)果:
-4 -3 -2 -1 0 1 2 3 4 5
如果使用的是Tomcat服務(wù)器,您就能夠在logs目錄下的stdout.log文件中發(fā)現(xiàn)多出了如下內(nèi)容:
counter=1 counter=2 counter=3 counter=4 counter=5 counter=6 counter=7 counter=8 counter=9 counter=10
使用這種方法可以將變量和其它的信息輸出至系統(tǒng)日志中,用來(lái)分析并找出造成問(wèn)題的深層次原因。
J2SE日志框架可為任何運(yùn)行在JVM中的類(lèi)提供日志記錄服務(wù)。因此我們可以利用這個(gè)框架來(lái)記錄任何信息。
讓我們來(lái)重寫(xiě)以上代碼,使用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>
它的運(yùn)行結(jié)果與先前的類(lèi)似,但是,它可以獲得額外的信息輸出至stdout.log文件中。在這我們使用了logger中的info方法。下面我們給出stdout.log文件中的一個(gè)快照:
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
消息可以使用各種優(yōu)先級(jí)發(fā)送,通過(guò)使用sever(),warning(),info(),config(),fine(),finer(),finest()方法。finest()方法用來(lái)記錄最好的信息,而sever()方法用來(lái)記錄最嚴(yán)重的信息。
使用Log4J 框架來(lái)將消息記錄在不同的文件中,這些消息基于嚴(yán)重程度和重要性來(lái)進(jìn)行分類(lèi)。
NetBeans是樹(shù)形結(jié)構(gòu),是開(kāi)源的Java綜合開(kāi)發(fā)環(huán)境,支持開(kāi)發(fā)獨(dú)立的Java應(yīng)用程序和網(wǎng)絡(luò)應(yīng)用程序,同時(shí)也支持JSP調(diào)試。
NetBeans支持如下幾個(gè)基本的調(diào)試功能:
詳細(xì)的信息可以查看NetBeans使用手冊(cè)。
可以在JSP和servlets中使用jdb命令來(lái)進(jìn)行調(diào)試,就像調(diào)試普通的應(yīng)用程序一樣。
通常,我們直接調(diào)試sun.servlet.http.HttpServer 對(duì)象來(lái)查看HttpServer在響應(yīng)HTTP請(qǐng)求時(shí)執(zhí)行JSP/Servlets的情況。這與調(diào)試applets非常相似。不同之處在于,applets程序?qū)嶋H調(diào)試的是sun.applet.AppletViewer。
大部分調(diào)試器在調(diào)試applets時(shí)都能夠自動(dòng)忽略掉一些細(xì)節(jié),因?yàn)樗廊绾握{(diào)試applets。如果想要將調(diào)試對(duì)象轉(zhuǎn)移到JSP身上,就需要做好以下兩點(diǎn):
設(shè)置好classpath后,開(kāi)始調(diào)試sun.servlet.http.Http-Server 。您可以在JSP文件的任意地方設(shè)置斷點(diǎn),只要你喜歡,然后使用瀏覽器發(fā)送一個(gè)請(qǐng)求給服務(wù)器就應(yīng)該可以看見(jiàn)程序停在了斷點(diǎn)處。
程序中的注釋在很多方面都對(duì)程序的調(diào)試起到一定的幫助作用。注釋可以用在調(diào)試程序的很多方面中。
JSP使用Java注釋。如果一個(gè)BUG消失了,就請(qǐng)仔細(xì)查看您剛注釋過(guò)的代碼,通常都能找出原因。
有時(shí)候,當(dāng)JSP沒(méi)有按照預(yù)定的方式運(yùn)行時(shí),查看未加工的HTTP請(qǐng)求和響應(yīng)也是很有用的。如果對(duì)HTTP的結(jié)構(gòu)很熟悉的話,您可以直接觀察request和response然后看看這些頭模塊到底怎么了。
這里我們?cè)偻嘎秲蓚€(gè)調(diào)試JSP的小技巧:
更多建議: