2007 年 3 月 1 日 23 時 57 分

web.xml: 配備記述子 #1


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今日は、web.xml の中身について調べてみよう。

その内容は、Servlet 規格のバージョンによって少し異なる。
ここでは、最新の安定規格である 2.4 を使うことにしよう。

通常は、配備する予定の Servlet コンテナが準拠している
Servlet バージョン以下を自由に選ぶことになる。

例えば、Apache Tomcat の場合、
最新の v6 系 は Servlet 2.5、
v5 系は Servlet 2.4 に対応している。

まず、その名前が示すとおり、web.xml は XML 形式である。
そのため、最初の行には、XML 宣言が来る。

    <?xml version="1.0" encoding="UTF-8" ?>

Servlet 2.4 以降の web.xml は DTD を使わず、
代わりとして XML Schema を使うようになった。
そのため、DOCTYPE 宣言はなく、
直接ルート要素である <web-app> が続く。

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

</web-app>

かなり長いがこれは仕方ないね。

さて、web-app 要素内が設定の核である。
web.xml には色々な設定が可能なのだが、
ここでは web-app 直下に指定する、
主要な要素だけを見ていこう。

・<servlet> 要素

<servlet> 要素を使うと、この Web アプリケーションで
Servlet を使うことを宣言することができる。

<servlet> は必要な数だけ登録することができ、
通常 <servlet> 要素 1 つにつき、
1 つの Servlet 実装インスタンスが作成される。

例えば、Struts を使う場合、以下のようにして登録する。

    <servlet-name>struts-action</servlet-name>
        <servlet-class>
            org.apache.struts.action.ActionServlet
        </servlet-class>
        <init-param>
            <param-name>
                config
            </param-name>
            <param-value>
                /WEB-INF/struts-config.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

servlet-name は、インスタンスを識別する名前だ。
servlet-class には、実装クラスの完全名が入る。

init-param は、Servlet に引き渡す初期化パラメータで、
ServletConfig#getInitParameter でコードから参照できる。

Struts の場合、config パラメータが必須であり、
Struts 用の設定ファイルのパスを、
コンテキストをルートとするパスで指定する。

load-on-startup を指定した場合、
Servlet はコンテキストの起動と共に直ちに初期化される。
指定しなかった場合は、必要に応じてインスタンス化される。
(その挙動は Servlet コンテナに依存する)

load-on-startup で指定するのは 1 以上の優先値であり、
値が小さいものから順に初期化メソッドが呼ばれる。
これは、ある Servlet が別の Servlet に依存している場合、
前者の Servlet を後からロードするために使う。

Servlet コンテナによっては、
既定でロードしている Servlet が存在する場合がある。
その場合、web.xml の <servlet> を明示する必要はない。

例えば、Tomcat 5.5 の場合、「jsp」という名前で、
JSP 用の Servlet が優先値 3 でロードされている。

・<servlet-mapping> 要素

<servlet> を指定しただけでは、Servlet は使用されない。
<servlet-mapping> を使って、URL に関連付ける必要がある。

例えば、上述の Struts (struts-action) を、
*.do という拡張子に割り当てるためには、
以下のようにして登録する。

    <servlet-mapping>
        <servlet-name>struts-action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

こうすることで、最後が .do で終わる URL への要求は、
struts-action Servlet インスタンスに処理が渡される。

<url-pattern> に登録できるのは以下の 4 パターンだ。

    1. /res/spec.log(完全一致・特定のパスのみ)
    2. /logic/actions/*(前方一致・パスの配下全て)
    3. *.do(特定の拡張子全て)
    4. / (特別・既定のサーブレット)

通常、拡張子に対するマッピングを使うことが多い。
4 番目は特別であり、要求があったパスに、
どの Servlet も適合しなかった際に利用される。
「/*」とほぼ同じ役割である。

<servlet-mapping> も必要な数だけ登録することができる。
例えば、ある Servlet を複数の拡張子に割り当てたい場合、
複数の <servlet-mapping> を使って指定する。

    <servlet-mapping>
        <servlet-name>struts-action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>struts-action</servlet-name>
        <url-pattern>*.exec</url-pattern>
    </servlet-mapping>

余談だが、Servlet 2.5 では、
<url-pattern> 要素を複数持てるようになったので、
上記の記述は少しシンプルにできるようになる。

<servlet> と同じく、Servlet コンテナによっては、
Servlet の既定の割り当てが存在する場合がある。
その場合、<servlet-mapping> を明示する必要はない。

例えば、Tomcat 5.5 の場合、Servlet 「jsp」が、
*.jsp と *.jspx に割り当てられている。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.