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.デフォルトマッピング