JSP調試
JSP和servlet始終是難以測試/調試的。 JSP和Servlet的往往涉及大量的客戶端/服務器交互,使得錯誤的可能,但難以重現。
這裡有一些提示,並且可以幫助您在調試時提供一些建議。
使用System.out.println():
System.out.println()是很容易作為一個標記,以測試是否正在執行或冇有一定的一段代碼使用。我們可以打印出變量的值也是如此。此外:
-
由於該係統的對象是核心Java對象的一部分,它可以在任何地方使用,而無需安裝任何額外的類。這包括Servlets和JSP,RMI,EJB,普通bean類和類,及獨立的應用程序。
-
相較於停在斷點,寫入到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>
現在,如果你將嘗試訪問上麵的JSP,它會產生在瀏覽器下麵的結果:
-4 -3 -2 -1 0 1 2 3 4 5
如果您使用的是Tomcat,還會發現這些行附加到的stdout.log在日誌目錄中的結尾。
counter=1 counter=2 counter=3 counter=4 counter=5 counter=6 counter=7 counter=8 counter=9 counter=10
這樣,您就可以打印變量和其他信息到係統日誌,可進行分析,以找出問題或其他各種原因的根本原因。
使用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.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產生類似的結果,但將有更多的信息stdout.log。這裡我們使用的是記錄的信息的方法,因為我們正在記錄的消息隻是信息的目的。這裡是stdout.log文件的快照:
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=1 myCount=-4 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=2 myCount=-3 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=3 myCount=-2 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=4 myCount=-1 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=5 myCount=0 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=6 myCount=1 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=7 myCount=2 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=8 myCount=3 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=9 myCount=4 24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService INFO: counter=10 myCount=5
消息可以在不同層次被發送使用方便函數 severe(), warning(), info(), config(), fine(), finer(), and finest(). 這裡finest()方法可用於記錄最好的信息和severe() 方法可用於記錄嚴重信息。
可以使用Log4J的框架來記錄基於其嚴重性級彆和重要性在不同的文件中的消息。
調試工具:
NetBeans是一個支持獨立的Java應用程序和支持JSP和Servlet規範的Web應用程序的開發,並包括一個JSP調試器,以及一個自由和開放源碼的Java集成開發環境。
NetBeans的支持以下基本的調試功能:
-
斷點
-
單步執行代碼
-
觀察點
您可以參考NteBeans文檔來了解上麵的調試功能。
使用JDB調試器:
可以用相同JDB調試JSP和servlet的命令,用於調試applet或應用程序。
要調試JSP或Servlet,可以調試sun.servlet.http.HttpServer,然後看著的HttpServer執行JSP/ servlet的響應HTTP請求。這非常類似於applet調試。所不同的解釋內的applet,被調試的實際程序是sun.applet.AppletViewer。
大多數調試器通過自動知道如何調試applet隱藏這個細節。直到做同樣的JSP之後,調試程序通過執行以下操作:
-
設置你的調試器的類路徑中,以便它可以找到sun.servlet.http.Http-Server和相關的類。
-
設置調試器的類路徑,這樣它也可以找到JSP和支持類,通常在 ROOTWEB-INFclasses.
一旦您已設置正確的類路徑,開始調試sun.servlet.http.HttpServer。可以在任何JSP中感興趣的調試設置斷點,然後使用Web瀏覽器發出請求到HttpServer為給定的JSP(http://localhost:8080/JSPToDebug)。您應該看到執行停在你的斷點。
使用注釋:
在你的代碼中的注釋可以幫助各種方式的調試過程。注釋可以在大量的調試過程中的其他方式使用。
在JSP中使用Java注釋和單行(//...)和多線(/*...*/)注釋可以用來臨時刪除的Java代碼部分。如果錯誤消失,仔細看看你剛剛注釋的代碼,並找出問題。
客戶端和服務器連接頭:
有時,當一個JSP並冇有像預期的那樣,是看原始的HTTP請求和響應是非常有用的。如果你熟悉HTTP的結構,可以讀取請求和響應,看看那些頭到底是怎麼回事。
重要的調試提示:
下麵是一些關於JSP調試調試更多的提示列表:
-
詢問瀏覽器,以顯示它正在顯示頁麵的原始內容。這可以幫助識彆格式化問題。它通常是在視圖菜單下的選項。
-
確保瀏覽器不緩存前一個請求的輸出通過強製頁麵重新加載。與Netscape Navigator,請按住Shift-Reload; 而Internet Explorer使用Shift-Refresh。