連載
» 2003年12月09日 10時00分 公開

JavaTips 〜JSP/サーブレット編:文字コード宣言をフィルタで共有化する

[山田祥寛,@IT]

 「サーブレット2.3における文字エンコーディングの指定」では、HttpServletRequest#setCharacterEncodingメソッドを使って、リクエストデータの文字エンコーディングを宣言する方法についてご紹介しました。

 しかし、このような全ページ共通の記述を、たとえ1行といえども、常に記述しなければならないというのは、あまり好ましい話ではありません。環境の変更などで文字コードに変更があった場合などは、すべてのページに影響が出てしまうからです。

 そこで登場するのが、文字コード宣言部分のフィルタ化です。また、ここでは文字コードに変更があった場合にも、フィルタクラスを再コンパイルせずに済むように、文字コードをデプロイメント・ディスクリプタから指定することにします。

解説

 以下のフィルタクラスFilterEncoding.javaを作成し、「/アプリケーションルート/WEB-INF/classes/filter/」フォルダ配下に保存します。また、フィルタクラスの起動条件、および、フィルタクラスに渡すパラメータ(文字コード)をデプロイメントディスクリプタに記述(追記)してください。

FilterEncoding.java
package filter;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class flt_request implements Filter {
  private FilterConfig config=null;
  public void init(FilterConfig conf){
    this.config=conf;
  }
  public void destroy(){}
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 throws ServletException, IOException {
    request.setCharacterEncoding(config.getInitParameter("encoding"));
    chain.doFilter(request,response);
  }
}
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <filter>
    <filter-name>FilterEncoding</filter-name>
    <filter-class>filter.FilterEncoding</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>SJIS</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>FilterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

 <init-param>要素は、フィルタクラスから参照可能な初期化パラメータを指定します。パラメータ名(<param-name>要素)とパラメータ値(<param-value>要素)の組から定義されます。そのほか、定義内容については、「アクセルログ記録のロジックをフィルタで一元化する」を参照してください。

 デプロイメント・ディスクリプタで定義された初期化パラメータを、フィルタクラスから参照するには、FilterConfig#getInitParameterメソッドを使用します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。