Tomcat 4 の設定 (JK2編 おまけ:Struts)

Apache 2 を使って Tomcat の設定をしたくなったのでちょっとまとめてみます。なぜか、Apache-Tomcat のコネクタのトレンドがいろいろ変わるので毎回新しくなってしまいます。ということで今回はJK2 になります。だんだん設定が楽になっていくので良いのですが...

いつも Linux をもとに説明しているので今回は、Solaris 8 x86 を使用します。必要なすべてのモジュールが /usr/local/src にダウンロードされているものとして説明をします。また、ほとんどのモジュールを /usr/local にインストールします。

gcc, make, perl, m4, autoconf, libtool 等の開発環境を http://www.sunfreeware.com/ からダウンロードして Solaris にインストールしておいてください。gcc 以外は、バイナリーがない場合でも GNU のサイトからソースを入手して簡単に作ることができます。 (ソースを展開したディレクトリーで ./configure;make;make install を実行すると /usr/local/bin にインストールされます)

# はプロンプトで、スーパーユーザー(root) での作業であることを意味します。


Java 2 Platform (SDK)

Solaris 8 x86 2/02 にインストールされている SDK はバージョンが 1.2.2 だったので新しい SDK を入手しインストールします。わざわざ新しいものを入手しなくても問題はないと思います。
Java(TM) 2 Platform, Standard Edition より J2SE 1.4.2 SDK をダウンロードします(ここでは、 NetBeans IDE無しの Solaris x86 self-extracting file版を使用)。

    # cd /usr/local
    # gzip -dc src/j2sdk-1_4_2_01-solaris-i586.sh
                               Sun Microsystems, Inc.
                            Binary Code License Agreement
 
                                       for the
 
    JAVATM 2 SOFTWARE DEVELOPMENT KIT (J2SDK), STANDARD EDITION, VERSION 1.4.2_X
     ...
    Do you agree to the above license terms? [yes or no] 
    yes
    Unpacking...
    Checksumming...
     ...
    Done.
    # 

/usr/local/j2sdk-1.4.2_01 というディレクトリーの下に JDK が展開されます。利用するシェルに応じた形式で、 JAVA_HOME, CLASSPATH, PATH 環境変数を設定します。

  sh, bash 系の場合:.profile, .bashrc に登録しておくと良い
    JAVA_HOME=/usr/local/j2sdk1.4.2_01
    CLASSPATH=.:$JAVA_HOME/lib/tools.jar
    PATH=$PATH:$JAVA_HOME/bin
    export JAVA_HOME PATH
 
  csh 系の場合:.cshrc に登録しておくと良い
    setenv JAVA_HOME /usr/local/j2sdk1.4.2_01
    setenv CLASSPATH .:$JAVA_HOME/lib/tools.jar
    set path=($path $JAVA_HOME/bin)
 
  動作チェック:
    # java -version
    java version "1.4.2_01"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_01-b06)
    Java HotSpot(TM) Client VM (build 1.4.2_01-b06, mixed mode)
    # 

Apache 2.0 + Tomcat 4.1

バイナリーおよびソースを入手します。ここでは、ドキュメントを記述する時点で最新のものを利用していますが、実際に利用する場合にはセキュリティ上問題のないものを入手するようにしてください。また、提供されているソースなどが改ざんされていないことを確かめる上で PGP や MD5 による署名を確認しておくと良いでしょう。

Apache2 (HTTP Server) http://httpd.apache.org/download.cgi
Tomcat 4 (Servlet 2.3/JSP 1.2) http://jakarta.apache.org/tomcat/

tomcat-4.1.27.tar.gz
jakarta-tomcat-connectors-jk2-2.0.2-src.tar.gz

HTTP サーバーであるApache 2.0 のインストール

DSO(Dynamic Shared Object) をサポートするように設定します。インストール後、-l コマンドラインオプションで mod_so.c が有効になっていることを確認してみます(通常、ここまでテストしなくても良いですが...)。

    # gzip -dc httpd-2.0.47.tar.gz | tar xf -
    # cd httpd-2.0.47
    #  ./configure --enable-so
    checking for chosen layout... Apache
    checking for working mkdir -p... yes
    ...
    # make
    # make install
    # /usr/local/apache2/bin/httpd -l
    Compiled in modules:
      core.c
      mod_access.c
      mod_auth.c
      mod_include.c
      mod_log_config.c
      mod_env.c
      mod_setenvif.c
      prefork.c
      http_core.c
      mod_mime.c
      mod_status.c
      mod_autoindex.c
      mod_asis.c
      mod_cgi.c
      mod_negotiation.c
      mod_dir.c
      mod_imap.c
      mod_actions.c
      mod_userdir.c
      mod_alias.c
      mod_so.c
    #

