入力文字コードの宣言のようにアプリケーション共通の処理を、個別のJSPページ(またはサーブレットクラス)で記述するのは好ましくありません。このような共通処理は、フィルタを利用することで、JSP&サーブレットから外部化し、個々のJSP&サーブレットの記述をシンプルにすることができます。フィルタは、JSP&サーブレットが呼び出されたタイミングで自動で起動されます。
リスト1は、入力文字コードの宣言をフィルタ上で記述した例です。
リスト1:EncodingFilter.java(抜粋)
public class EncodingFilter implements Filter {
// 初期化パラメータをprivate変数にセット
private FilterConfig config=null;
public void init(FilterConfig config) throws ServletException {
this.config=config;
}
// 初期化パラメータ"encode"の内容をセットしたあと、次のフィルタを呼び出し
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(config.getInitParameter("encode"));
chain.doFilter(request,response);
}
public void destroy() {}
}
|
フィルタクラスを定義する場合に必要な条件は次のとおりです。
- Filterインターフェースを実装
- 初期化/終了処理はinit/destroyメソッドで記述(注1)
- 実処理はdoFilterメソッドで記述
表1:フィルタクラスを定義する場合に必要な条件
※注1:
本サンプルでは終了処理が必要ありませんので、空のdestroyメソッドを記述しています。内容がない場合も、initメソッド/destroyメソッドは省略できません。
フィルタを利用するには、リスト2のようにweb.xmlにフィルタを登録する必要があります。<filter>要素は、フィルタクラスの完全修飾名(<filter-class>要素)に対して論理名(<filter-name>要素)を定義します。論理名は、アプリケーション内で一意である必要があります。
リスト2:web.xml(抜粋)
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>to.msn.wings.marugoto.EncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>Windows-31J</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>⁄*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
|
また、フィルタ内で使用する初期化パラメータ(<init-param>要素)もここで定義可能です。文字コード名のように、あとで変更する可能性がある情報は初期化パラメータとして外部化しておくのが好ましいでしょう。初期化パラメータは、FilterConfig#getInitParameterメソッドで取得可能です。
そして、<filter-mapping>要素では、どのリクエストに対してフィルタを適用するかの関連づけを定義します。ここでは、<url-pattern>要素として⁄*を指定しているので、アプリケーションルート配下に対するすべてのリクエストに対してEncodingFilterフィルタを適用します。<dispatcher>要素ではフィルタの適用タイミングを定義します。REQUEST(リクエスト時)のほか、表2のような値を設定可能です。複数タイミングを定義したい場合には、<dispatcher>要素を複数個列記します。
設定値 |
実行タイミング |
REQUEST |
通常の要求時 |
INCLUDE |
インクルード時 |
FORWARD |
転送処理時 |
ERROR |
例外発生時 |
表2:<dispatcher>要素で指定可能な値
|