Webアプリケーション配備記述子(web.xml)とは、DD(Deployment Descriptor)と呼ばれるものの一つで、Webアプリケーション単位で適用する情報を XMLファイルとして記述するものであり、WEB-INFディレクトリの直下に配置します。 サーブレットコンテナは Webアプリケーションの起動時にこのファイルを読み込みこんで設定を適用します。
web.xmlで定義される主なプロパティには以下のようなものがあります。
| プロパティ |
概要 |
| サーブレットの宣言/ |
Tomcatのバイナリファイルが格納されます。起動開始のバッチファイルもこのディレクトリに含まれます。 |
| サーブレットのマッピング |
実行に必要なJavaのclassファイルが格納されます。サーブレットのコンパイルに必要なライブラリ群も含まれています。 |
| 初期パラメータ |
Tomcat全体の設定ファイルが格納されます。web.xmlや server.xmlという重要なファイルも含まれています。 |
| エラーページ |
ログの出力フォルダです |
| セッション情報 |
サーブレットコンテナの実行に必要なプログラムが含まれています。 |
| アクセス制限 |
必要に応じて、Webアプリケーションから利用するライブラリのJavaのclassファイルやjarファイルを配置します。 |
| MIMEマッピング |
Webアプリケーションのインストールディレクトリになります。 |
|
web.xmlファイルは XML形式のファイルになります。通常の XMLと同様に <?xml version="1.0" encoding="ISO-8859-1"?> で、XMLのバージョンと、文字コードを指定します。 次は DOCTYPEを宣言してこのファイルの DTDを指定します。サーブレット 2.3に準拠する web.xmlは以下のように指定します。ただ、この記述に関して実際は 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>
ここに子要素を記述する。
</web-app>
DOCTYPE以降は web.xmlのルートである「web-app」要素で囲みます。ここに web-appの子要素で、サーブレットの宣言を行う「servlet」や、初期パラメータを宣言する「context-param」、MIMEマッピングを宣言する「mime-mapping」等の要素を記述します。
<web-app>要素は DTDで以下のように定義されています。
<!ELEMENT web-app (icon?, display-name?, description?, distributable?,
context-param*, filter*, filter-mapping*, listener*, servlet*,
servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
login-config?, security-role*, env-entry*, ejb-ref*, ejb-local-ref*)>
この宣言は、ELEMENTで記述される要素の子要素を「,」で区切っています。つまり web-appには icon〜 ejb-local-refの子要素が定義されていることが分かります。また各要素に「?」などの記号が付いていますが、これらは以下のような意味を持っています。
| 記号 |
動作 |
| ? |
省略可能な要素 |
| * |
省略可能な要素で複数記述することも可能 |
| servlet-class|jsp-file |
servlet-class要素か jsp-file要素のいづれか必須 |
|
<servlet> - サーブレットの宣言
<servlet>要素はサーブレットの宣言を行います。DTDで以下のように定義されています。
主な子要素の概要は下表を見てください。
<!ELEMENT servlet (icon?, servlet-name, display-name?, description?,
(servlet-class|jsp-file), init-param*, load-on-startup?, run-as?, security-role-ref*)>
| 要素 |
意味 |
| icon |
省略可能:GUI ツールでサーブレットを表示する場合に使用される画像の位置を指定します。 |
| servlet-name |
必須項目:サーブレットの名称をを定義します。この定義名は別の要素からこのサーブレットを指定する際に使用します。名前は配備記述子の中で一意となる必要があります。 |
| display-name |
省略可能:GUI ツールによって表示される場合の名前を定義します。 |
| description |
省略可能:このサーブレットの説明を記述します。 |
| servlet-class |
jsp-fileかいづれか必須:インスタンスを生成するためのサーブレットの完全修飾クラス名です。一般的なサーブレットは jarフィルとして WEB-INF/libに配置されるか、WEB-INF/classes以下に作成されます。 |
| jsp-file |
servlet-classかいづれか必須:Web アプリケーション内の JSP ファイルへの絶対パス |
| init-param |
省略可能:サーブレットの初期パラメータを指定します。この要素には、パラメータ名称・パラメータの値・パラメータの説明といった三つの要素が定義されています。 |
|
では実際に 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>com.site-cooler.HelloWorld</servlet-class>
<init-param>
<param-name>message</param-name>
<param-value>HelloWorld from init-param</param-value>
</init-param>
</servlet>
</web-app>
<servlet> の記述を追加しましたが、<servlet>要素は、<servlet-name>と、<servlet-class>または<jsp-file>の必須項目があります。上記の例では サーブレットの完全修飾クラス名を指定する <servlet-class>を定義しています。
任意のパラメータですが、<init-param> を定義することでサーブレットの初期パラメータを指定しています。サーブレットは ServletConfig.getInitParameter("message") メソッドでこのパラメータの値を参照することが出来ます。
<servlet-mapping> - サーブレットと URIのマッピング
サーブレットと URIのマッピングとは、<servlet-mapping>要素を定義してリクエストされた URLがどのサーブレットに処理されるかを示します。サーブレットコンテナは リクエストされた URLを解析し、<servlet-mapping>で定義された対応するサーブレットを呼び出します。
<!ELEMENT servlet-mapping (servlet-name, url-pattern)>
| 要素 |
意味 |
| servlet-name |
必須項目:<servlet>要素で指定したサーブレット名を指定します。 |
| url-pattern |
必須項目:サーブレットにマッピングする URL パターン。 http://<ホスト:ポート>/<コンテキストパス>/ の後に続く部分がこのパターンと一致した場合にマップされているサーブレットが呼び出されます。 |
|
先程定義したサーブレットのURLマッピングを作成してみます。
<?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>com.site-cooler.HelloWorld</servlet-class>
<init-param>
<param-name>message</param-name>
<param-value>HelloWorld from init-param</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
</web-app>
上記では http://ホスト名:ポート番号/コンテキストパス/helloworld とリクエストがあったときに、サーブレットコンテナはリクエスト URLを解析し、web.xmlをマッピングを検索して、<servlet-mapping> でマップされている com.site-cooler.HelloWorld クラスを呼び出します。
色々なパターン
以下ように記述をすると、http://ホスト名:ポート番号/コンテキストパス/aaa/bbb や、 /コンテキストパス/aaa/ccc のリクエストもこのサーブレットへマップされます。
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/aaa/*</url-pattern>
</servlet-mapping>
以下ように記述をすると、http://ホスト名:ポート番号/コンテキストパス/ccc.zzz や、 /コンテキストパス/aaa/ccc.zzz のリクエストもこのサーブレットへマップされます。
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>*.zzz</url-pattern>
</servlet-mapping>
SJP-WCの試験では、リクエストのURIにマップするサーブレットは?といった出題がされます。