フィルタとBeansを利用した日本語文字化け対策 - JSP

こちらの記事では、HTMLフォームからJSPにポストする例を紹介しました。正しく動作はするのですが日本語をポストすると文字化けしてしまします。この記事ではFilterとBeanを使った日本語をポストしても文字化けしない対策方法を紹介します。

コード (HTMLフォーム:addressbean.html)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
    <title>Address Book Input Form</title>
  </head>
  <body>
    <FORM method="POST" action="addressbean.jsp">
      <p>お名前と住所を入力してください</p>
      お名前 : <INPUT type="text" name="name"><br><br>
      住所 : <INPUT type="text" name="address"><br><br>
      <INPUT type="submit" value="SEND">
      <INPUT type="reset" value="RESET">  
    </FORM>    
  </body>
</html>

解説

HTMLフォームを用意します。Action先はJSPファイルにします。

コード(JSPページ:addressbean.jsp)

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%-- UserBeanオブジェクトを sessionスコープとして作成 --%>
<jsp:useBean id="ub" scope="session" class="webApplication18.UserBean"/>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Address</title>
  </head>
  <body>
    <h1>Address</h1>

<%-- UserBean オブジェクトにデータを格納 --%>
<!-- NO display -->
<%-- 通常は下記コードを使う --%>
<jsp:setProperty name="ub" property="name" value='<%= request.getParameter("name")%>' />
<jsp:setProperty name="ub" property="address" value='<%= request.getParameter("address")%>' />
<%--
古いTomcatはこちらのコードが推奨
<jsp:setProperty name="ub" property="name" value="<%= request.getParameter("name") %>" />
<jsp:setProperty name="ub" property="address" value="<%= request.getParameter("address") %>" />
--%>

    <%-- UserBean オブジェクトからデータを取り出し --%>
    <!-- Display -->
    お名前 = <jsp:getProperty name="ub" property="name"/><BR>
    住所 = <jsp:getProperty name="ub" property="address"/><BR>
  </body>
</html>

解説

useBeanを用いてUserBeanオブジェクトの利用と初期化をします。
 <jsp:useBean id="ub" scope="session" class="webApplication18.UserBean"/>

setPropertyを用いてUserBeanオブジェクトのname,addressプロパティにPOSTされた値をセットします。
 <jsp:setProperty name="ub" property="name" value="<%= request.getParameter("name") %>" />
 <jsp:setProperty name="ub" property="address" value="<%= request.getParameter("address") %>" />

getPropertyを用いてUserBeanオブジェクトに格納されたプロパティを表示します。
 お名前 = <jsp:getProperty name="ub" property="name"/><BR>
 住所 = <jsp:getProperty name="ub" property="address"/><BR>

コード (Bean: UserBean.java)

package webApplication18;

import java.io.*;

public class UserBean implements Serializable {

  private String name;
  private String address;

  /** Creates a new instance of UserBean */
  public UserBean() {
    name = "No Name";
    address = "No Address";
  }

  public String getName() {
    return name;
  }

  public void setName(String na) {
    name = na;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String adr) {
    address = adr;
  }
}

解説

name,addressプロパティのゲッター、セッターメソッドを実装します。

コード (フィルタ: CharacterEncodingFilter.java)

package webApplication18;

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

public class CharacterEncodingFilter implements javax.servlet.Filter {

  public void init(FilterConfig config) {
    // BLANK.
  }

  public void destroy() {
    // BLANK.
  }

  public void doFilter(ServletRequest servletRequest,
          ServletResponse servletResponse, FilterChain filterChain)
          throws ServletException, IOException {
    servletRequest.setCharacterEncoding("UTF-8");
    filterChain.doFilter(servletRequest, servletResponse);
  }
}

解説

public void doFilter(ServletRequest servletRequest,
  ServletResponse servletResponse, FilterChain filterChain)
  throws ServletException, IOException {
doFilterメソッドを実装します。

servletRequest.setCharacterEncoding("UTF-8");
エンコーディングをUTF-8に設定します。

filterChain.doFilter(servletRequest, servletResponse);
filterChain.doFilter()メソッドを呼び出し次のフィルタを実行します。

コード (web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
    "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <!--Beanの処理で日本語が文字化けしないための設定-->
  <filter>
    <!-- フィルタ名を記載します。 -->
    <filter-name>EncodeFilter</filter-name>
    <!-- フィルタ処理の際のクラスを指定します。-->
    <!-- SetCharacterEncodingFilterクラスはfiltersパッケージ内にあります。 -->
    <filter-class>webApplication18.CharacterEncodingFilter</filter-class>
    <!-- パラメータ値にエンコード方式を指定します。 -->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>

  <!-- すべてのURLパターンでフィルタ処理が行われるように指定します。 -->
  <filter-mapping>
    <filter-name>EncodeFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

解説

filterタグを記載します。filter-nameにはフィルタを識別する名前(任意)を記述します。filter-classはフィルタのクラス名を記述します。init-paramniにはエンコード方式を記述します。
また、filter-mappingタグも記述します。filter-nameには適応するフィルタ名(filterタグで定義したフィルタ名)を記述します。url-patternにはフィルタを適用するパターンを記述します。今回はすべてのURLにフィルタを適用するためパターンは"/*"と記述しました。

実行結果

Webフォーム表示画面


日本語を入力し[SEND]ボタンを押します。


文字化けせずに表示されます。


著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-06
作成日: 2011-02-12
iPentec all rights reserverd.