位置:首頁 > Java技術 > JSP教學 > JSP調試

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。