web.xml の定義( url-pattern の書き方)

メモ:

サーブレットと URL を紐付ける url-pattern には、ワイルドカードを指定するなどいくつかの書き方があります。

url-pattern の書き方

サーブレットを配備するには、 webapps ディレクトリ配下にアプリケーション用ディレクトリを作成しその配下に配備していきます。

webapps
     |- hello_servlet    (アプリケーション用ディレクトリ)

この context-root と url-pattern を組み合わせた URL で、サーブレットが呼び出されることになります。

http://host:port/context-root/url-pattern

完全パス指定

完全に一致するパターンで、一致すればサーブレットが呼び出されます。

<web-app>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/index.html</url-pattern>
    </servlet-mapping>
</web-app>

上記設定の場合、 URL パターンが「/index.html」で、 URL が「http://host:port/hello_servlet/index.html」の場合に一致することになります。

他にも URL パターンが「/helloworld」で、「http://host:port/hello_servlet/helloworld」のように拡張子が無い場合でも、完全に一致することでサーブレットを呼び出すことができます。

<web-app>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/helloworld</url-pattern>
    </servlet-mapping>
</web-app>

パス指定

ワイルドカードを指定するパターンで、パスが一致すればサーブレットが呼び出されます。

<web-app>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
</web-app>

例えば、 URL パターンを「/hello/*」と指定した場合、 URL が「http://host:port/hello_servlet/hello/」から始まる全ての呼び出しに対して指定のサーブレットが呼び出されます。例えば、下記のどの呼び出し方をしても同じサーブレットが呼び出されます。

  • http://host:port/hello_servlet/hello/hellowolrd
  • http://host:port/hello_servlet/hello/index.html
  • http://host:port/hello_servlet/hello/sub/hoge.png

この指定方法では、複数の URL から 1 つのサーブレットを実行することができます。メリットとして考えられる例として、印刷用の URL を「/print/」にまとめ、 1 つのサーブレットが実行されるようにし、呼び出されたサーブレットの中で URL により処理を分岐理するような利用などが考えられます。

  • http://host:port/hello_servlet/hello/invoice
  • http://host:port/hello_servlet/hello/pickinglist

拡張子指定

拡張子が一致することでサーブレットが呼び出されます。指定されたパス以下の全ての階層に適用されます。

<web-app>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>
</web-app>

例えば、 URL パターンを「*.jsp」と指定した場合、 URL が「http://host:port/hello_servlet/index.jsp」のように拡張子が一致すると指定のサーブレットが呼び出されます。例えば、下記のどの呼び出し方をしても同じサーブレットが呼び出されます。

  • http://host:port/hello_servlet/hello/index.jsp
  • http://host:port/hello_servlet/hello/login.jsp
  • http://host:port/hello_servlet/hello/sub/hoge.jsp

デフォルトマッピング

どの URL マッピングにもマッチしなかった全ての呼び出しに対してサーブレットが呼び出されます。

<web-app>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>
</web-app>

デフォルトマッピングは、上記設定のように「/」だけを記述します。

URL パターンの優先順位

URL パターンの指定の仕方によっては、複数のパターンにマッチする事があるため URL パターンの記述には優先順位があります。

  • 優先1.完全パス指定
  • 優先2.パス指定
  • 優先3.拡張子指定
  • 優先4.デフォルトマッピング