LoginSignup
0
0

More than 5 years have passed since last update.

JavaLiteのActiveWebの文字化けでハマった

Posted at

概要

JavaLite(http://javalite.io/) のActiveWeb では FreeMarker というテンプレートエンジンを使っているのですが、viewファイル(ftlファイル。UTF-8)に書いた日本語文字列が文字化けしてハマった。

いろいろ調べてみると、レスポンスヘッダーのContent-Typeが「text/html; charset=ISO-8859-1」になっていた。ISO-8859-1ではなくUTF-8にしたいところ。

前提

ActiveWebのバージョンは1.13。

対策

EncodingFilterを自作して、web.xmlで設定する。

EncodingFilter.java
package app.system;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {
    private String encoding;

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

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        response.setContentType("text/html; charset=" + encoding);
        chain.doFilter(request, response);
    }

    public void destroy() {}
}
web.xml
  . . .

    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>app.system.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

  . . .

    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  . . .

EncodingFilterは他のFilterよりも早めに呼び出さないと動かない場合があるので注意。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0