# Servlet 調試
測試/調試 Servlet 始終是開發使用過程中的難點。Servlet 往往涉及大量的客戶端/服務器交互,可能會出現錯誤但又難以重現。
這里有一些提示和建議,可以幫助您調試。
## System.out.println()
System.out.println() 是作為一個標記來使用的,用來測試一段特定的代碼是否被執行。我們也可以打印出變量的值。此外:
* 由于 System 對象是核心 Java 對象的一部分,它可以在不需要安裝任何額外類的情況下被用于任何地方。這包括 Servlet、JSP、RMI、EJB's、普通的 Beans 和類,以及獨立的應用程序。
* 與在斷點處停止不同,寫入到 System.out 不會干擾到應用程序的正常執行流程,這使得它在時序是至關重要的時候顯得尤為有價值。
下面是使用 System.out.println() 的語法:
```
System.out.println("Debugging message");
```
通過上面的語法生成的所有消息將被記錄在 Web 服務器日志文件中。
## 消息日志
使用適當的日志記錄方法來記錄所有調試、警告和錯誤消息,這是非常好的想法,推薦使用 [log4J](/log4j/index.htm) 來記錄所有的消息。
Servlet API 還提供了一個簡單的輸出信息的方式,使用 log() 方法,如下所示:
```
// 導入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ContextLog extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
java.io.IOException {
String par = request.getParameter("par1");
// 調用兩個 ServletContext.log 方法
ServletContext context = getServletContext( );
if (par == null || par.equals(""))
// 通過 Throwable 參數記錄版本
context.log("No message received:",
new IllegalStateException("Missing parameter"));
else
context.log("Here is the visitor's message: " + par);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
String title = "Context Log";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<h2 align=\"center\">Messages sent</h2>\n" +
"</body></html>");
} //doGet
}
```
ServletContext 把它的文本消息記錄到 Servlet 容器的日志文件中。對于 Tomcat,這些日志可以在 <Tomcat-installation-directory>/logs 目錄中找到。
這些日志文件確實對新出現的錯誤或問題的頻率給出指示。正因為如此,建議在通常不會發生的異常的 catch 子句中使用 log() 函數。
## 使用 JDB 調試器
您可以使用調試 applet 或應用程序的 jdb 命令來調試 Servlet。
為了調試一個 Servlet,我們可以調試 sun.servlet.http.HttpServer,然后把它看成是 HttpServer 執行 Servlet 來響應瀏覽器端的 HTTP 請求。這與調試 applet 小程序非常相似。與調試 applet 不同的是,實際被調試的程序是 sun.applet.AppletViewer。
大多數調試器會自動隱藏如何調試 applet 的細節。同樣的,對于 servlet,您必須幫調試器執行以下操作:
* 設置您的調試器的類路徑 classpath,以便它可以找到 sun.servlet.http.Http-Server 和相關的類。
* 設置您的調試器的類路徑 classpath,以便它可以找到您的 servlet 和支持的類,通常是在 server_root/servlets 和 server_root/classes 中。
您通常不會希望 server_root/servlets 在您的 classpath 中,因為它會禁用 servlet 的重新加載。但是這種包含規則對于調試是非常有用的。它允許您的調試器在 HttpServer 中的自定義 Servlet 加載器加載 Servlet 之前在 Servlet 中設置斷點。
如果您已經設置了正確的類路徑 classpath,就可以開始調試 sun.servlet.http.HttpServer。可以在您想要調試的 Servlet 代碼中設置斷點,然后通過 Web 瀏覽器使用給定的 Servlet(http://localhost:8080/servlet/ServletToDebug)向 HttpServer 發出請求。您會看到程序執行到斷點處會停止。
## 使用注釋
代碼中的注釋有助于以各種方式進行調試。注釋可用于調試過程的很多其他方式中。
該 Servlet 使用 Java 注釋和單行注釋(//...),多行注釋(/* ...*/)可用于暫時移除部分 Java 代碼。如果 bug 消失,仔細看看您剛才注釋的代碼并找出問題所在。
## 客戶端和服務器端頭信息
有時,當一個 Servlet 并沒有像預期那樣時,查看原始的 HTTP 請求和響應是非常有用的。如果您熟悉 HTTP 結構,您可以閱讀請求和響應,看看這些頭信息究竟是什么。
## 重要的調試技巧
下面列出了一些 Servlet 調試的技巧:
* 請注意,server_root/classes 不會重載,而 server_root/servlets 可能會。
* 要求瀏覽器顯示它所顯示的頁面的原始內容。這有助于識別格式的問題。它通常是"視圖"菜單下的一個選項。
* 通過強制執行完全重新加載頁面來確保瀏覽器還沒有緩存前一個請求的輸出。在 Netscape Navigator 中,請使用 Shift-Reload,在 Internet Explorer 中,請使用 Shift-Refresh。
* 請確認 servlet 的 init() 方法接受一個 ServletConfig 參數,并調用 super.init(config)。
- Java 基礎
- Java 簡介
- Java開發環境配置
- Java基礎語法
- Java對象和類
- Java基本數據類型
- Java變量類型
- Java修飾符
- Java運算符
- Java循環結構 - for, while 及 do...while
- Java分支結構 - if...else/switch
- Java Number類
- Java Character類
- Java String類
- Java StringBuffer和StringBuilder類
- Java 數組
- Java 日期時間
- Java正則表達式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 異常處理
- Java 面向對象
- Java 繼承
- Java 重寫(Override)與重載(Overload)
- Java 多態
- Java 抽象類
- Java 接口
- Java 包(package)
- Java 高級教程
- Java 數據結構
- Java Enumeration接口
- Java Bitset類
- Java Vector 類
- Java Stack 類
- Java Dictionary 類
- Java Hashtable 接口
- Java Properties 接口
- Java 集合框架
- Java 泛型
- Java序列化
- Java 網絡編程
- Java 發送郵件
- Java 多線程編程
- Java Applet基礎
- Java 文檔注釋
- Servlet 教程
- Servlet 簡介
- Servlet 環境設置
- Servlet 生命周期
- Servlet 實例
- Servlet 表單數據
- Servlet 客戶端 HTTP 請求
- Servlet 服務器 HTTP 響應
- Servlet HTTP 狀態碼
- Servlet 編寫過濾器
- Servlet 異常處理
- Servlet Cookies 處理
- Servlet Session 跟蹤
- Servlet 數據庫訪問
- Servlet 文件上傳
- Servlet 處理日期
- Servlet 網頁重定向
- Servlet 點擊計數器
- Servlet 自動刷新頁面
- Servlet 發送電子郵件
- Servlet 包
- Servlet 調試
- Servlet 國際化
- JSP 基礎
- JSP 簡介
- JSP 開發環境搭建
- JSP 結構
- JSP 生命周期
- JSP 語法
- JSP 指令
- JSP 動作元素
- JSP 動作元素
- JSP 隱含對象
- JSP 客戶端請求
- JSP 服務器響應
- JSP HTTP 狀態碼
- JSP 表單處理
- JSP 過濾器
- JSP Cookies 處理
- JSP Session
- JSP 文件上傳
- JSP 日期處理
- JSP 頁面重定向
- JSP 點擊量統計
- JSP 自動刷新
- JSP 發送郵件
- JSP 高級教程
- JSP 標準標簽庫(JSTL)
- JSP 連接數據庫
- JSP XML 數據處理
- JSP JavaBean
- JSP 自定義標簽
- JSP 表達式語言
- JSP 異常處理
- JSP 調試
- JSP 國際化
- 免責聲明