Apache の設定ファイルである /usr/local/apache2/conf/httpd.conf をチェックします。Solars で既に HTTP サーバーが起動している場合、それを停止するか、新しくインストールした Apache の ポートを変更(たとえば 8080、ただし Tomcat でデフォルトで設定されているポートがあるので注意が必要)する。特に Listen, User, Group, ServerName といったディレクティブはチェックしてください。

ディレクティブ 説明
Listen httpd (HTTPサーバー) が、監視するポートを指定します。
User httpd (HTTPサーバー)を起動するときのオーナーを指定します。
Group httpd (HTTPサーバー)を起動するときの group を指定します。#-1 に設定されていてうまく動作しないときがあるので、nobody など実際に許可を与えたいグループに設定する。
ServerName httpd (HTTPサーバー)を起動するホストとポートを指定します。DNS に登録されていない場合、IP Address を指定します。

また、デフォルトの charset が ISO-8859-1 なので自分の作った各ページに charset をきちんと書いていないと文字化けすることがあります。日本語がメインのサイトならば、以下の設定にすると良い。

# edit /usr/local/apache2/conf/httpd.conf
# DefaultLanguage nl
# デフォルト言語を ja にする
DefaultLanguage ja
 
#LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw
# リストのオーダーを ja を先頭にする
LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
 
# AddDefaultCharset ISO-8859-1 コメントアウト
# AddDefaultCharset EUC-JP   または、ISO-2022-JP, EUC-JP, shift_jis に設定

設定が終わったら、チェックします。

    # /usr/local/apache2/bin/apachectl configtest
    Syntax OK
    # 

実際に動かして、起動するかも確認しましょう。動作確認が終わったら、終了させておきます。

    # /usr/local/apache2/bin/apachectl start
    # ps -ef
       ...
        root 28597     1  0 03:45:25 ?        0:01 /usr/local/apache2/bin/httpd -k start
      nobody 28600 28597  0 03:45:26 ?        0:00 /usr/local/apache2/bin/httpd -k start
       ...
    # /usr/local/apache2/bin/apachectl stop

ブラウザーからアクセスしたりプロセスを確認したときに、httpd が起動されていなかった場合、/usr/local/apache2/logs/error_log の内容をチェックしてエラーの原因を解決してください。

Servlet/JSPコンテナーである Tomcat のインストール

必要なものが揃っているバイナリ版(jakarta-tomcat-4.1.27.tar.gz)をインストールします。Pure Java なコードなのでバイナリーがどのマシンでも動作します...ここでは説明しませんが、もしソースから作る場合、多くのアーカイブが必要になります。ソースパッケージに含まれるBUILDING.txt を参照してください(ANTを利用してコンパイル)。また、展開するための tar コマンドですが、GNU Tar でないとうまく展開できない可能性があります。

    # cd /usr/local
    # gzip -dc src/tomcat-4.1.27.tar.gz | tar xpf -
  sh, bash 系の場合:.profile, .bashrc に登録しておくと良い
    CATALINA_HOME=/usr/local/jakarta-tomcat-4.1.27
    export CATALINA_HOME
 
  csh 系の場合:.cshrc に登録しておくと良い
    setenv CATALINA_HOME /usr/local/jakarta-tomcat-4.1.27

ApacheとTomcatを連携させるためのコネクタのインストール

発展せずに終わってしまった WEBARP は気にせず、JK2をインストールします。相変わらず、コネクタのバイナリーが用意されていないのでソース(jakarta-tomcat-connectors-jk2-2.0.2-src.tar.gz)から作ります。また、GNU make を使用しないとうまくコンパイルできません。(ここでは gmake と表記しています)

    # cd /usr/local/src
    # gzip -dc jakarta-tomcat-connectors-jk2-2.0.2-src.tar.gz | tar xf -
    # cd jakarta-tomcat-connectors-jk2-2.0.2-src/jk/native2
    # ./configure --with-apxs2=/usr/local/apache2/bin/apxs
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    ...
    config.status: creating ../build.properties
    config.status: creating scripts/build/unix/dummy
    config.status: executing depfiles commands
    # gmake
    # cd ..
    # cp build/jk2/apache2/mod_jk2.so /usr/local/apache2/modules/
    # cp build/jk2/apache2/jkjni.so /usr/local/apache2/modules/

ワーカーの設定は、 conf/workers2.properties ファイルをそのまま /usr/local/apache2/conf にコピーしても良いのですが動作させる上で最小限の設定を新たに設定します。

    # edit /usr/local/apache2/conf/workers2.properties
# ログファイルの設定
[logger.file:0]
level=ERROR
file=${serverRoot}/logs/jk2.log
 
# 通信チャンネルの定義
[channel.socket:localhost:8009]
info=Ajp13 forwarding over socket
tomcatId=localhost:8009
 
# Tomcat の examples Web アプリケーションを Web サーバ URI 空間にマップ
[uri:/examples/*]
info=Map the whole webapp
 
# ステータス監視ワーカーの設定
[status:]
[uri:/jkstatus/*]
group=status:
 
# 共有メモリー
[shm:]
disabled=1

Apache の設定ファイル httpd.conf に mod_jk2 モジュールをロードする設定を追加します。

    # edit /usr/local/apache2/conf/httpd.conf
      LoadModule jk2_module modules/mod_jk2.so

変更したの設定ファイル httpd.conf をチェックします。

    # /usr/local/apache2/bin/apachectl configtest
    Syntax OK
    # 

Tomcat自身は、HTTPサーバとして使用しないので設定ファイルを変更(コメントアウト)します。

    # cd /usr/local/jakarta-tomcat-4.1.27/conf
    # edit server.xml
    <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->
    <!--
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
               port="8080" minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="100" debug="0" connectionTimeout="20000"
               useURIValidationHack="false" disableUploadTimeout="true" />
    -->

動作させるには、まず、Tomcat を起動してから Apache を起動します。

  Tomcat の起動:
    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh start
    Using CATALINA_BASE:   /usr/local/jakarta-tomcat-4.1.27
    Using CATALINA_HOME:   /usr/local/jakarta-tomcat-4.1.27
    Using CATALINA_TMPDIR: /usr/local/jakarta-tomcat-4.1.27/temp
    Using JAVA_HOME:       /usr/local/j2sdk1.4.2_01
  
  Tomcat の停止:
    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh stop
    Using CATALINA_BASE:   /usr/local/jakarta-tomcat-4.1.27
    Using CATALINA_HOME:   /usr/local/jakarta-tomcat-4.1.27
    Using CATALINA_TMPDIR: /usr/local/jakarta-tomcat-4.1.27/temp
    Using JAVA_HOME:       /usr/local/j2sdk1.4.2_01

最後に Apache を起動して、ブラウザーを使って動作確認をします。

    # /usr/local/apache2/bin/apachectl start

ブラウザーで http://<servername>/examples/jsp/dates/date.jsp にアクセスすることできちんと動作しているか確認できます。

jk

まだ動作確認していないので間違っているかもしれません。

現在の設定では、Apache と Tomcat がソケットを利用して通信します。しかし、JNI を利用することで、TomcatがApacheの内部プロセスとして起動させることができるようになります。

    # edit /usr/local/apache2/conf/workers2.properties
# ログファイルの設定
[logger.file:0]
level=ERROR
file=${serverRoot}/logs/jk2.log
 
[config:]
TOMCAT_HOME=/usr/local/jakarta-tomcat-4.1.27
JAVA_HOME=/usr/local/j2sdk1.4.2_01
 
# 通信チャンネルの定義
[channel.jni:jni]
info=The jni channel, used if tomcat is started inprocess
 
# Java バーチャルマシンのパラメータの定義
[vm:]
info=Parameters used to load a JVM in the server process
OPT=-Djava.class.path=${TOMCAT_HOME}/bin/tomcat-jni.jar;${TOMCAT_HOME}/server/li
b/commons-logging.jar;${JAVA_HOME}/lib/tools.jar
OPT=-Dtomcat.home=${TOMCAT_HOME}
OPT=-Dcatalina.home=${TOMCAT_HOME}
OPT=-Xmx128M
 
# JNI ワーカの起動時ハンドラ
[worker.jni:onStartup]
info=Command to be executed by the VM on startup. This one will start tomcat.
class=org/apache/jk/apr/TomcatStarter
ARG=start
stdout=${serverRoot}/logs/stdout.log
stderr=${serverRoot}/logs/stderr.log
 
# JNI ワーカの終了時ハンドラ
[worker.jni:onShutdown]
info=Command to be executed by the VM on shutdown. This one will stop tomcat.
class=org/apache/jk/apr/TomcatStarter
ARG=stop
 
# Tomcat の examples Web アプリケーションを Web サーバ URI 空間にマップ
[uri:/examples/*]
info=Map the whole webapp
 
# ステータス監視ワーカの設定
[status:]
[uri:/jkstatus/*]
group=status:
 
# 共有メモリ
[shm:]
disabled=1
    # edit /usr/local/jakarta-tomcat-4.1.27/conf/jk2.properties
## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED
## WHEN YOU EDIT THE FILE.
## COMMENTS WILL BE _LOST_
## DOCUMENTATION OF THE FORMAT IN JkMain javadoc.
# Set the desired handler list
handler.list=apr,request,channelJni
#
# Override the default port for the socketChannel
# channelSocket.port=8019
# Default:
# channelUnix.file=${jkHome}/work/jk2.socket
# Just to check if the the config is working
# shm.file=${jkHome}/work/jk2.shm
# In order to enable jni use any channelJni directive
# channelJni.disabled = 0
# And one of the following directives:
# apr.jniModeSo=/opt/apache2/modules/mod_jk2.so
# If set to inprocess the mod_jk2 will Register natives itself
# This will enable the starting of the Tomcat from mod_jk2
apr.jniModeSo=inprocess


各プログラムの起動とシステムへの登録

各ユーザーが設定しておくと便利な環境変数

sh, bash 系の場合
JAVA_HOME=/usr/local/j2sdk1.4.2_01
CATALINA_HOME=/usr/local/jakarta-tomcat-4.1.27
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
export JAVA_HOME CATALINA_HOME PATH
          
csh 系の場合
setenv JAVA_HOME /usr/local/j2sdk1.4.2_01
setenv CATALINA_HOME /usr/local/jakarta-tomcat-4.1.27
set path=($path $JAVA_HOME/bin $CATALINA_HOME/bin)

システム起動時に自動的に Tomcat や Apache を起動させたい場合、/etc/init.d に以下のスクリプトをコピーして /etc/rc2.d でスタートさせるようにする。JNI を利用している場合、Apache のスクリプトのみでよい。

Tomcat
/usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh start
/usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh stop
Apache
/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop


Webアプリケーションの登録

コンパイルした Java のコード(Servlet)を、Web アプリケーションとして利用できるようにするには、決められたディレクトリー構成と幾つかの設定ファイルが必要になります。まず、web.xml にサーブレットを登録することで、WEB-INF/classesの下に置いたServletをマップした名前でアクセス出来るようになります。ここでは、mytest という Webアプリケーションの登録を例に説明します。

【JSPのサンプル】

<%@ page contentType="text/html; charset=EUC-JP" %>
<html><body>
<%
  out.println("<h2>Hello World !!</h2>");
  out.println("<p>JSPのサンプル</p>");
%>
</body></html>

【サーブレットのサンプル】

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
                     throws ServletException, IOException
    {
        PrintWriter out = res.getWriter();
        res.setContentType("text/html; charset=EUC-JP");
        out.println("<html><body>");
        out.println("<h2>Hello World !!</h2>");
        out.println("<p>Servletのサンプル</p>");
        out.println("</body></html>");
        out.close();
    }
}
# javac -classpath /usr/local/jakarta-tomcat-4.1.27/common/lib/servlet.jar \
> HelloServlet.java

【web.xml のサンプル】

<?xml version="1.0" encoding="ISO-8859-1"?>

<!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>HelloWorld</servlet-name> <servlet-class>HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app>

次に、web.xml, HelloServlet.class といったファイルを以下のようなディレクトリー構成にします。Tomcat では、webapps という Servlet を置くところがデフォルト(docBase:デフォルトのルート)で存在するので、その下に mytest という Web アプリケーションを構築します。

  /usr/local/jakarta-tomcat-4.1.27/webapps/mytest/hello.jsp
  /usr/local/jakarta-tomcat-4.1.27/webapps/mytest/WEB-INF/web.xml
  /usr/local/jakarta-tomcat-4.1.27/webapps/mytest/WEB-INF/classes/HelloServlet.class
  /usr/local/jakarta-tomcat-4.1.27/webapps/mytest/WEB-INF/classes/HelloServlet.java

Web アプリケーションとして利用できるように、Tomcat へ Context の追加と Apache へ uri の追加を行ないます。

Tomcat への Context の追加は、Tomcat の設定ファイルである server.xml を編集します。Host タグ内に登録してください。

/usr/local/jakarta-tomcat-4.1.27/conf/server.xml:

  ...
  <!-- Tomcat Examples Context -->
  ...
  </ResourceParams>
  </Context>
 
  <!-- MyTest WebApp Context -->
  <Context path="/mytest" docBase="mytest" debug="0" reloadable="true" >
  </Context>
 
</Host>
...

ワーカーの設定は、設定ファイル(workers2.properties)に uri を追加。

/usr/local/apache2/conf/workers2.properties:

...
[uri:/mytest/*]
info=Example webapp.
 
...

それぞれの設定ファイルの編集が終わったら、tomcatと apache を再起動します。JNI を利用している場合、tomcat の再起動は必要ありません。

    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh stop
    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh start
    # /usr/local/apache2/bin/apachectl restart

ここで、Servlet を指定(http://<servername>/mytest/HelloWorld)すると Servlet (HelloServlet.class) が実行されます。JSPを指定(http://<servername>/mytest/hello.jsp)すると JSP(hello.jsp) が実行されます。

今度は、Web アプリケーションを Web ARchive format (WAR) 形式でまとめてみましょう。それを、webapps にコピーして元のディレクトリーを消してしまいます。

    # cd /usr/local/jakarta-tomcat-4.1.27/webapps/mytest
    # jar cf mytest.war *
    # mv mytest.war /usr/local/jakarta-tomcat-4.1.27/webapps/
    # rm -rf /usr/local/jakarta-tomcat-4.1.27/webapps/mytest
    # ls /usr/local/jakarta-tomcat-4.1.27/webapps
    ROOT         examples     mytest.war   webdav
    admin.xml    manager.xml  tomcat-docs
    # 

次に、Tomcat の server.xml に登録してあった Context の内容を削除、またはコメントアウトします。

/usr/local/jakarta-tomcat-4.1.27/conf/server.xml:

  ...
  <!-- Tomcat Examples Context -->
  ...
  </ResourceParams>
  </Context>
 
  <!-- MyTest WebApp Context -->
  <!--
  <Context path="/mytest" docBase="mytest" debug="0" reloadable="true" >
  </Context>
  -->
 
</Host>
...

それぞれの設定ファイルの編集が終わったら、tomcatと apache を再起動します。JNI を利用している場合、tomcat の再起動は必要ありません。

    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh stop
    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh start
    # /usr/local/apache2/bin/apachectl restart

ここで、Servlet を指定(http://<servername>/mytest/HelloWorld)すると Servlet (HelloServlet.class) が実行されます。JSPを指定(http://<servername>/mytest/hello.jsp)すると JSP(hello.jsp) が実行されます。

これはどういうことかというと、WAR 形式のアーカイブにしておくことで、Tomcat の server.xml への登録が不要になるということです。また、ファイルもまとまっていることから管理が非常に楽になります。


Webアプリケーションの登録に必要な各種設定

■ Tomcat への登録 conf/server.xml

Context エレメントを使用して定義します。Context エレメントの中で最もよく利用するものをまとめておきます。

path URL のパス
docBase Web アプリケーションの Servlet や HTML ファイルの置き場所
$CATALINA_HOME/webapps からの相対パスまたは、/(ルート)からの絶対パス(フルパス)で指定することが出来ます。絶対パスでの指定の場合、Apache の httpd.conf に Alias, Directory の設定を行っておくと良い。オーナーやパーミッションには気を付けてください。
debug デバッグメッセージを記録するレベルを指定( 0 から 9)
reloadable Web アプリケーションに変更があった場合、自動的にクラスを更新する(Web アプリケーション開発中は便利なので true とし、完成したら false にしておきましょう)
<Context path="/hello" docBase="hello" debug="0" reloadable="true" >
</Context>

■ Apache への登録 conf/workers2.properties

ワーカーの設定で、uri を登録します。

...
[uri:/hello/*]
info=hello webapp.
 
...

■ Web アプリケーションのディレクトリ構成

Web アプリケーション側は、あるルールに従って JSP、Servlet、HTMLファイル、イメージなどを配置します。基本的には、上記の設定のdocBase で指定したディレクトリーに以下の構造でファイルを配置します。基本的には、WEB-INF ディレクトリー以下が決められており、それ以外は自由に配置できます。

WEB-INF/web.xml Servlet の登録やマッピング、MIMEマッピングなどを定義
WEB-INF/classes/* このWeb アプリケーションで使う Servlet (クラス)を置く
WEB-INF/lib/*.jar このWeb アプリケーションで使う、 beans などの JAR 形式のアーカイブを置く
/usr/local/jakarta-tomcat-4.1.27/webapps/hello/WEB-INF/web.xml
/usr/local/jakarta-tomcat-4.1.27/webapps/hello/WEB-INF/classes/HelloServlet.class
/usr/local/jakarta-tomcat-4.1.27/webapps/hello/WEB-INF/classes/HelloServlet.java

■ web.xml の構造

web.xml にサーブレットを登録することで、WEB-INF/classesの下に置いたServletをマップした名前や指定したサーブレット名でアクセス出来るようになります。以下のタグは、一部でよく使われるものを説明しています。

<web-app> </web-app> Web アプリケーションの設定を記述
<servlet> </sevlet> Servlet の設定を記述
<servlet-name> </servlet-name> Servlet 名を記述
<servlet-class> </servlet-class> 実行する実際のクラス名を記述
<init-param> </init-param> パラメータを初期化。このタグ一つで、一つのパラメータしか扱えないので、複数パラメータがある場合このタグを繰り返す。
<param-name> </param-name> 初期化するパラメータ名前を指定
<param-value> </param-value> パラメータの初期値を記述
<servlet-mapping> </servlet-mapping> Sevlet のマッピングを記述
<url-pattern> </url-pattern> URL が、ここで指定したパターンにマッチすると Servlet が実行される
<session-config> </session-config> セッションの設定を記述
<session-timeout> </session-timeout> セッションのタイムアウト時間を指定
http://<server-name>/hello/servlet/HelloWorld
http://<server-name>/hello/HelloWorld
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class HelloServlet extends HttpServlet {
    private String initParam1;
    private String initPatam2;
    public void init() {
        initParam1 = getInitParameter("param1");
        initParam1 = getInitParameter("param2");
    }
 
    public void doGet(HttpServletRequest req, HttpServletResponse res)
                     throws ServletException, IOException
    {
        ...
    }
} 
<?xml version="1.0" encodeing="ISO-8859-1"?>
<web-app>
  <servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
    <init-param>
      <param-name>param1</param-name>
      <param-value>value1</param-value>
    </init-param>
    <init-param>
      <param-name>param2</param-name>
      <param-value>value2</param-value>
    </init-param> 
  </servlet>
  <servlet-mapping>
      <servlet-name>invoker</servlet-name>
      <url-pattern>/servlet/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>
</web-app>

Struts

大規模な Webアプリケーションを開発する場合、MVC(Model-View-Controller)モデルを用いた開発の分業化が当たり前となっています。その MVC モデルを構成するクラスやサーブレット、JSPタグ・ライブラリ、などを再利用可能な形でまとめたフレームワークとして Struts は有用なものです。

たぶん、Web アプリケーションの環境を構築する上で Struts ようなフレームワークも必要になってくるのでここで簡単な利用方法を記述します。

Struts
http://jakarta.apache.org/struts/
jakarta-struts-1.1.tar.gz

必要なすべてのモジュールが /usr/local/src にダウンロードされているものとして説明をします。Strutsバイナリディストリビューションを展開します。

    # gzip -dc jakarta-struts-1.1.tar.gz | tar xf -
    # cd jakarta-struts-1.1

各ファイルの説明:

lib/struts.jar このJARファイルは、Strutsの全てのJavaクラスを含んでいます。 このファイルを、開発する WebアプリケーションのWEB-INF/lib ディレクトリにコピーします。 注意 - 同じServletコンテナ上で複数のStrutsをベースとしたアプリケーションを動作させる際に、struts.jarファイルをコンテナのサポートする共有リポジトリに配置したくなが、その場合、アプリケーションの全てのクラスを共有リポジトリに格納しなければ ClassNotFoundException問題を引き起こす原因となります。
lib/struts*.tld これらは、"タグライブラリ記述子"(さまざまなStrutsタグライブラリの中のカスタムタグを記述したもの)です。 これらのファイルを、開発する Webアプリケーションの WEB-INFディレクトリにコピーします。
webapps/struts-blank.war これは、Strutsベースのアプリケーションを作る際の出発点となる、 シンプルな "Webアプリケーションアーカイブ"ファイルです。
webapps/struts-documentation.war Strutsドキュメントの全てを含んだ "Webアプリケーションアーカイブ"ファイルです。
webapps/struts-example.war Strutsの機能の大部分を利用したサンプルWebアプリケーションです。
webapps/struts-exercise-taglib.war Strutsのサポートするさまざまなカスタムタグのためのテストページを含んでいます。
webapps/struts-template.war Strutsテンプレートタグの紹介とデモです。
webapps/struts-upload.war Strutsフレームワークを用いたファイルのアップロードの簡単なサンプルです。

Web アプリケーションでStrutsを使うには、以下のステップに従う必要があります。

lib/struts.jarを、Strutsのディストリビューションから、 開発する Webアプリケーションの WEB-INF/lib ディレクトリにコピーする。
Strutsのディストリビューションから lib/struts*.tld に一致する全てのファイルを、 開発する Webアプリケーションの WEB-INFディレクトリにコピーする。
開発する Webアプリケーションの WEB-INF/web.xmlファイルを修正して<servlet> 要素を追加し、コントローラサーブレットを定義する。 そして<servlet-mapping>要素を追加し、どのリクエストURIがこのServletにマップするのかを確立させる。 StrutsサンプルアプリケーションのWEB-INF/web.xmlファイルを参考にすると良い。
開発する WebアプリケーションのWEB-INF/web.xmlファイルを修正して、 以下のタグライブラリ宣言を含めるようにする。
<taglib>
  <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
  <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
  <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
  <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
  <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
  <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
  <taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>
  <taglib-location>/WEB-INF/struts-template.tld</taglib-location>
</taglib>
アプリケーション固有のアクションマッピングやその他の特徴を定義する WEB-INF/struts-config.xmlファイルを作成する。 Strutsサンプルアプリケーションのstruts-config.xmlファイルを参考にすると良い。<form-beans><form-bean>の追加や <action-mappings><action>を追加します。
Strutsカスタムタグを使う各JSPページの先頭に、下記のようにStrutsカスタムタグライブラリの宣言文を追加する。
<@ taglib uri="/WEB-INF/struts-bean.tld" prefix="struts-bean" %>
<@ taglib uri="/WEB-INF/struts-html.tld" prefix="struts-html" %>
<@ taglib uri="/WEB-INF/struts-logic.tld" prefix="struts-logic" %>
<@ taglib uri="/WEB-INF/struts-template.tld" prefix="struts-template" %>
アプリケーションでメッセージリソースファイルを作成する場合、 WEB-INF/classes/ApplicationResources.properties を 作成する。リソースファイルで日本語を使用する場合、native2ascii コマンドを使用して ASCIIコードに変換する必要があります。
ASCIIコードへ変換(漢字コードが \udddd というコードになる)
  native2ascii input-file output-file
 
nativeコードへ変換(システムで利用している漢字コードになる)
  native2ascii -reverse input-file outputfile
開発する Wアプリケーションを構成するJavaクラスをコンパイルする際、 (先ほどコピーした)struts.jarファイルをコンパイラが認識する CLASSPATH に確実に追加する。

サンプル Webアプリケーションのインストール

# cp webapps/* /usr/local/jakarta-tomcat-4.1.27/webapps/

ワーカーの設定で、uri を登録します。(ここでは、struts-example.war のみ登録しています。)

# edit /usr/local/apache2/conf/workers2.properties
...
[uri:/struts-example/*]
info=Struts Example webapp.
 
...

ここで、Tomcat や Apache の再起動を行い、Struts のサンプルページを指定(http://<servername>/struts-example/index.jsp)すると以下のような画面が表示され、Struts のサンプルを実行できます。

    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh stop
    # /usr/local/jakarta-tomcat-4.1.27/bin/catalina.sh start
    # /usr/local/apache2/bin/apachectl restart

Struts