1. 程式人生 > >Servlet的調試

Servlet的調試

appletv 可用 核心 bgcolor 其他 包括 equal javax 顯示

以下內容引用自http://wiki.jikexueyuan.com/project/servlet/debugging.html:

測試/調試Servlet始終是困難的。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");

通過上述語法生成的所有消息將被記錄在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 }

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做同樣的事情,必須做以下操作來幫助調試器:

  • 設置調試器的類路徑,以便它可以找到sun.servlet.http.Http-Server和相關的類。

  • 設置調試器的類路徑,以便它可以找到Servlet和支持的類,通常是在server_root/servlets和server_root/classes中。

通常不會希望server_root/servlets在classpath中,因為它會禁用Servlet的重載。然而這種包含對於調試是有用的。在HttpServer中的自定義的Servlet加載器加載Servlet之前,它允許調試器在Servlet中設置斷點。

一旦設置了正確的類路徑,就可以開始調試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;在 IE 瀏覽器中,請使用Shift-Refresh(Ctrl+F5更快)。

  • 確認Servlet的init()方法接受一個ServletConfig參數並立即調用super.init(config)。

測試工程:https://github.com/easonjim/5_java_example/tree/master/servletbasics/test17

Servlet的調試