JSP偵錯方法


在本章中,我們將討論學習如何偵錯JSP。JSP和servlet總是難以測試/偵錯。 JSP和Servlet往往涉及到大量的用戶端/伺服器互動,使錯誤可能難以複製。

以下是一些提示和建議,可能會幫助您對JSP和servlet進行偵錯。

1. 使用System.out.println()

System.out.println()很容易用作一個標記來測試某段程式碼是否被執行。也可以列印變數值。想一下以下附加知識要點 -

  • 由於System物件是核心Java物件的一部分,因此可以在任何地方使用它,而無需安裝任何額外的類。這包括Servlet,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,還將在logs目錄中的stdout.log檔案末尾看到輸出了這些行。

counter = 1
counter = 2
counter = 3
counter = 4
counter = 5
counter = 6
counter = 7
counter = 8
counter = 9
counter = 10

這樣,可以將變數和其他資訊輸入到系統紀錄檔中,以便分析問題的根本原因或其他原因。

2. 使用JDB記錄器

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中生成類似的結果,但是在stdout.log中將會有其他資訊。我們將使用資訊記錄器的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

訊息可以通過使用函式severe()warning()info()config()fine()finer()finest()來傳送到各個級別的資訊。 這裡可以使用severe()方法來記錄資訊,並使用strict()方法來記錄嚴重的資訊。

可以使用Log4J框架根據其嚴重性級別和重要性將訊息記錄在不同的檔案中。

偵錯工具

NetBeans是一個免費的開源Java整合開發環境,支援獨立的Java應用程式和支援JSP和servlet規範的Web應用程式的開發,並且還包括一個JSP偵錯器。

NetBeans支援以下基本偵錯功能 -

  • 斷點
  • 逐步通過程式碼
  • 觀察點

可以參考NetBeans文件來了解以上偵錯功能。

1. 使用JDB偵錯器

可以使用用於偵錯小程式或應用程式的相同jdb命令偵錯JSP和servlet。

要偵錯JSP或servlet,可以偵錯sun.servlet.http.HttpServer,然後觀察HttpServer是否執行JSP/servlet以響應從瀏覽器進行的HTTP請求。這非常類似於applet的偵錯方式。與applet不同的是,被偵錯的實際程式是sun.applet.AppletViewer

大多數偵錯器通過自動知道如何偵錯小程式來隱藏這些細節。直到它們對JSP執行相同操作,必須通過考慮以下內容來使用偵錯器 -

  • 設定偵錯器的類路徑。這有助於找到sun.servlet.http.Http-Server和關聯的類。
  • 設定偵錯器的類路徑。這有助於找到JSP和支援類,通常是{WebApp}\WEB-INF\classes

當設定了正確的classpath,開始偵錯sun.servlet.http.HttpServer。就可以在任何偵錯感興趣的JSP中設定斷點,然後使用Web瀏覽器向HttpServer傳送給定JSP(http:// localhost:8080/JSPToDebug)的請求。這裡的執行停止在設定的斷點處。

2. 使用注釋

程式碼中的註釋可以以各種方式幫助偵錯過程。注釋可以在偵錯過程中以很多其他方式使用。

JSP使用Java註釋和單行(//...),多行(/* ... */)注釋可用於臨時刪除部分Java程式碼。如果錯誤消失,請仔細檢視剛剛註釋的程式碼,並找出問題。

3. 用戶端和伺服器頭

有時,當JSP不按預期行為時,檢視原始HTTP請求和響應是有用的。如果熟悉HTTP的結構,可以閱讀請求和響應,並檢視這些標題究竟是什麼。

重要的偵錯提示

以下是有關JSP偵錯的更多偵錯提示的列表:

請瀏覽器顯示正在顯示的頁面的原始內容。這可以幫助識別格式化問題。它通常是檢視選單下的一個選項。

  • 確保瀏覽器不通過強制完全重新載入頁面來快取先前請求的輸出。如果使用的瀏覽器是:Netscape Navigator,則使用Shift-Reload; 使用的瀏覽器是:Internet Explorer使用Shift-Refresh