JSP またはサーブレット プログラムのテスト/デバッグは常に困難です。 JSP およびサーブレット プログラムはクライアント/サーバーの対話を多く含む傾向があるため、エラーが発生する可能性が非常に高く、エラー環境を再現するのは困難です。
次に、プログラムのデバッグに役立つヒントと提案をいくつか紹介します。
System.out.println() は、コードの一部が実行されたかどうかを簡単にマークできます。もちろん、さまざまな値を出力することもできます。また:
System オブジェクトはコア Java オブジェクトになったため、追加のクラスを導入することなくどこでも使用できます。使用範囲には、サーブレット、JSP、RMI、EJB、Bean、クラス、スタンドアロン アプリケーションが含まれます。
ブレークポイントで実行を停止する場合と比較して、System.out を使用して出力することは、アプリケーションの実行プロセスに大きな影響を与えません。この機能は、タイミング メカニズムが非常に重要なアプリケーションで非常に役立ちます。
System.out.println() を使用するための構文を次に示します。
System.out.println("デバッグメッセージ");System.out.print() を使用した簡単な例を次に示します。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head><title>System.out.println</title></ head><body><c:forEach var="counter" begin="1" end="10" step="1" > <c:out value="${counter-5}"/></br> <% System.out.println( "counter= " + pageContext.findAttribute("counter") ); %></c:forEach></body></html>ここで、上記の例を実行すると、次の結果が生成されます。
-4-3-2-1012345Tomcat サーバーを使用している場合は、logs ディレクトリの stdout.log ファイルに次の追加コンテンツを見つけることができます。
カウンタ=1カウンタ=2カウンタ=3カウンタ=4カウンタ=5カウンタ=6カウンタ=7カウンタ=8カウンタ=9カウンタ=10この方法を使用すると、変数やその他の情報をシステム ログに出力して、分析し、問題の根本的な原因を見つけることができます。
J2SE ロギング フレームワークは、JVM で実行されているすべてのクラスにロギング サービスを提供します。したがって、このフレームワークを使用してあらゆる情報を記録できます。
JDK でロガー API を使用するように上記のコードを書き直してみましょう。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page import="java.util.logging.Logger" %><html> <head><title>Logger.info</title></head><body><% Logger logger=Logger.getLogger(this.getClass().getName());%><c:forEach var="counter 」 begin="1" end="10" step="1" > <c:set var="myCount" value="${counter-5}" /> <c:out value="${myCount}"/ ></br> <% String message = "counter=" + pageContext.findAttribute("counter") + " myCount=" + pageContext.findAttribute("myCount"); %></c :forEach></body></html>結果は前の結果と似ていますが、stdout.log ファイルに追加情報が出力される場合があります。ここでは、ロガーの info メソッドを使用します。以下に、stdout.log ファイルのスナップショットを示します。
24-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=1 myCount=-424-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=2 myCount=- 324-9-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=3 myCount=-224-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=4 myCount=-124-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=5 myCount=024-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=6 myCount=124-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter= 7myCount=224-2013 年 9 月23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=8 myCount=324-Sep-2013 23:31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=9 myCount=424-Sep-2013 23: 31:31 org.apache.jsp.main_jsp _jspServiceINFO: counter=10 myCount=5メッセージは、sever()、warning()、info()、config()、fine()、finer()、およびfinest()メソッドを使用して、さまざまな優先順位で送信できます。 finest() メソッドは最良の情報を記録するために使用され、sever() メソッドは最も重要な情報を記録するために使用されます。
Log4J フレームワークを使用して、重大度と重要性に基づいて分類されたさまざまなファイルにメッセージを記録します。
NetBeans は、ツリー構造であり、独立した Java アプリケーションやネットワーク アプリケーションの開発をサポートし、JSP デバッグもサポートするオープンソースの Java 総合開発環境です。
NetBeans は、次の基本的なデバッグ機能をサポートしています。
ブレークポイント
シングルステップ追跡
観測点
詳細については、NetBeans マニュアルを参照してください。
JSP およびサーブレットで jdb コマンドを使用して、通常のアプリケーションと同様にデバッグできます。
通常、sun.servlet.http.HttpServer オブジェクトを直接デバッグして、HTTP リクエストに応答して HttpServer がどのように JSP/サーブレットを実行するかを確認します。これはアプレットのデバッグに非常に似ています。違いは、アプレット プログラムが実際にデバッグするのは sun.applet.AppletViewer であることです。
ほとんどのデバッガは、アプレットのデバッグ方法を知っているため、アプレットをデバッグするときに一部の詳細を自動的に無視できます。デバッグ オブジェクトを JSP に転送する場合は、次の 2 つのことを行う必要があります。
デバッガのクラスパスを設定して、sun.servlet.http.Http-Server および関連クラスを見つけられるようにします。
デバッガーのクラスパスを設定して、JSP ファイルと関連クラスを見つけられるようにします。
クラスパスを設定したら、sun.servlet.http.Http-Server のデバッグを開始します。 JSP ファイル内の任意の場所にブレークポイントを設定し、ブラウザを使用してサーバーにリクエストを送信すると、プログラムがブレークポイントで停止することがわかります。
プログラム内のコメントは、プログラムのデバッグにおいてさまざまな方法で一定の役割を果たします。コメントはプログラムのデバッグのさまざまな側面で使用できます。
JSP は Java アノテーションを使用します。バグが消えた場合は、コメントしたばかりのコードを詳しく調べてください。通常、その理由がわかります。
JSP が意図したとおりに動作しないときに、生の HTTP リクエストとレスポンスを表示すると便利な場合があります。 HTTP の構造に精通している場合は、リクエストとレスポンスを直接観察して、これらのヘッダー モジュールで何が起こっているかを確認できます。
ここでは、JSP をデバッグするためのさらに 2 つのヒントを明らかにします。
ブラウザを使用して元のページのコンテンツを表示し、形式に問題があるかどうかを判断します。このオプションは通常、[表示] メニューの下にあります。
ページを強制的にリロードするときに、ブラウザが以前のリクエスト出力をキャプチャしないようにしてください。 Netscape Navigator ブラウザを使用している場合は、Shift-Reload を使用し、IE ブラウザを使用している場合は、Shift-Refresh を使用します。