Revised: 25th/Nov./2002
前節でウェブ・アプリケーションの標準的な配備方法を紹介しました。本節では Tomcat 4.1.12 を例にとり、配備の手順をサンプルで見てみます。配備方法には、前節の手順を含めて、次の四種類が考えられます。
以下にそれぞれの場合の配備方法を紹介します。ここでは、 Tomcat がインストールされているディレクトリを $CATALINA_HOME と表記します。Tomcat 4.1.12 のインストールディレクトリは、デフォルトでは C:\Program Files\Apache Group\Tomcat 4.1 になります。別のディレクトリにインストールした場合は、適宜読み替えてください。
Tomcat 4.1.12 で動作を試してみたいときに実施する最初の一歩はこの方法になります。
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// 送信文字コードのセット
res.setContentType("text/html; charset=Shift_JIS");
// 出力ストリームの取得
PrintWriter out = res.getWriter();
String title = "Hello World!";
Date date = new Date();
// 出力ストリームへの書き込み
out.println("<html lang=\"ja\">");
out.println("<head><title>" + title + "</title></head>");
out.println("<body>");
out.println("<h1>" + title + "</h1>");
out.println("<p>現在時刻:" + date + "</p>");
out.println("</body></html>");
// 出力ストリームのクローズ
out.close();
}
}
コンパイルのコマンドは次のようになります。$CATALINA_HOMEがC:\Program Files\Apache Group\Tomcat 4.1である例です。別のディレクトリにインストールした場合は適宜読み替えてください。
C:\>cd "C:\Program Files\Apache Group\Tomcat 4.1\webapps\dep1\WEB-INF\classes" C:\Program Files\Apache Group\Tomcat 4.1\webapps\dep1\WEB-INF\classes>javac -cla sspath "C:\Program Files\Apache Group\Tomcat 4.1\common\lib\servlet.jar" HelloWo rld.java C:\Program Files\Apache Group\Tomcat 4.1\webapps\dep1\WEB-INF\classes>コマンド中の改行は厳禁です。上では便宜上改行しています。
<?xml version="1.0" encoding="Shift_JIS"?>
<!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>SvltName</servlet-name> <!-- 任意のサーブレット名 -->
<servlet-class>HelloWorld</servlet-class> <!-- サーブレットクラス -->
</servlet>
<servlet-mapping>
<servlet-name>SvltName</servlet-name>
<url-pattern>/sample/Welcome</url-pattern> <!-- 任意のアクセス・パス -->
</servlet-mapping>
</web-app>
前節で紹介した方法です。配布を目的としたウェブ・アプリケーション・アーカイブ (WAR: Web Application Archive) にしないで、ディレクトリ階層にクラスファイルを個別に追加していく場合は、この配備方法が最も標準的なものになります。
<!-- Tomcat Root Context -->
<!--
<Context path="" docBase="ROOT" debug="0"/>
-->
この行の次の行に、次のコードを挿入する。
<!-- My Context Root: C:\java\DocRoot as /webAppl -->
<Context path="/dep2" docBase="C:/java/dep2" debug="0"
reloadable="true" crossContext="true" />
上では、一つのクラス名 HelloWorld に名前をつけて、その名前を通して URL パターンにマッピングしました。ここでは、任意のクラス名を URL パターンにマッピングしてみましょう。そのためにはワイルドカード * を使うだけと簡単です。
<?xml version="1.0" encoding="Shift_JIS"?>
<!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-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/apps/*</url-pattern>
</servlet-mapping>
</web-app>
<!-- Tomcat Root Context -->
<!--
<Context path="" docBase="ROOT" debug="0"/>
-->
この行の次の行に、次のコードを挿入する。
<!-- My Context Root: C:\java\DocRoot as /webAppl -->
<Context path="/dep3" docBase="C:/java/dep3" debug="0"
reloadable="true" crossContext="true" />
この例では、ビルトイン・サーブレットである invoker を使って、当該ドキュメント・ルート配下の/WEB-INF/classes 配下の任意のクラス * が、コンテキストパス配下の /apps/* でアクセスできるように設定しています。こうすればいちいちのサーブレットの名前を考えなくても良くなるわけです。
最後に、推奨できない方法を紹介します。なぜ推奨しない手順を紹介するかというと、 Tomcat 4.1.12 より古いバージョンでは、最初の一歩としてアナウンスされていたものが、セキュリティーを配慮したアップデートである Tomcat 4.1.12 からデフォルトでは利用できなくなったという経緯があるからです。
<!-- Tomcat Root Context -->
<!--
<Context path="" docBase="ROOT" debug="0"/>
-->
この行の次の行に、次のコードを挿入する。
<!-- My Context Root: C:\java\DocRoot as /webAppl -->
<Context path="/dep4" docBase="C:/java/dep4" debug="0"
reloadable="true" crossContext="true" />
<!--
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
-->
コメントアウトされているのでコメントのコード(<!-- と -->)を削除する
$CATALINA_HOME/conf/web.xmlは個々のアプリケーションのデスクリプタのデフォルトの振る舞いを定義します。したがって、ドキュメント・ルート配下の /WEB-INF/web.xml に記述する invoker を、$CATALINA/conf/web.xml に記述しても動作するわけで、全てのウェブ・アプリケーションに適用されることになるわけです。
便利なようですが、セキュリティ問題でコメントアウトされるに至ったことを念頭においてください。Invoker に関するドキュメントは Jakarta で公開されています。