きときと - Java - TomcatEncoding - 4.0.3

Tomcat4.0.3において、クライアントの文字エンコーディングを指定する方法です。

サンプルのダウンロード tomcat-encoding-4_0_3.lzh

Tomcat4では、ServletAPI2.3からサポートされたフィルタ機能と、ServletRequest#setCharacterEncoding()によって、
より標準的・汎用的な方法で文字コード指定ができるようになりました。
Tomcat3.3よりも手順は複雑ですが、適用するURLを指定できるなど、柔軟性は上がっています。


最初に、以下のようなSetCharacterEncodingFilter.java を定義します。
これは
$TOMCAT_HOME/webapps/examples/WEB-INF/classes/filters
にある同名のファイルと全く同じです。(コメントは外しています。)
少し長いので、下のコードをコピーするか、元々あるものを使います。

WEB-INF/classes/filters/SetCharacterEncodingFilter.java
package filters;

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;
import javax.servlet.UnavailableException;

/**
* Example filter that sets the character encoding to be used in parsing the
* incoming request, either unconditionally or only if the client did not
* specify a character encoding.
*/
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;

/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}

/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}

/**
* Place this filter into service.
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}

/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
* null.
*/
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}



この SetCharacterSetEncodingFilter.java をコンパイルして、SetCharacterSetEncodingFilter.class を作成しておきます。

次に、web.xml でフィルタの設定を行います。下のようにfilter要素とfilter-mapping要素を追加します。
filter - init-param の encodingパラメータでクライアントの文字コード(ここではShift_JIS)を指定します。
filter-mapping の url-pattern で対象URLを指定します。
これも
$TOMCAT_HOME/webapps/examples/WEB-INF の web.xml
に同様の記述があります。

WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<!-- Example filter to set character encoding on each request -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>


必要な設定は以上です。
動作確認のため、次の index.html と ja403.jsp を使います。ソースはもちろんShift_JISで保存してください。

index.html
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>Tomcat4.0.3</title>
</head>
<body>
<form action="ja403.jsp" method="get">
名前(日本語で): <input type="text" name="name" value="日本語">
<input type="submit" value="送信">
</form>
</body>
</html>




ja403.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%
String name = request.getParameter("name");
//コンソールに出力する
System.out.println("name: " + name);
%>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
</head>
<body>
<%-- ブラウザに出力する --%>
名前: <b><%= name %></b>
</body>
</html>
ソース中で明示的な文字コード変換をしていないことが分かると思います。




各ファイルの配置は以下のようになります。

+ webapps/
+ nihongo4/
index.html
ja403.jsp
+ WEB-INF/
web.xml
+ classes/
+ filters/
SetCharacterEncodingFilter.java
SetCharacterEncodingFilter.class








ご意見・ご感想は メール kito@kun.ne.jp か掲示板 http://6005.teacup.com/kitobbs/bbs で。


LastUpdate: 2002/03/22