jsp 調試
要測試/調試一個jsp或servlet程序總是那么的難。jsp和servlets程序趨向于牽涉到大量客戶端/服務器之間的交互,這很有可能會產生錯誤,并且很難重現出錯的環境。
接下來將會給出一些小技巧和小建議,來幫助您調試程序。
使用system.out.println()
system.out.println()可以很方便地標記一段代碼是否被執行。當然,我們也可以打印出各種各樣的值。此外:
- 自從system對象成為java核心對象后,它便可以使用在任何地方而不用引入額外的類。使用范圍包括servlets,jsp,rmi,ejb's,beans,類和獨立應用。
- 與在斷點處停止運行相比,用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
使用這種方法可以將變量和其它的信息輸出至系統日志中,用來分析并找出造成問題的深層次原因。
使用jdb logger
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支持如下幾個基本的調試功能:
- 斷點
- 單步跟蹤
- 觀察點
詳細的信息可以查看netbeans使用手冊。
使用jdb debugger
可以在jsp和servlets中使用jdb命令來進行調試,就像調試普通的應用程序一樣。
通常,我們直接調試sun.servlet.http.httpserver 對象來查看httpserver在響應http請求時執行jsp/servlets的情況。這與調試applets非常相似。不同之處在于,applets程序實際調試的是sun.applet.appletviewer。
大部分調試器在調試applets時都能夠自動忽略掉一些細節,因為它知道如何調試applets。如果想要將調試對象轉移到jsp身上,就需要做好以下兩點:
- 設置調試器的classpath,讓它能夠找到sun.servlet.http.http-server 和相關的類。
- 設置調試器的classpath,讓它能夠找到您的jsp文件和相關的類。
設置好classpath后,開始調試sun.servlet.http.http-server 。您可以在jsp文件的任意地方設置斷點,只要你喜歡,然后使用瀏覽器發送一個請求給服務器就應該可以看見程序停在了斷點處。
使用注釋
程序中的注釋在很多方面都對程序的調試起到一定的幫助作用。注釋可以用在調試程序的很多方面中。
jsp使用java注釋。如果一個bug消失了,就請仔細查看您剛注釋過的代碼,通常都能找出原因。
客戶端和服務器的頭模塊
有時候,當jsp沒有按照預定的方式運行時,查看未加工的http請求和響應也是很有用的。如果對http的結構很熟悉的話,您可以直接觀察request和response然后看看這些頭模塊到底怎么了。
重要調試技巧
這里我們再透露兩個調試jsp的小技巧:
- 使用瀏覽器顯示原始的頁面內容,用來區分是否是格式問題。這個選項通常在view菜單下。
- 確保瀏覽器在強制重新載入頁面時沒有捕獲先前的request輸出。若使用的是netscape navigator瀏覽器,則用shift-reload;若使用的是ie瀏覽器,則用shift-refresh。