<dispatcher>要素

広告

あるサーブレットに設定されたフィルタがいつ呼び出されるかは、デフォルトでは本来のサーブレットを呼び出すURLがリクエストされた時です。これ以外に、例えばサーブレットから別のサーブレットへフォワードされた時にフィルタが呼び出されるように設定することも可能です。

<filter-mapping>要素の定義を再度確認します。

<xsd:complexType name="filter-mappingType">
  <xsd:sequence>
    <xsd:element name="filter-name" type="j2ee:filter-nameType" /> 
    <xsd:choice>
      <xsd:element name="url-pattern" type="j2ee:url-patternType" /> 
      <xsd:element name="servlet-name" type="j2ee:servlet-nameType" /> 
    </xsd:choice>
    <xsd:element name="dispatcher" type="j2ee:dispatcherType" minOccurs="0" maxOccurs="4" /> 
  </xsd:sequence>
</xsd:complexType>

<filter-mapping>要素の子要素の1つに<dispatcher>要素があります。<dispatcher>要素にどのタイミングでフィルタが実行されるのかを指定することが出来ます。

指定可能な値は次の通りです。

フィルタのタイミング
REQUESTURLがリクエストされた時
FORWARDフォワードが行われた時
INCLUDEインクルードが行われた時
ERRORエラーページへ処理が移る時

1つの<filter-mapping>要素内で<dispatcher>要素は0回から4回まで設定出来ますので、4つの全てのタイミングを指定することも可能です。

記述例としては次のようになります。

<web-app>
  <filter>
    <filter-name>filtertest</filter-name>
    <filter-class>FilterTest</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>filtertest</filter-name>
    <url-pattern>/hello/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>
</web-app>

サンプルプログラム

では簡単なサンプルプログラムでフィルタを試してみましょう。

web.xmlファイルは下記のようにしました。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <filter>
    <filter-name>filtertest</filter-name>
    <filter-class>FilterTest3</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>filtertest</filter-name>
    <servlet-name>forwardtest</servlet-name>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

  <filter-mapping>
    <filter-name>filtertest</filter-name>
    <servlet-name>helloworld</servlet-name>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

  <servlet>
    <servlet-name>helloworld</servlet-name>
    <servlet-class>HelloWorld3</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>forwardtest</servlet-name>
    <servlet-class>ForwardTest3</servlet-class>
  </servlet>

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

  <servlet-mapping>
    <servlet-name>forwardtest</servlet-name>
    <url-pattern>/forwardtest</url-pattern>
  </servlet-mapping>
</web-app>

プログラムは下記の通りです。

HelloWorld3.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld3 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=Shift_JIS");
    PrintWriter out = response.getWriter();

    System.out.println("HelloWorld");

    out.println("<html>");
    out.println("<head>");
    out.println("<title>フィルタテスト</title>");
    out.println("</head>");
    out.println("<body>");

    out.println("<p>Hello World!</p>");

    out.println("</body>");
    out.println("</html>");
  }
}

ForwardTest3.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ForwardTest3 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    String disp = "/helloworld";
    RequestDispatcher dispatch = request.getRequestDispatcher(disp);

    System.out.println("フォワードします");

    dispatch.forward(request, response);
  }
}

FilterTest3.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.Filter;
import javax.servlet.FilterChain;

public class FilterTest implements Filter{
  public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain){
    try{
      System.out.println("フィルタ実行");

      chain.doFilter(request, response);
    }catch (ServletException se){
    }catch (IOException e){
    }
  }

  public void init(FilterConfig filterConfig) throws ServletException{
  }

  public void destroy(){
  }
}

上記をコンパイル後に「d:¥servlet-sample¥filter¥WEB-INF¥classes¥」ディレクトリにクラスファイルを移動した後で、ブラウザで「http://localhost:8080/filter/forwardtest」へアクセスしてみます。

Filterテスト

「ForwardTest3」クラスは「HelloWorld3」クラスへフォワードしているだけなので、結果としては今までと同じく上記のように画面表示されます。

次にフィルターの結果を見てみます。

Filterテスト

「forwardtest」を呼び出したとき、そして「helloworld」へフォワードされた時にフィルタが呼び出されます。フォワードされた時のフィルタの設定の仕方が少し分かりにくいです。

( Written by Tatsuo Ikura )

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