サーブレットでの文字化け対策

サーブレットで日本語を表示させるにはどうしたら良いのでしょうか。

まず、前回の記事で作成したサーブレットの一部を変更して、日本語を出力できるか試してみます。

doGet()メソッドを下記のように変更します。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Encoding Sample</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Encoding Sample</h1>");
    out.println("<p>こんにちは。</p>");
    out.println("</body></html>");
}

これをWebブラウザで表示すると、下記のように文字化けしてしまいます。

文字化けサンプル

これは、Webブラウザ側の問題ではなく、サーブレットが日本語に対応していないためです。

文字エンコーディング

日本語が文字化けしてしまうのは、サーブレットが日本語の文字コードに対応していないためです。
文字コードに対応させるためには、文字エンコーディングと呼ばれる処理を行う必要があります。

文字コードとは文字に割り当てられた「数字」のことで、エンコードは文字と数字をマッピングする方式のことです。

では、その文字エンコーディングはどのように実現すれば良いのでしょうか。

フィルタ

文字エンコーディングを行うには、フィルタを使用します。

フィルタとはWebクライアントとサーバー間のリクエスト・レスポンス時に何らかの処理を行う機能のことです。

フィルタ

このフィルタ機能を利用して文字エンコーディングを実現します。
フィルタは、文字エンコーディングの他にも、ログの生成や認証などの処理にも使用されます。

フィルタの作成手順

フィルタには、Webアプリケーションへリクエストが渡される前、または、Webクライアントへレスポンスを返した後に実行する処理を実装します。

現在のプロジェクトを選択した状態で、メニューから「ファイル」-「新規」-「その他」をクリックします。

プロジェクト選択

「ファイル」-「新規」-「その他」

「ウィザードを選択」では、「Web」から「フィルター」を選択して、「次へ」をクリックします。

ウィザード選択

「フィルターの作成」画面に遷移します。

フィルタの作成

「Javaパッケージ」欄には「filter」、「クラス名」欄には「SampleFilter」と入力し、「次へ」をクリックします。

フィルター・マッピング

「フィルター・マッピング」-「URLパターン/サーブレット名」欄には、「/SampleFilter」と入力されています。「編集」をクリックして、「/*」に変更します。これにより、このEclipseプロジェクトの全サーブレットがフィルタ対象になります。

最後に「完了」をクリックします。

すると、プロジェクトに「filter」パッケージと「SampleFilter.java」が作成されます。

フィルタサンプル

「SampleFilter.java」をダブルクリックして開いてください。

SampleFilter.javaを開くと、いくつか警告が表示されています。
まずはこの警告を消してください。警告の消し方はこちらを参照してください。

doFilter()メソッドにリクエスト・レスポンス時のエンコード処理を記述します。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
    // place your code here
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=UTF-8");
    // pass the request along the filter chain
    chain.doFilter(request, response);
}

これでWebブラウザ上に日本語が表示されるようになります。

サーブレットで日本語表示