サーブレットのデバッグ


サーブレットのテスト/デバッグは、開発と使用のプロセスにおいて常に難しい点です。サーブレットには多くのクライアント/サーバー対話が含まれることが多く、エラーが発生する可能性がありますが、再現は困難です。

デバッグに役立つヒントと提案をいくつか紹介します。

System.out.println()

System.out.println() は、特定のコード部分が実行されるかどうかをテストするマーカーとして使用されます。変数の値を出力することもできます。さらに:

  • System オブジェクトはコア Java オブジェクトの一部であるため、追加のクラスをインストールすることなくどこでも使用できます。これには、サーブレット、JSP、RMI、EJB、プレーン Bean およびクラス、およびスタンドアロン アプリケーションが含まれます。

  • ブレークポイントで停止するのとは異なり、System.out への書き込みはアプリケーションの通常の実行フローを妨げないため、タイミングが重要な場合に特に役立ちます。

System.out.println() を使用するための構文は次のとおりです。

System.out.println("Debugging message");

上記の構文によって生成されたすべてのメッセージは、Web サーバーのログ ファイルに記録されます。

メッセージ ログ

すべてのデバッグ、警告、エラー メッセージを記録するには、適切なログ方法を使用することをお勧めします。すべてのメッセージを記録するには、log4J を使用することをお勧めします。

サーブレット 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");
      // 调用两个 ServletContext.log 方法
      ServletContext context = getServletContext( );

      if (par == null || par.equals(""))
      // 通过 Throwable 参数记录版本
      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 は、テキスト メッセージをサーブレット コンテナのログ ファイルに記録します。 Tomcat の場合、これらのログは <Tomcat-installation-directory>/logs ディレクトリにあります。

これらのログ ファイルは、新しいエラーや問題の頻度を示します。このため、通常は発生しない例外の catch 節では log() 関数を使用することをお勧めします。

JDB デバッガーの使用

デバッグ アプレットまたはアプリケーションの jdb コマンドを使用してサーブレットをデバッグできます。

サーブレットをデバッグするには、sun.servlet.http.HttpServer をデバッグし、ブラウザ側で HTTP リクエストに応答するサーブレットを実行する HttpServer とみなします。これはアプレットのデバッグに非常に似ています。アプレットのデバッグとは異なり、デバッグされる実際のプログラムは sun.applet.AppletViewer です。

ほとんどのデバッガーは、アプレットのデバッグ方法の詳細を自動的に非表示にします。同様に、サーブレットの場合は、デバッガーに対して次のことを実行する必要があります:

  • sun.servlet.http.Http-Server および関連クラスを見つけられるように、デバッガーのクラスパスを設定します。

  • デバッガーのクラスパスを設定して、サーブレットとサポート クラス (通常はserver_root/servlets およびserver_root/classes) を見つけられるようにします。

通常、クラスパスにserver_root/servletsを含める必要はありません。サーブレットのリロードが無効になるためです。ただし、この包含ルールはデバッグに非常に役立ちます。これにより、HttpServer のカスタム サーブレット ローダーによってサーブレットがロードされる前に、デバッガーがサーブレットにブレークポイントを設定できるようになります。

正しいクラスパスを設定している場合は、sun.servlet.http.HttpServer のデバッグを開始できます。デバッグするサーブレット コードにブレークポイントを設定し、指定されたサーブレット (http://localhost:8080/servlet/ServletToDebug) を使用して Web ブラウザ経由で HttpServer にリクエストを送信できます。プログラムの実行がブレークポイントで停止することがわかります。

コメントを使用する

コード内のコメントは、さまざまな方法でデバッグに役立ちます。コメントは、プロセスをデバッグするために他のさまざまな方法で使用できます。

このサーブレットは Java コメントと単一行コメント (//...) を使用します。複数行コメント (/* ...*/) を使用して Java コードの一部を一時的に削除できます。バグが解消された場合は、コメントしたばかりのコードを詳しく見て、問題がどこにあるのかを見つけてください。

クライアント側ヘッダーとサーバー側ヘッダー

サーブレットが期待どおりに動作しない場合、生の HTTP リクエストとレスポンスを表示すると便利な場合があります。 HTTP 構造に精通している場合は、リクエストとレスポンスを読んで、これらのヘッダーが何であるかを確認できます。

重要なデバッグのヒント

以下にサーブレットのデバッグに関するヒントをいくつか示します:

  • server_root/classes はオーバーロードされないが、server_root/servlets はオーバーロードされる可能性があることに注意してください。

  • ブラウザが表示するページの元のコンテンツを表示する必要があります。これは、書式設定の問題を特定するのに役立ちます。通常、これは [表示] メニューのオプションです。

  • ページの完全なリロードを強制することで、ブラウザが前のリクエストの出力をキャッシュしていないことを確認します。 Netscape Navigator では Shift-Reload を使用し、Internet Explorer では Shift-Refresh を使用します。

  • サーブレットの init() メソッドが ServletConfig パラメータを受け入れ、super.init(config) を呼び出していることを確認してください。