- Home ›
- サーブレット/JSP入門 ›
- フィルタ
<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>要素にどのタイミングでフィルタが実行されるのかを指定することができます。
指定可能な値は次の通りです。
| 値 | フィルタのタイミング | 
|---|---|
| REQUEST | URLがリクエストされた時 | 
| 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>
			プログラムは下記の通りです。
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>");
  }
}
			
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);
  }
}
			
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」へアクセスしてみます。
			 
			
「ForwardTest3」クラスは「HelloWorld3」クラスへフォワードしているだけなので、結果としては今までと同じく上記のように画面表示されます。
次にフィルターの結果を見てみます。
			 
			
「forwardtest」を呼び出したとき、そして「helloworld」へフォワードされた時にフィルタが呼び出されます。フォワードされた時のフィルタの設定の仕方が少し分かりにくいです。
( Written by Tatsuo Ikura )
 
				著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。
