第10章 要求とサーブレットとのマッピング (Mapping
Requests to Servlets)
本仕様書の以前の版では、クライアントからの要求とサーブレットのマッピングは、推奨するマッピング技術によるマッピングのセットを指定することで、フレキシブルなものとするものであった。この仕様書では、ウェブ アプリケーション デプロイメント メカニズムを介してデプロイメントされるウェブ アプリケーションが使うために、マッピング技術のセットを必要とする。ランタイムの表現としてサーブレット コンテナがデプロイメント表現を使うことを強く推奨されるのとまったく同じく、単にウェブ アプリケーションのデプロイメントの一部としてではなく、全ての目的の為にサーバにおいてこれらのパス マッピングのルールを使用することが強く推奨される。
10.1 URLパスの使用 (Use of
URL Paths)
サーブレット コンテナは、要求とサーブレットとのマッピングにURLパスを使用しなければならない。要求からのRequestURIを使用するコンテナは、サーブレットへのマッピング パスとして、それからコンテキスト パスを引かなければならない。URLパス マッピングの規則は以下のとおりである(最初に合致した項目があれば、以降の項目への適合は調べなくてよい):
1. サーブレット コンテナは、要求のパスがそのままサーブレットのパスに合致するかをまず試みる。
2. コンテナは次に最長プレフィックス パス・マッピングに合致するか繰り返し試みる。このプロセスは、’/’文字をパス セパレータとして、ディレクトリのパス トリーをひとつずつ下げていき、それと合致するサーブレットがあるかを調べるときに生ずる。
3. 最後のノードが拡張子(例えば.jsp)を含むときは、サーブレット コンテナはその拡張子の要求を取り扱う合致サーブレットがあるかを調べる。拡張子は、そのパスの最後の’.’文字の後の部分である。
4. 上記の二つのルールのどれにもサーブレットの一致が取れないときは、コンテナは要求されているリソースに適切なコンテンツのサービスを行う。そのアプリケーションで「デフォルト」のサーブレットが定義されているときは、この場合そのサーブレットが適用される。
10.2 マッピングの仕様 (Specification of Mapping)
ウェブ アプリケーションデプロイメント ディスクリプタにおいて、マッピングを定義する為に、以下のシンタックスが使われる:
- ‘/’文字で始まり’/*’で終わる文字列は、パス マッピングに使われる。
- ‘*.’のプレフィックスで始まる文字列は拡張マッピングとして使われる。
- その他の全ての文字列は、そのままで正しく合致する用途にのみ使われる。
- ‘/’文字のみを含む文字列は、そのマッピングで指定されたサーブレットがそのアプリケーションのデフォルトのサーブレットとなる。
10.2.1 暗黙的マッピング (Implicit Mappings)
コンテナがJSPコンテナを包含しているときは、*.jsp拡張子は暗黙的にそれにマッピングされ、JSPページがオンデマンドで実行される。ウェブ アプリケーションが*.jspマッピングを定義しているときは、そのマッピングのほうがこの内示的マッピングに優先する。
サーブレット コンテナは明示的なマッピングが優先される限り他の暗黙的マッピングを作ってもよい。例えば、*.shtmlの暗黙的マッピングは、サーバ サイド インクルード機能へコンテナによってマッピングさせられよう。
10.2.2 マッピング・セットの例 (Example Mapping Set)
以下のマッピングを考えてみよう:
表3: マップのセットの例 |
|
パス・パタン |
サーブレット |
/foo/bar/* |
servlet1 |
/baz/* |
servlet2 |
/catalog |
servlet3 |
*.bop |
servlet4 |
結果は以下の動作となる:
表4: マップのセットの例に適用される到来パス |
|
到来パス |
要求を処理するサーブレット |
/foo/bar/index.html |
servlet1 |
/foo/bar/index.pop |
servlet1 |
/baz |
servlet2 |
/baz/index.html |
servlet2 |
/catalog |
servlet3 |
/catalog/index.html |
"default"のサーブレット |
/catalog/racecar.bop |
servlet4 |
/index.bop |
servlet4 |
/catalog/index.html及び/catalog/racecar.bopの場合、/catalogにマッピングされたサーブレットは使われない。なぜなら、正確なマッチングがとれなく、ルールには’*’文字が含まれていないからである。