開發使用過程中始終是難以測試/調試servlet。 Servlet往往涉及大量的客戶端/服務器交互,可能會出現錯誤但難以重現。
這裡有一些提示和建議,可以幫助你調試。
System.out.println() 是作為一個標記,以測試是否有一定的一段代碼被執行或不使用。我們可以打印出變量的值。此外:
由於係統對象是核心Java對象的一部分,它可以被用於任何地方,而不需要安裝任何額外的類中。這包括Servlets和JSP,RMI,EJB,普通Bean和類,以及獨立的應用程序。
相比在斷點處停止,寫入到System.out不會乾擾與應用程序的正常執行流程,這使得它非常有價值的,時序是至關重要的。
以下是使用System.out.println()的語法:
System.out.println("Debugging message");
通過上麵的語法生成的消息將被記錄在Web服務器日誌文件。
這是非常好的想法,使用適當的日誌記錄方法來記錄所有調試,警告和錯誤消息,使用標準的日誌方法。推薦使用Log4j來記錄所有的消息。
Servlet API還提供了一個簡單的方法,使用log()方法輸出信息如下:
// Import required java libraries 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"); //Call the two ServletContext.log methods ServletContext context = getServletContext( ); if (par == null || par.equals("")) //log version with Throwable parameter 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 - by www.gitbook.net }
ServletContext中文本消息記錄到servlet容器的日誌文件。對於Tomcat,這些日誌可在<Tomcat-installation-directory>/logs目錄中找到。
這些日誌文件做給新出現的錯誤或問題的頻率的記錄。通常不在發生異常catch子句中使用log()函數。
可以具有相同的jdb命令您使用調試applet或應用程序的調試Servlet。
為了調試一個servlet,我們可以調試sun.servlet.http.HttpServer,然後看HttpServer的執行Servlet的響應HTTP請求從瀏覽器。這是調試applets小程序非常相似。與applet不同的是,實際被調試的程序是sun.applet.AppletViewer。
大多數調試器會自動知道如何調試applet隱藏這個細節。對於servlet同樣的,你一定要幫調試器通過執行以下操作:
設置您的調試器的類路徑,以便它可以找到 sun.servlet.http.Http-Server 和相關的類
設置調試器的類路徑中,因此它也可以找到servlet和支持類,通常是在server_root/servlet和server_root/class。
通常你不會希望server_root/Servlet在classpath中,因為它會禁用servlet的重新加載。這種包容性,對於調試非常有用。它允許在一個servlet調試器設置斷點之前自定義servlet加載器在HttpServer加載的servlet。
如果已經設置了正確的classpath,就可以開始調試sun.servlet.http.HttpServer。可以在感興趣的servlet代碼中調試設置斷點,然後使用Web瀏覽器請求給定的servlet(http://localhost:8080/servlet/ServletToDebug)。您應該看程序執行到停止的斷點。
代碼中的注釋可以幫助調試過程中的各種方式。注釋可用於很多其他的方法在調試過程中。
該Servlet使用Java注釋和多行單行(//...)(/* ...*/)注釋可用於暫時刪除Java代碼部分作用。如果錯誤消失,仔細看看你剛才注釋的代碼,並找出問題。
有時,當一個Servlet並冇有像預期的那樣,它是非常有用的,看看原始的HTTP請求和響應。如果你熟悉HTTP的結構,你可以閱讀的請求和響應,看看這些響應頭究竟會發生什麼事情。
下麵是更多一些的servlet調試的調試技巧的列表:
請注意,server_root/class不會重載,而server_root/Servlet 可能會。
要求瀏覽器顯示它會顯示在頁麵的原始內容。這可以幫助識彆格式的問題。它通常是“視圖”菜單下的選項。
確保瀏覽器還冇有緩存的前一個請求的強製執行完全重新加載頁麵的輸出。在Netscape Navigator中,使用Shift-RELOAD;與Internet Explorer使用Shift刷新。
請確認servlet的init()方法接受一個ServletConfig參數,並馬上調用super.init(config)。