English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet デバッグ

テスト/Servletのデバッグは、開発プロセス中に常に難しいポイントです。Servletは通常、多くのクライアントを含みます。/サーバーとのインタラクションでは、再現が難しいが発生する可能性のあるエラーが発生する場合があります。

以下に、デバッグを助けるためのヒントとアドバイスがあります。

System.out.println()

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

  • SystemオブジェクトはJavaの核心オブジェクトの一部であり、追加のクラスをインストールしなくてもどこでも使用できます。これには、Servlet、JSP、RMI、EJB's、一般的なBeans、クラス、および独立したアプリケーションが含まれます。

  • バウンスポイントで停止することとは異なり、System.outに書き込むことはアプリケーションの正常な実行フローに影響を与えず、時序が非常に重要な場合に特に価値があります。

以下は System.out.println() の文法です:

System.out.println("デバッグメッセージ");

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

メッセージログ

適切なログ記録方法を使用して、すべてのデバッグ、警告、およびエラーメッセージを記録することは非常に良いアイデアであり、推奨されます log4J すべてのメッセージを記録します。

Servlet 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;charset=UTF-8");
      java.io.PrintWriter out = response.getWriter( );
      String title = "Context Log";
      String docType = "<!DOCTYPE html> \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 デバッガーを使用して

Servlet をデバッグするために、applet やアプリケーションをデバッグする jdb コマンドを使用できます。

Servlet をデバッグするために、sun.servlet.http.HttpServer をデバッグし、それを HttpServer がブラウザからの HTTP リクエストに応じて Servlet を実行するとして見ることができます。これは applet 小プログラムのデバッグと非常に似ています。applet のデバッグとは異なり、実際にデバッグされるプログラムは sun.applet.AppletViewer です。

大多数のデバッガーは、applet のデバッグの詳細を自動的に隠します。同様に、servletの場合、デバッガーに対して以下の操作を行わなければなりません:

  • デバッガーのクラスパス classpath を設定して、それが sun.servlet.http.Http-Server と関連するクラス。

  • デバッガーのクラスパス classpath を設定して、それが servlet とサポートするクラスを見つけることができます。通常、server_root/servlets と server_root/classes 内に配置されます。

通常、server_root/servlets がクラスパス classpath に存在する場合、それにより servlet のリロードが無効化されます。しかし、このインクルードルールはデバッグには非常に有用です。デバッガーは、HttpServer 内のカスタム Servlet ローダーが Servlet を読み込む前に、Servlet にバグポイントを設定することができます。

もし正しいクラスパス classpath が設定されている場合、sun.servlet.http.HttpServer のデバッグを開始できます。デバッグしたい Servlet コードにバグポイントを設定し、指定された Servlet(http:)を通じて Web ブラウザを使用してデバッグできます。//localhost:8080/servlet/ServletToDebug)向 HttpServer 発出リクエスト。プログラムの実行がバグポイントに到達すると、プログラムが停止します。

コメントを使用する

コードのコメントはさまざまな方法でデバッグを助けます。コメントはデバッグプロセスのさまざまな方法で使用できます。

このServletはJavaコメントと単行コメント(//...)(多行コメント(/* ...*/)を使用して、一時的に一部のJavaコードを削除できます。バグが消えた場合、コメントアウトしたコードを慎重に確認し、問題の原因を見つけ出してください。

クライアントおよびサーバーヘッダー情報

Servletが期待通りに動作しない場合、元のHTTPリクエストとレスポンスを確認することは非常に有益です。HTTP構造に詳しい場合は、リクエストとレスポンスを読み、これらのヘッダー情報が何かを確認できます。

重要なデバッグヒント

以下にServletデバッグのヒントをいくつか列挙します:

  • 注意してください、server_root/classesはリロードされませんが、server_root/servletが。

  • ブラウザが表示しているページのオリジナルコンテンツを表示するように要求します。これはフォーマットの問題を特定するのに役立ちます。これは通常「ビュー」メニューのオプションの1つです。

  • 完全にページを再読み込みすることで、ブラウザが前回のリクエストの出力をキャッシュしていないことを確認します。Netscape NavigatorではShiftを使用してください。-リロード、Internet ExplorerではShiftを使用してください。-リフレッシュ。

  • Servletのinit()メソッドがServletConfigパラメータを受け取り、super.init(config)を呼び出すことを確認してください。