サーブレットのデバッグ
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を起動しなおすと解決します。


