●Tomcat アプリケーションの日本語化
今回は日本語をプロジェクトで扱えるようにしてみます。
strutsのAction Formはブラウザからのリクエストデータを格納する際、何もエンコード処理をしてくれませんので、何らかの方策をとらないと日本語がAction Formに文字化けして格納されてしまいます。
Servlet2.3から、Filter機能が実装されましたのでこれを利用しましょう。Tomcat5.0はServlet2.3に対応しています。Filterはリクエストデータがサーブレット(strutsの場合はAction Servlet)に届く前に処理される機能なので、ここでエンコード処理をほどこしていれば、Action以降のプログラムでいちいちエンコード用のプログラミングをする必要がなくなるわけです。(Filter機能がもしなかったら、Action Formのresetメソッドなりgetterなりで全部エンコードプログラミングしなきゃならないわけで…うぇ〜)
Filterとして登録するエンコード用クラスは、Tomcatでサンプルアプリケーションをインストールしていれば、<tomcatインストール先>webapps/examples/WEB-INF/classes/filters にSetCharacterEncodingFilter.javaがあるそうなのでそれを使います。ない場合は、ここからダウンロードしてください。
「filters」というパッケージを作成して、そこにSetCharacterEncodingFilter.javaを配置しましょう。
![]()
次に配置したフィルタがコンテナに使用されるように、web.xmlを編集します。WEB-INF/web.xmlをエディタで開いて、
<web-app>のすぐ下あたりに以下の記述をします。
<!-- Jananese Encoding Filter Setting -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Windows-31J</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
また、struts-blankのコピーからアプリケーションを作成している場合、web.xmlのdtd定義が
古いです。Filterが利用できるよう、以下のようにヘッダーを編集しましょう。
<?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">
他にもいくつか約束事が。
1.作成するJSPファイルは全てエンコード「MS932」で保存してください。(eclipseのデフォルト・テキストファイル・エンコード)
2.JSPファイルの1行目には必ず以下の内容を記述してください。
<%@ page contentType="text/html; charset=Windows-31J" language="java"%>
3.<head>タグの中に以下のタグを記述してください。
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
これで準備完了。日本語文字をPOSTしてみてください。機種依存文字もかなりいけるはずです。(まるいち、とか、
かっこかぶ、とか)
…じゃGETは?というと、ここまでの対処じゃまだ化けてしまいます。
まずtomcatにGETリクエストの場合でもFilterを経由するように設定しなければなりません。
<tomcatインストール先>conf/server.xmlをエディタで開き、
「<Connector port="8009"…」で始まる箇所を探します。
「protocol="AJP/1.3"」の後ろ辺りに、
useBodyEncodingForURI="true"
を付加してください。(/>の前)
さらに、先ほど配置したSetCharacterEncodingFilterクラスを編集します。doFilterメソッドを以下のように書き換えてください。
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)) {
// リクエストがGETメソッドなら、UTF-8エンコーディングを使用
if (request instanceof HttpServletRequest
&& "GET".equalsIgnoreCase(((HttpServletRequest) request)
.getMethod())) {
request.setCharacterEncoding("UTF-8");
// リクエストがPOSTメソッドなら、web.xmlに指定した文字エンコーディングを使用
} else {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
おまけ:
ブラウザからのリクエストデータを、データベースに格納する際、以下の注意が必要です。
・データベースがPostgreSQLでかつ、データ文字コードがEUC-JP
=>問題無し
・データベースがOracleでかつ、データ文字コードがJA16SJIS、またはJA16EUCの場合
=>「〜」が化ける
詳細は、翔泳社のDBマガジン2006年2月号の特集記事を参照ください。
で、Oracleの「〜」が化け対処方法は、
・データ文字コードJA16SJISTILDEにするか、JA16EUCTILDEにすることです。
一度作成したデータベースの文字コードは変更できませんので、expユーティリティでデータ退避の上再作成しかないですね…