[Java] 55. Spring frameworkに文字化けを解決する方法(Encoding設定)


Study / Java    作成日付 : 2021/06/30 16:37:16   修正日付 : 2021/06/30 16:37:16

こんにちは。明月です。


この投稿はSpring frameworkに文字化けを解決する方法(Encoding設定)に関する説明です。


Eclipseで我々がプログラムを作成する時、基本的にファイルの文字コードを設定します。



上の例はjavaファイルとjspファイルに設定した文字コードですが、その以外にxmlファイルやpropertiesファイルにも我々は基本的にUTF-8を設定します。


このことはファイルに関する文字コードなのでサーバとクライアント間の通信の文字コードではありません。つまり、ブラウザから要請する時、その中では要請ヘッダー値があるし、このヘッダーの文字コードを指定しなければならないです。

また、ブラウザから要請したことをまた、controllerの値とviewのデータをパーシングして返却するけど、ここにも文字コードの設定が必要です。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <!-- 要請する時にヘッダーデータを送るためのformタグ -->
  <form method="post">
    <!-- テキストボックス -->
    <input type="text" name="paramdata"><br />
    <!-- submitボタン -->
    <input type="submit">
  </form>
  <!-- modelmapから貰うデータ -->
  ${Data} 
</body>
</html>
package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class Home {
  // 要請urlパターン(index.html) - get方式で要請する場合
  @RequestMapping(value = "/index.html", method = RequestMethod.GET)
  public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmapにデータ設定
    modelmap.addAttribute("Data", "");
    return "index";
  }

  // 要請urlパターン(index.html) - submitボタンを押下してpost方式で要請する場合
  @RequestMapping(value = "/index.html", method = RequestMethod.POST)
  public String post(@RequestParam String paramdata, ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmapにデータ設定
    modelmap.addAttribute("Data", paramdata);
    return "index";
  }
}


上のソースを作成して起動すればindex関数が呼び出してindex.jspファイルがパーシングになってテキストボックスとsubmitボタンがある画面が表示されます。

そしてtextboxで'こんにちは'というデータを入れてsubmitボタンを押下するとtextboxのデータがname名でparamdataの変数名に設定してformデータでpost関数が呼び出します。そしてパラメータparamdataでデータを受け取ってmodelmapのDataが設定された後、index.jspファイルがパーシングしてブラウザで応答します。



予想する結果はsubmitボタンの下に'こんにちは'というデータが表示することを予想しますが、文字化けになってどの文字か分からない文字になりました。


ここで我々はブラウザで要請するデータを文字コードを変換しなければならないです。

まず、web.xmlのfilter設定でSpringframeworkの文字コードを設定しましょう。

<!-- すべての要請はencodingFilterのフィルダー名を呼び出す。 -->
<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>
<!-- encodingパターン(Postなどのヘッダー値のエンコード設定) -->
<filter>
  <!-- フィルター名を設定 - encodingFilter -->
  <filter-name>encodingFilter</filter-name>
  <!-- 呼び出すクラス名を設定(package名含め) -->
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <!-- クラスに使うパラメータデータ -->
  <init-param>
    <!-- 文字コード設定 -->
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <!-- 文字コードを強制変換設定 -->
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>


link - CharacterEncodingFilter.html


filterに関するには以前の投稿で説明したことがあります。

link - [Java] 54. Spring frameworkでWeb filterを使う方法


文字変換クラスをフィルターに反映するとブラウザのすべての要請はCharacterEncodingFilterクラスを通ることになります。


そこですべての要請の文字コートは自動に設定され、controllerを呼び出します。その後は文字コードが設定された後なので文字化けがなくなります。


ここには文字化けを解決する方法に関して説明しましたが、実はFilterをセッション確認に使うログイン認証確認の以外に使う方法に関する説明でした。

様々なFilterをどの方法で使えるかを考えて見ましたが、よく使う文字化けの解決する方法のことを例にして説明しました。


ここまでSpring frameworkに文字化けを解決する方法(Encoding設定)に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

java
Study / Java」の他投稿
最新投稿