TOPサーバ構築・運用> 共通処理をフィルタで記述する
はじめてのサーバサイドJava
はじめてのサーバサイドJava

第12回:デプロイメントディスクリプタ活用術(後編)

著者:山田 祥寛   2006/5/29
1   2  次のページ
共通処理をフィルタで記述する

   入力文字コードの宣言のようにアプリケーション共通の処理を、個別の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>要素で指定可能な値

1   2  次のページ

WINGSプロジェクト  山田 祥寛
著者プロフィール
有限会社WINGSプロジェクト   山田 祥寛
Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト(http://www.wings.msn.to/)」の代表。主な著書に「10日でおぼえる入門教室シリーズ(Jakarta・JSP/サーブレット・PHP・XML)」(以上、翔泳社)、「書き込み式 SQLのドリル」(ソシム)など。最近ではIT関連技術の取材、講演まで広くを手がける毎日。

INDEX
第12回:デプロイメントディスクリプタ活用術(後編)
共通処理をフィルタで記述する
  リスナでアプリケーションイベントを捕捉する