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
。