URLパターンの優先順位

広告

ここまでにURLパターンの4つの記述方法を見てきましたが、URLパターンの指定の仕方によっては複数のパターンにマッチする場合があります。その場合サーブレットの呼び出しがどのパターンにマッチするかはURLパターンの記述方法毎に優先順位があります。

URLパターンの優先順位は下記の通りです。

高
  特定のファイルへのマッピング
  パスマッピング
  拡張子マッピング
  デフォルトマッピング
低

上から順に優先順位が高いです。その為、「特定のファイルへのマッピング」が一番優先順位が高く、「デフォルトマッピング」が一番優先順位が低いことになります。

パスマッピングで「/*」と書けばデフォルトマッピングと同じことが出来るのにデフォルトマッピングが用意されているのは、パスマッピングで「/*」と記述してしまうと拡張子マッピングの方が優先順位が低いため、拡張子マッピングにマッチしなくなってしまうためです。

例えば下記のようなマッピングが記述されていたとします。

<servlet-mapping>
  <servlet-name>
    hello1
  </servlet-name>
  <url-pattern>
    /hello/index.html
  </url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>
    hello2
  </servlet-name>
  <url-pattern>
    /hello/*
  </url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>
    hello3
  </servlet-name>
  <url-pattern>
    /*.html
  </url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>
    hello4
  </servlet-name>
  <url-pattern>
    /
  </url-pattern>
</servlet-mapping>

「http://localhost:8080/webxmltest/hello/index.html」と呼び出した場合、全てのURLパターンにマッチしますけど一番優先順位の高い「hello1」というサーブレット名を持つサーブレットが呼び出されます。

「http://localhost:8080/webxmltest/hello/sample.html」と呼び出した場合、「hello2」「hello3」「hello4」のURLパターンにマッチしますが、この中で一番優先順位の高い「hello2」というサーブレット名を持つサーブレットが呼び出されます。

「http://localhost:8080/webxmltest/sample.html」と呼び出した場合、「hello3」「hello4」のURLパターンにマッチしますが、この中で一番優先順位の高い「hello3」というサーブレット名を持つサーブレットが呼び出されます。

「http://localhost:8080/webxmltest/sample.gif」と呼び出した場合、「hello1」「hello2」「hell3」のURLパターンにマッチしませんので、デフォルトマッピングの対応サーブレットである「hello4」というサーブレット名を持つサーブレットが呼び出されます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)