# 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。
- Java Web項目開發學習手冊
- 一、B/S開發環境搭建
- 1.1 tomcat服務器目錄結構及作用
- 1.2 在IDE開發工具上配置tomcat服務器
- 1.3 簡單web項目在tomcat服務器上運行的方法
- 1.4 開發工具設置
- 1.5 總結
- 二、Servlet技術應用
- 2.1 HttpServlet中的主要方法及應用
- 2.1.1 基于Eclipse完成一個JavaWeb項目
- 2.2 HttpRequest,HttpResponse的應用
- 2.2.1客戶端請求
- 2.2.2服務器響應
- 2.2.3Servlet HTTP 狀態碼
- 2.2.4圖片驗證碼類
- 2.2.5注冊模擬實現(帶驗證碼)
- 2.3 ServletConfig對象和ServletContext對象的概念
- 2.4 總結
- 三、JSP技術應用
- 3.1 JSP基本語法
- 3.2 JSP標簽和指令
- 3.3 JSP中的隱式對象
- 3.4 常用應用操作
- 3.4.1 JSP客戶端請求
- 3.4.2 JSP服務器響應
- 3.4.3 HTTP狀態碼
- 3.4.4 表單處理
- 3.4.5 過濾器
- 3.4.6 Cookie處理
- 3.4.7 Session處理
- 3.4.8 文件上傳
- 3.4.9 日期處理
- 3.4.10 頁面重定向
- 3.4.11 點擊量統計
- 3.4.12 自動刷新
- 3.4.13 發送郵件
- 3.5 JSP高級應用
- 3.5.1 JSP標準標簽庫(JSTL)
- 3.5.2 JSP連接數據庫
- 3.5.3 JSP XML數據處理
- 3.5.4 JSP JavaBean
- 3.5.5 自定義標簽
- 3.5.6 表達式語言
- 3.5.7 異常處理
- 3.5.8 調試
- 3.5.9 JSP國際化
- 3.6 實踐代碼
- 3.6.1 實踐代碼
- 3.6.2 項目實戰
- 3.7 總結
- 四、MVC思想的理解和搭建MVC
- 4.1 MVC設計模式的思想
- 4.2 MVC設計模式的實現步驟
- 4.3 項目實踐
- 4.4 總結
- 五、EL表達式和JSTL技術
- 5.1 EL表達式及其應用
- 5.2 常用的JSTL標簽的應用
- 5.3 項目實踐
- 5.4 總結
- 六、Cookie和Session
- 6.1 cookie對象的概念和應用
- 6.2 session對象的概念和應用
- 6.3 項目實踐
- 6.4 總結
- 七、過濾器技術應用
- 7.1 Filter的概念及應用
- 7.2 Filter、FilterChain、FilterConfig 介紹
- 7.3 用戶登錄過濾案例
- 7.4 項目實戰
- 7.5總結
- 八、異步請求技術
- 8.1 JSON數據格式
- 8.2 使用AJAX實現異步請求
- 8.3 用戶名校驗案例
- 8.4小結
- 綜合項目技術實訓
- 1.BS項目開發項目實戰
- 2.項目需求分析和系統設計
- 2.1需求分析
- 2.2類型模型設計
- 2.3原型設計
- 3.項目數據庫分析和系統設計
- 4.BS項目編程實現
- 4.1搭建框架和命名規約
- 4.2實現步驟
- 4.2.1創建實體類
- 4.2.2創建過濾器類
- 4.2.3創建工具類
- 4.2.4創建DAO接口及其實現類
- 4.2.5創建Service接口及其實現類
- 4.2.6創建測試類
- 4.2.7創建控制器類
- 5.企業開發流程規范
- 6.總結
- 九、練習題及答案
- 企業開發常用技術
- 1.Maven技術
- Java命名規范解讀
- 參考資料
- 開發中常用的應用服務器和Web服務器