Servlet的調試


以下內容引用自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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM