サーブレットの様々なサンプル - フィルターの使用 -
技術情報 TOP へ

ここでは、Java サーブレットに関する簡単なサンプルを記述いたします。

( 1 ) フィルターの使用
( 2 ) レスポンスの加工



( 1 ) フィルターの使用

フィルターについて

Java サーブレットのフィルターについてですが、フィルターとはクライアントからのリクエストや サーバ側のレスポンスに対して、サーブレットが実行する前や後になんらかの処理を行ったり、リクエストが 届いたタイミングやレスポンスを送信するタイミングでなんらかの処理を行うことが可能です。

フィルターを使用するには、パッケージ filters 内に javax.servlet.Filter を実装 ( implements ) したクラスを作成し、init メソッド、doFilter メソッド、destroy メソッドを オーバーライドします。

init メソッド
このフィルタオブジェクトが初めて使用されるとき ( デフォルトではアプリケーションサーバ起動時 ) に一度だけ実行されます。

doFilter メソッド
このフィルタオブジェクトの対象となるリクエストが届いたタイミングで実行されます。 このメソッド内で chain.doFilter メソッドが呼び出され、サーブレットが実行されます。

destroy メソッド
このフィルタオブジェクトが破棄されるときに実行されます。

ここでは、簡単にフィルターを使用してみます。以下のプログラムを対象の Web アプリケーションに追加します。

ファイル名:filters/DefFilter.java
package filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class DeffFilter implements Filter {
	
	public void init (FilterConfig config) throws ServletException {		
	  System.out.println("filter init ");
	}	
	
	public void doFilter (ServletRequest request, 
	  ServletResponse response, FilterChain chain)
	  throws IOException, ServletException {

	  /* リクエストに対する処理を記述します。chain.doFilter の前 */
	  System.out.println("exex doFilter");

	  chain.doFilter(request, response);	

	  /* レスポンスに対する処理を記述します。 chain.doFilter の後 */

	}
	
	public void destroy () {
	}
}
web.xml に以下の内容を記述します。

web.xml の記述例:コンテキスト内すべてのリクエストに DeffFilter を適用します。
<web-app>
  <!--ここから-->
  <filter>
    <filter-name>defFilter</filter-name>
    <filter-class>filters.DeffFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>defFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <!--ここまで-->

上記の web.xml の簡単な解説

web-app 要素 ( <web-app> ) の中に filter 要素 ( <filter> ) と filter-mapping 要素 ( <filter-mapping> )
を複数記述できます。

filter 要素では、filter-name 要素と filter-class 要素をペアで記述します。
filter-mapping 要素では、filter-name 要素と url-pattern 要素をペアで記述します。
また、filter 要素及び filter-mapping 要素には同じ filter-name 要素が記述されていることが確認できます。

<filter>
<filter-name>
defFilter</filter-name>
<filter-class>filters.DeffFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>
defFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

上記を確認すると、url-pattern 要素と filter-class 要素は、それぞれの filter-name 要素 defFilter
で関連付けられていることがわかります。

url-pattern 要素 で コンテキスト内の /*.jsp にマッチするファイルだけに DeffFilter が適用されることになります。
( url-pattern は必要な設定に応じて値を設定します。)

上記から、このコンテキスト内の JSP にブラウザからアクセスした場合、filters.DeffFilter の doFilter
メソッドが実行され、サーバコンソールに "exex doFilter" が表示されます。





( 2 ) レスポンスの加工

フィルターを使用してサーブレットや JSP からから出力されたレスポンスの HTML を加工して出力します。

レスポンスを加工するには javax.servlet.Filter を実装 ( implements ) した filters.DeffFilter クラスと javax.servlet.http.HttpServletResponseWrapper を継承したクラスを filters.SimpleWrapper クラスを作成します。

javax.servlet.http.HttpServletResponseWrapper
javax.servlet.http.HttpServletResponse インターフェイスの実装クラスです。 ( ラップされたレスポンス・オブジェクトです。 )

ファイル名:filters/DefFilter.java
package filters;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class DeffFilter implements Filter {
	
	public void init (FilterConfig config) throws ServletException {		
	  System.out.println("filter init ");
	  }
	
	  public void doFilter (ServletRequest request, 
	  ServletResponse response, FilterChain chain)
	  throws IOException, ServletException {
		
	  HttpServletResponse resp = (HttpServletResponse)response;
	  SimpleWrapper wrapper = new SimpleWrapper(resp);			
		
	  chain.doFilter(request, response);	

	  /* レスポンスを出力するタイミングで以下の処理が実行されます。 */

	  PrintWriter out =
	   new PrintWriter(
	       new OutputStreamWriter(response.getOutputStream(),"SJIS"));

	  /* サーブレットから出力される HTML を取得*/
	  String outHtml = wrapper.toString();

	  /* HTML を加工します。*/
	  outHtml = outHtml + "<!--SimpleWrapper-->";

	  /* ContentLength を設定しなおします。*/
	  response.setContentLength(outHtml.length());		

	  /* HTML を出力します。*/
	  out.write(outHtml);	
	  out.flush();		    
	  out.close();

	  }
	
	  public void destroy () {
	  }
}

ファイル名:filters/SimpleWrapper.java
package filters;

import java.io.CharArrayWriter;
import java.io.PrintWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class SimpleWrapper extends HttpServletResponseWrapper {
	
	private CharArrayWriter caw = null;
	
	public SimpleWrapper(HttpServletResponse response){
	 super(response);
	 caw = new CharArrayWriter();
	}
	
	public String toString() {
	/* CharArrayWriter の toString を呼び出します */
	 return caw.toString();
	}
	
	public PrintWriter getWriter(){
	/* CharArrayWriter で PrintWriter を返却します。 */
	 return new PrintWriter(caw);
	}
	
	public ServletOutputStream getOutputStream(){
	/* SampleServletOutputStream を返却します。 */
	 return new SampleServletOutputStream(caw);
	}
		 
	class SampleServletOutputStream extends ServletOutputStream{
		 
	private CharArrayWriter buffer = null;
	 
	public SampleServletOutputStream(CharArrayWriter charArrayWriter){
	  super();
	  buffer = charArrayWriter;
	} 
	public void write(int c){
	  buffer.write(c);
	} 
   }
}


上記のプログラムを実行すると、このフィルタオブジェクトの対象となるリクエストに対するレスポンスの HTML の
最後尾に <!--SimpleWrapper--> が付与された状態で出力されます。



技術情報 TOP へ


Google
WWW を検索 whitemark.co.jp を検索
[ 株式会社ホワイトマーク TOP ]   [ 免責事項 ]

Copyright © 2006 by WhiteMark, All rights Reserved. Last Modified: 2006/05