「サーブレット2.3における文字エンコーディングの指定」では、HttpServletRequest#setCharacterEncodingメソッドを使って、リクエストデータの文字エンコーディングを宣言する方法についてご紹介しました。
しかし、このような全ページ共通の記述を、たとえ1行といえども、常に記述しなければならないというのは、あまり好ましい話ではありません。環境の変更などで文字コードに変更があった場合などは、すべてのページに影響が出てしまうからです。
そこで登場するのが、文字コード宣言部分のフィルタ化です。また、ここでは文字コードに変更があった場合にも、フィルタクラスを再コンパイルせずに済むように、文字コードをデプロイメント・ディスクリプタから指定することにします。
以下のフィルタクラスFilterEncoding.javaを作成し、「/アプリケーションルート/WEB-INF/classes/filter/」フォルダ配下に保存します。また、フィルタクラスの起動条件、および、フィルタクラスに渡すパラメータ(文字コード)をデプロイメントディスクリプタに記述(追記)してください。
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); } }
<?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.