web.xmlの構文の拡張

次にweb.xmlの新しい構文を試してみよう。Servlet 2.5からはfilter-mappingについて、複数のurl-mappingやservlet-nameを指定することができるようになった。ここではリスト11のようなフィルタを用意し、HelloWorldおよびResourceInjectionSampleが呼ばれた際にこのフィルタが実行されるように設定してみる。

リスト11 HelloFilter.java

package sample;
 
import java.io.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class HelloFilter implements Filter {
 
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {
        StringBuffer requestURL = ((HttpServletRequest) request).getRequestURL();
        System.out.println("Access to " + requestURL + " at " + new Date());
        
        chain.doFilter(request, response);
    }
    
    public void destroy() {
    }
 
    public void init(FilterConfig filterConfig) {
    }
}

web.xmlにはフィルタの設定をリスト12のように記述する。servlet-nameには「HelloWorld」と「ResourceInjectionSample」の両方が指定してある。Servlet 2.4以前ではそれぞれについて個別にマッピングを定義しなければならなかった。

リスト12 WEB-INF/web.xmlのFilterの設定

<filter>
    <filter-name>HelloFilter</filter-name>
    <filter-class>sample.HelloFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HelloFilter</filter-name>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-name>ResourceInjectionSample</servlet-name>
</filter-mapping>

Tomcatにデプロイして両サーブレットプログラムにアクセスすると、リスト13のように表示され、どちらの場合もフィルタが実行されていることがわかる。

リスト13 サーブレットプログラムに作成した結果

Access to http://localhost:8080/Tomcat6Sample/HelloServlet at Thu Mar 22 22:09:29 JST 2007
Access to http://localhost:8080/Tomcat6Sample/ResourceInjectionSample at Thu Mar 22 22:09:31 JST 2007

Servlet 2.5では、servlet-mappingの定義でも、同様に複数のurl-patternを指定できるようになった。web.xmlのHelloServletに関するマッピングの定義をリスト14のように変更する。これで「http://localhost:8080/Tomcat6Sample/Hello」と「http://localhost:8080/Tomcat6Sample/HelloServlet」のどちらのURLにアクセスした場合にもHelloServletが実行されるようになる。

リスト14 マッピングの定義

<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>

デプロイしてhttp://localhost:8080/Tomcat6Sample/Helloにアクセスすると、リスト115のように表示され、先程のHelloServletに対するフィルタが実行されていることがわかる。

リスト15 http://localhost:8080/Tomcat6Sample/Helloにアクセスした結果

Access to http://localhost:8080/Tomcat6Sample/Hello at Thu Mar 22 22:11:41 JST 2007