Servlets-debugging
サーブレット-デバッグ
サーブレットのテスト/デバッグは常に困難です。 サーブレットは、大量のクライアント/サーバー相互作用を伴う傾向があり、エラーを発生させる可能性がありますが、再現するのは困難です。
デバッグに役立つヒントと提案を次に示します。
System.out.println()
System.out.println()は、特定のコードが実行されているかどうかをテストするマーカーとして簡単に使用できます。 変数値も出力できます。 さらに-
- SystemオブジェクトはコアJavaオブジェクトの一部であるため、追加のクラスをインストールすることなくどこでも使用できます。 これには、サーブレット、JSP、RMI、EJB、通常のBeanおよびクラス、およびスタンドアロンアプリケーションが含まれます。
- ブレークポイントで停止する手法は、通常の実行を停止するため、時間がかかります。 一方、System.outへの書き込みは、アプリケーションの通常の実行フローをあまり妨げないため、タイミングが重要な場合に非常に役立ちます。
System.out.println()を使用するための構文は次のとおりです-
System.out.println("Debugging message");
上記の構文で生成されたすべてのメッセージは、Webサーバーのログファイルに記録されます。
メッセージロギング
適切なログ方法を使用して、標準のログ方法を使用してすべてのデバッグ、警告、エラーメッセージをログに記録することは常に素晴らしい考えです。 link:/log4j/index [log4J]を使用して、すべてのメッセージをログに記録します。
サーブレット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は、テキストメッセージをサーブレットコンテナのログファイルに記録します。 Tomcatでは、これらのログは<Tomcat-installation-directory>/logsにあります。
ログファイルは、新たに発生したバグや問題の頻度を示しています。 そのため、通常は発生しない例外のcatch句でlog()関数を使用することをお勧めします。
JDBデバッガーの使用
アプレットまたはアプリケーションのデバッグに使用するのと同じjdbコマンドを使用して、サーブレットをデバッグできます。
サーブレットをデバッグするには、sun.servlet.http.HttpServerをデバッグし、HttpServerがブラウザーからのHTTP要求に応じてサーブレットを実行するのを注意深く監視します。 これは、アプレットのデバッグ方法と非常によく似ています。 違いは、アプレットの場合、デバッグされる実際のプログラムはsun.applet.AppletViewerです。
ほとんどのデバッガーは、アプレットのデバッグ方法を自動的に認識することにより、この詳細を隠します。 サーブレットに対して同じことが行われるまで、次のことを行うことでデバッガを支援する必要があります-
- デバッガのクラスパスを設定して、sun.servlet.http.Http-Serverおよび関連するクラスを検索できるようにします。 *デバッガーのクラスパスを設定して、サーブレットとサポートクラス(通常はserver_root/servletsおよびserver_root/classes)も検索できるようにします。
通常、サーブレットのリロードを無効にするため、クラスパスにserver_root/servletsは必要ありません。 ただし、このインクルードはデバッグには役立ちます。 これにより、HttpServerのカスタムサーブレットローダーがサーブレットをロードする前に、デバッガーがサーブレットにブレークポイントを設定できます。
適切なクラスパスを設定したら、sun.servlet.http.HttpServerのデバッグを開始します。 デバッグしたいサーブレットにブレークポイントを設定してから、Webブラウザーを使用して、指定されたサーブレット(http://localhost:8080/servlet/ServletToDebug)のHttpServerに要求を行うことができます。 ブレークポイントで実行が停止しているのが見えるはずです。
コメントを使用する
コード内のコメントは、さまざまな方法でデバッグプロセスに役立ちます。 コメントは、デバッグプロセスで他の多くの方法で使用できます。
サーブレットは、Javaコメントと単一行(//…)および複数行(/* … */)コメントを使用して、Javaコードの一部を一時的に削除できます。 バグが消えたら、コメントしたコードを詳しく調べて問題を見つけてください。
クライアントとサーバーのヘッダー
サーブレットが期待どおりに動作しない場合、生のHTTPリクエストとレスポンスを確認すると便利な場合があります。 HTTPの構造に精通している場合は、リクエストとレスポンスを読んで、それらのヘッダーで何が起こっているかを正確に確認できます。
重要なデバッグのヒント
以下は、サーブレットのデバッグに関するいくつかのデバッグのヒントのリストです-
- server_root/classesはリロードせず、server_root/servletsはおそらくリロードすることを忘れないでください。
- ブラウザに、表示しているページの生のコンテンツを表示するように依頼します。 これは、フォーマットの問題を特定するのに役立ちます。 通常は、[表示]メニューのオプションです。
- ページの完全なリロードを強制することにより、ブラウザが以前のリクエストの出力をキャッシュしていないことを確認してください。 Netscape Navigatorでは、Shift-Reloadを使用します。 Internet ExplorerではShift-Refreshを使用します。
- サーブレットのinit()メソッドがServletConfigパラメータを受け取り、すぐにsuper.init(config)を呼び出すことを確認します。