Servlet - 除錯



測試/除錯 Servlet 總是很困難。Servlet 往往涉及大量的客戶端/伺服器互動,這使得錯誤很可能發生,但又難以重現。

以下是一些可能有助於您進行除錯的提示和建議。

System.out.println()

System.out.println() 是一種易於使用的標記,用於測試某些程式碼是否正在執行。我們也可以打印出變數值。此外 -

  • 由於 System 物件是核心 Java 物件的一部分,因此可以在任何地方使用它,而無需安裝任何額外的類。這包括 Servlet、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
}

ServletContext 將其文字訊息記錄到 servlet 容器的日誌檔案中。在 Tomcat 中,這些日誌位於 <Tomcat-安裝目錄>/logs 中。

日誌檔案確實可以指示新出現的錯誤或問題的頻率。因此,在通常不應該發生的異常的 catch 子句中使用 log() 函式是一個好主意。

使用 JDB 偵錯程式

您可以使用與除錯 applet 或應用程式相同的 jdb 命令來除錯 Servlet。

要除錯 Servlet,我們除錯 sun.servlet.http.HttpServer,並在 HttpServer 響應從瀏覽器發出的 HTTP 請求執行 Servlet 時仔細觀察。這與除錯 applet 的方式非常相似。區別在於,對於 applet,正在除錯的實際程式是 sun.applet.AppletViewer。

大多數偵錯程式透過自動知道如何除錯 applet 來隱藏此細節。在它們對 Servlet 執行相同操作之前,您必須透過執行以下操作來幫助您的偵錯程式 -

  • 設定偵錯程式的類路徑,以便它可以找到 sun.servlet.http.Http-Server 和相關的類。

  • 設定偵錯程式的類路徑,以便它還可以找到您的 Servlet 和支援類,通常是 server_root/servlets 和 server_root/classes。

您通常不希望 server_root/servlets 在您的類路徑中,因為它會停用 Servlet 重新載入。但是,此包含對於除錯很有用。它允許您的偵錯程式在 HttpServer 中的自定義 Servlet 載入器載入 Servlet 之前在 Servlet 中設定斷點。

設定正確的類路徑後,開始除錯 sun.servlet.http.HttpServer。您可以在您感興趣的任何 Servlet 中設定斷點,然後使用 Web 瀏覽器向 HttpServer 發出給定 Servlet 的請求 (https://:8080/servlet/ServletToDebug)。您應該會看到執行在您的斷點處停止。

使用註釋

程式碼中的註釋可以透過多種方式幫助除錯過程。註釋可以在除錯過程中以多種其他方式使用。

Servlet 使用 Java 註釋,可以使用單行 (// ...) 和多行 (/* ... */) 註釋來臨時刪除 Java 程式碼的一部分。如果錯誤消失了,仔細檢視您剛剛註釋掉的程式碼,找出問題所在。

客戶端和伺服器標頭

有時,當 Servlet 的行為不符合預期時,檢視原始 HTTP 請求和響應很有用。如果您熟悉 HTTP 的結構,您可以讀取請求和響應,並準確瞭解這些標頭中發生了什麼。

重要的除錯技巧

以下是有關 Servlet 除錯的一些更多除錯技巧 -

  • 請記住,server_root/classes 不會重新載入,而 server_root/servlets 可能會重新載入。

  • 要求瀏覽器顯示其正在顯示的頁面的原始內容。這可以幫助識別格式問題。它通常是“檢視”選單下的一個選項。

  • 確保瀏覽器沒有快取先前請求的輸出,方法是強制完全重新載入頁面。使用 Netscape Navigator,使用 Shift-Reload;使用 Internet Explorer,使用 Shift-Refresh。

  • 驗證您的 Servlet 的 init() 方法是否採用 ServletConfig 引數並立即呼叫 super.init(config)。

廣告

© . All rights reserved.