servlet のロケーションを一括で指定する

前回 id:redcat_prog:20111030 で書いたように、servlet の文字エンコーディングを一括で指定することが filter によって可能であったが、それをさらに発展させてロケーションも一括で指定してしまおうというのが今回の目的。

package jp.mydns.akanekodou.filter;

import java.io.*;
import javax.servlet.*;

import java.util.Locale;

public class EncodingFilter implements Filter {
    private String encoding;
    private String language;

    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("encoding");
        language = config.getInitParameter("language");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding(encoding);
        response.setLocale(new Locale(language));

        chain.doFilter(request, response);
    }

    public void destroy() {}
}

追加したのは 4 行。java.util.Locale を import して、新たに language というプライベート変数を用意し、init メソッドで web.xml からパラメータを読み込む。そして response.setLocale で、指定した言語に相当する Locale クラスをセットしている。こうしておいて web.xml の方で

<filter>
    <filter-name>Encoding</filter-name>
    <filter-class>filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
    <init-param>
        <param-name>language</param-name>
        <param-value>ja</param-value>
    </init-param>
</filter>

のように書いておく。前回の分から init-param が一つ増えている。これで servlet 実行時には

Content-Type : text/html; charset=utf-8
Content-Language : ja

という header が追加されているはずである。お手軽なのでお勧め。ただしこれはあくまで servlet にのみ適用されるもので、servlet ではない生の HTML ファイルには作用しないので注意。