測試/調(diào)試 Servlet 始終是開發(fā)使用過程中的難點。Servlet 往往涉及大量的客戶端/服務器交互,可能會出現(xiàn)錯誤但又難以重現(xiàn)。
這里有一些提示和建議,可以幫助您調(diào)試。
System.out.println() 是作為一個標記來使用的,用來測試一段特定的代碼是否被執(zhí)行。我們也可以打印出變量的值。此外:
下面是使用 System.out.println() 的語法:
System.out.println("Debugging message");
通過上面的語法生成的所有消息將被記錄在 Web 服務器日志文件中。
使用適當?shù)娜罩居涗浄椒▉碛涗浰姓{(diào)試、警告和錯誤消息,這是非常好的想法,推薦使用 log4J 來記錄所有的消息。
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");
// 調(diào)用兩個 ServletContext.log 方法
ServletContext context = getServletContext( );
if (par == null || par.equals(""))
// 通過 Throwable 參數(shù)記錄版本
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 目錄中找到。
這些日志文件確實對新出現(xiàn)的錯誤或問題的頻率給出指示。正因為如此,建議在通常不會發(fā)生的異常的 catch 子句中使用 log() 函數(shù)。
您可以使用調(diào)試 applet 或應用程序的 jdb 命令來調(diào)試 Servlet。
為了調(diào)試一個 Servlet,我們可以調(diào)試 sun.servlet.http.HttpServer,然后把它看成是 HttpServer 執(zhí)行 Servlet 來響應瀏覽器端的 HTTP 請求。這與調(diào)試 applet 小程序非常相似。與調(diào)試 applet 不同的是,實際被調(diào)試的程序是 sun.applet.AppletViewer。
大多數(shù)調(diào)試器會自動隱藏如何調(diào)試 applet 的細節(jié)。同樣的,對于 servlet,您必須幫調(diào)試器執(zhí)行以下操作:
您通常不會希望 server_root/servlets 在您的 classpath 中,因為它會禁用 servlet 的重新加載。但是這種包含規(guī)則對于調(diào)試是非常有用的。它允許您的調(diào)試器在 HttpServer 中的自定義 Servlet 加載器加載 Servlet 之前在 Servlet 中設(shè)置斷點。
如果您已經(jīng)設(shè)置了正確的類路徑 classpath,就可以開始調(diào)試 sun.servlet.http.HttpServer??梢栽谀胍{(diào)試的 Servlet 代碼中設(shè)置斷點,然后通過 Web 瀏覽器使用給定的 Servlet(http://localhost:8080/servlet/ServletToDebug)向 HttpServer 發(fā)出請求。您會看到程序執(zhí)行到斷點處會停止。
代碼中的注釋有助于以各種方式進行調(diào)試。注釋可用于調(diào)試過程的很多其他方式中。
該 Servlet 使用 Java 注釋和單行注釋(//...),多行注釋(/* ...*/)可用于暫時移除部分 Java 代碼。如果 bug 消失,仔細看看您剛才注釋的代碼并找出問題所在。
有時,當一個 Servlet 并沒有像預期那樣時,查看原始的 HTTP 請求和響應是非常有用的。如果您熟悉 HTTP 結(jié)構(gòu),您可以閱讀請求和響應,看看這些頭信息究竟是什么。
下面列出了一些 Servlet 調(diào)試的技巧:
更多建議: