ここではもう少し詳しいアプリ毎の設定ということで、web.xmlでの設定をとりあげます。なおweb.xmlを修正した場合、それが反映されるのはTOMCATを一度停止して再起動したときなので注意してください。
web.xmlの作成の説明で作成したweb.xmlでは、<servlet-mapping>の定義でinvokerという、デフォルト用の定義しかしていませんでした。Javaソースとコンパイル結果のclassファイルが完全に1:1対応ならこのままでも特に問題ないでしょう(特にこのページが対象にしているサーバー側Javaのお勉強なら)。
そうではなくサーブレット個別の指定が必要な場合、<servlet>タグや<servlet-mapping>タグで、サーブレット個別の定義をする必要があります。
それからJavaのパッケージ化機能を利用する場合も、場合によってサーブレット個別の定義が必要なこともあります。
定義する場所はweb.xmlの中で<web-app>と</web-app>の間です。
<servlet>と</servlet>で囲んだ中で、個別サーブレットの情報を定義します。最低限必要なのは、
<servlet>
<servlet-name>
サーブレット名
</servlet-name>
<servlet-class>
パッケージ名.サーブレット名
</servlet-class>
</servlet>
|
です。
この中で<servlet-class>には パッケージ名.サーブレット名 となってますが、サーブレット名に対応する.classファイルがアプリケーション毎ディレクトリ\WEB-INF\classesのすぐ下にあるのなら、サーブレット名だけを書いておけば問題ありません。
(サーブレットについてはパッケージ化を利用していない場合の話です)
システムがある程度の規模になっているとき、サブシステムに分けることがあります。
一つの方法はサブシステム毎にコンテキストを分ける、つまり%CATALINA_HOME%\webapps下をTestAp1、TestAp2・・・というディレクトリに分けて管理する方法です。
もう一つはサブシステム毎にパッケージ化する、という方法です。
%CATALINA_HOME%\webapps\TestApをシステム単位のディレクトリとし、サブシステム毎にAp1、Ap2・・・というパッケージにまとめて、TestAp下をAp1、Ap2・・・というディレクトリに分けて管理する方法です。
パッケージ化とはサーブレットやJSP等から呼ばれる共通部品的なものだけでなく、サーブレット自体もパッケージ化することができるのです。パッケージ化していないサーブレットを呼び出すときは、 http://localhost:8080/TestAp/servlet/サーブレット名 でしたが、例えばAp1というパッケージにサーブレットが含まれている場合は http://localhost:8080/TestAp/servlet/Ap1/サーブレット名 と、どのパッケージに含まれているかを意識した呼出しになります。
これは個別サーブレットの定義をせず、デフォルトのinvokerに任せた場合です。
そうではなくサーブレットをパッケージ化した場合でも、通常どおりに http://localhost:8080/TestAp/servlet/サーブレット名 で呼び出せるようにしたいときは、このサーブレット個別の定義を使います。
URLで指定されたサーブレット名が、どのパッケージに含まれているサーブレットのclassファイルかという対応付けを指定するのです。
少し上で述べたように、ここの例のようにTestApというコンテキストを作成した場合、URL指定ではhttp://localhost:8080/TestAp/servlet/サーブレット名というように/コンテキスト名/servlet/サーブレット名と指定します。
しかしこれではURLを見ただけでそのサーバー処理が、Javaサーブレットで構成されていることがバレバレであまりよろしくありません。また実際の業務システムではサーブレット名はシステム・サブシステム毎に記号化し、例えば検索処理を行うサーブレットは CPI0305200 というような名前付けになることがままあります。
このURL中の/servlet/という記述を無くすこと、例のような検索処理呼び出しのときに記号化されたCPI0305200というサーブレット名でなく、http://localhost:8080/TestAp/SEARCH のようなURLを指定したいときに、この<servlet-mapping>を指定します。
こうしたことが必要でなく標準のサーブレット呼び出しパターンでよければ、このタグは必須タグではないので、書かなくても問題ありません。
指定する場合は
<servlet-mapping>
<servlet-name>
サーブレット名
</servlet-name>
<url-pattern>
/URL指定パターン
</url-pattern>
</servlet-mapping>
|
と記述します。<servlet-name>で指定するサーブレット名は、<servlet>タグで記述されていないといけません。
URL指定パターンに記述するのはコンテキスト名の後ろの部分です(つまりTestApの部分までは書かなくてよい)。
上に書いた例のように検索処理呼び出しを SEARCH で指定し、実際に動くサーブレットがCPI0305200の場合は、
<servlet-mapping>
<servlet-name>CPI0305200</servlet-name>
<url-pattern>/SEARCH</url-pattern>
</servlet-mapping>
のようになります。
ここではJavaの ServletContext に対する getInitParameter(contextパラメータ)や、 ServletConfig に対する getInitParameter(configパラメータ)ServletContext に対する getInitParameter(contextパラメータ)の設定方法について説明します。
まずコンテキストパラメータについてです。コンテキストパラメータとは、アプリケーション実行環境毎に共有される初期化パラメータのことです。アプリケーション実行環境設定でTestApというディレクトリを作り、そこに業務処理、アプリケーション用のプログラム(JSP、サーブレット)を配置するようにしました。そのTestAp配下の全プログラムで共有されるパラメータです。
例えばDBを使う場合、DBへのログオンが必要になります。割と多いのが個別にDBのユーザーIDを振るのではなく、業務ごとにユーザーIDを振って使うというパターンです。ここの例ではTestApというディレクトリを作りましたが、業務処理ごとにディレクトリを分けて管理したい場合、その業務処理毎の初期化パラメータでDBへの接続情報、ユーザーID、パスワードなどを管理したい、ということが考えられます。
そうしたときにこのコンテキストパラメータを使えばいいわけです。
作る場所はweb.xmlの作成で作成した、各アプリケーション毎ディレクトリ\WEB-INF下のweb.xmlです。
コンテキストパラメータの書き方は
<context-param>
<param-name>パラメータ名</param-name>
<param-value>パラメータの値</param-value>
<description>説明</description>
</context-param>
|
といった感じです。
記述場所は<web-app>と</web-app>の間で、<servlet>と</servlet>の間以外です。
一つだけ<servlet>定義をしたときを例にすると、
<?xml version="1.0" encoding="Windows-31J"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>パラメータ名</param-name>
<param-value>パラメータの値</param-value>
<description>説明</description>
</context-param>
<!-- クライアントからのパラメータの文字エンコードをShift-JISにする -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>
サーブレット名
</servlet-name>
<servlet-class>
パッケージ名.サーブレット名
</servlet-class>
</servlet>
<!-- デフォルトのサーブレットマッピング -->
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
</web-app>
|
といった感じです。
個別のサーブレット定義をせずデフォルトのinvokerだけでいいのなら、この例の中の<servlet>〜</servlet>を定義しなければいいわけです。
コンフィグパラメータとはコンテキストパラメータのように、あるディレクトリ配下で共有するのではなく、個別のサーブレット毎に設定する初期化パラメータのことです。
例えばTestServという名前のサーブレットを作り、それに対してそれ用の初期化パラメータを与える場合は
<web-app>
<servlet>
<servlet-name>
TestServ
</servlet-name>
<servlet-class>
TestServ
</servlet-class>
<init-param>
<param-name>パラメータ名</param-name>
<param-value>パラメータの値</param-value>
<description>説明</description>
</init-param>
</servlet>
</web-app>
|
といったようになります。
|