Servlet2.3の仕様バグで、HTTP-REQUESTのボディ部の文字コードがUS-ASCII決め打ちなので、フィルタで埋め込んでやる必要があります。
尚、ヘッダ部はここで文字コードを埋め込んでやってもエンコードされないので、日本語の文字列をGET( http://foo.com/request?name=圃下太郎 )で受け取る場合には、別途ヘッダをエンコードしてやる必要があります。(だから画面からGETで日本語を送らないというのは賢明な判断)
public class CharsetEncodingFilter implements Filter { /** jakarta-commons-logging */ private static Log logger = LogFactory.getLog(CharsetEncodingFilter.class); /** このサーブレットアプリケーションの文字コードセット名 */ private String charset = null; /** * デフォルトコンストラクタ */ public CharsetEncodingFilter() { super(); } /* * @see javax.servlet.Filter#destroy() */ public void destroy() { logger.info("CharsetEncodeFilter終了します。文字コード:" + charset); } /** * REQUESTに文字コード名を設定します。 * @param req リクエスト * @param res レスポンス * @param chain FilterChain * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, * javax.servlet.ServletResponse, javax.servlet.FilterChain) */ public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(charset); chain.doFilter(req, res); } /** * web.xmlから文字コードセット名を受け取ります. * <pre> * web.xmlから、文字コードセット名を受け取ります。 * 設定されていない場合は、JISAutoDetectになります。 * </pre> * @param filterconfig フィルタ設定情報 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ public void init(FilterConfig filterconfig) throws ServletException { charset = filterconfig.getInitParameter("charset"); if (charset == null) { charset = "JISAutoDetect"; } logger.info("CharsetEncodeFilter起動します。。文字コード:" + charset); } }
<!-- Filter --> <filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class>com.foo.CharsetEncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>Shift_JIS</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
※web.xmlの記述順序を参照