サーブレットのデバッグ
Javaアプリケーションの場合、コンソールから状況を確認できまるので、Eclipseの機能を用いなくてもある程度のデバッグが可能です。しかし、サーブレットの場合、コンテナによってサーバ上で動作するため、デバッグが難しくなります。この問題に対しても、Eclipseの機能を利用すれば、サーブレットもJavaアプリケーションと同様にデバッグできるので、ぜひ活用したいところです。
では、先ほど用いたHelloFunc
クラスを呼び出すサーブレットを例にとって、これらの機能を利用してみましょう。第4回で作成したhellowebプロジェクトの中のhellotestパッケージを用います。この回から試す方は、第4回「Eclipse 3.4でのアプリケーション開発方法(swing/JSP/サーブレット)」を参照のうえ、次の作業を行ってください。
- Tomcatのインストール
- Tomcat Launcherプラグインのインストール
- Tomcat Launcherプラグインの設定
- Tomcatプロジェクト「helloweb」を作成
- パッケージ名「hellotest」のサーブレット「DispRandom」を作成
- デプロイ記述「web.xml」を作成
そして、下記のとおりにHelloFunc
クラスをhellotest
パッケージにコピーして、HelloDebug
クラスと同様の動作をするサーブレットをHelloDebugServlet
クラスとして作成します。また、このサーブレット用のデプロイ記述を加えます。
// HelloFuncクラス(HelloFunc.java) package hellotest; public class HelloFunc { // 整数の配列を受け取って、その総和を返す int sumArray(int[] p){ for(int i = 1; i < p.length; i++){ p[0] += p[i]; // 各要素の値を足しこむ } return p[0]; // 総和を返す } }
// HelloDebugServletクラス(HelloDebugServlet.java) package hellotest; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.IOException; public class HelloDebugServlet extends HttpServlet { static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { int[] i = {1, 2, 3}; // テスト用の配列 int ans; // 総和を受け取る変数 // 総和を求める関数を呼ぶ ans = new HelloFunc().sumArray(i); // 1+2+3=6が表示される res.getWriter().println("1+2+3=" + ans); // 1+2+4を試すため3を4に変更 i[2] = 4; // 総和を求める関数を呼ぶ ans = new HelloFunc().sumArray(i); // 1+2+4=7が表示されるはずが… res.getWriter().println("1+2+4=" + ans); } }
<?xml version="1.0" encoding="Windows-31J"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>DispRandom</servlet-name> <servlet-class>hellotest.DispRandom</servlet-class> </servlet> <servlet-mapping> <servlet-name>DispRandom</servlet-name> <url-pattern>/DispRandom</url-pattern> </servlet-mapping> <servlet> <servlet-name>HelloDebugServlet</servlet-name> <servlet-class>hellotest.HelloDebugServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloDebugServlet</servlet-name> <url-pattern>/HelloDebugServlet</url-pattern> </servlet-mapping> </web-app>
以上を作成・配置してTomcatを起動し、内部ブラウザから「http://localhost:8080/helloweb/HelloDebugServlet」を呼び出すと、Javaアプリケーションの場合と同様に誤まった結果が表示されてしまいます。
では、デバッグ機能を使ってみましょう。
ブレークポイントの設定とデバッグモードへの移行
Javaアプリケーションの場合と同様にsumArray(int[])
メソッドを呼び出している2つの行に、ブレークポイントを設定します。しかし、サーブレットのデバッグでは、[デバッグアイコン]をクリックする必要はありません。内部ブラウザから呼び出すだけでデバッグモードに入ります。
Javaアプリケーションの場合と同様にパースペクティブが「デバッグ」に切り替わり、デバッグビューと変数/ブレークポイントビューが表示されます。この後の手順はJavaアプリケーションの場合と変わりませんが、サーブレットからブラウザへの出力を確認するために、メニューの[ウィンドウ(W)]-[ビューの表示(V)]-[その他(O)]から内部Webブラウザを開くと便利でしょう。ただし、サーブレットの特性上、プログラムの出力が表示に反映するのはdoGet
メソッドの終了後になります。
なお、この手順は「Tomcat Launcherプラグイン」がTomcatを自動的にデバッグモードで起動してくれることに依存しています。そのため、デバッグを強制終了した場合などの次回デバッグ時に、デバッグモードにならないことがあります。その時は、[Tomcat再起動ボタン]をクリックして、Tomcatを起動しなおすと解決します。