Web アプリケーションの POST 送信 日本語入力対応
- サーブレット POST 編 -
技術情報 TOP へ

本ページでの使用環境
OS:Windows XP SP 2
Java:JDK 5.0 UPDATE 8
Tomcat:5.0.28
ここでは、JDK 5.0 UPDATE 8 、Tocmat 5.0.28 がインストールされ 使用できる環境が既に作成されていることを前提として説明いたします。 これらのインストール及び環境作成については下記のページを参照ください。

JDK のインストール -Windows 編-

Tomcat 5.0.* 系のインストール -Windows 編 ( exe , zip ファイル ) -
* ここでは zip ファイルを使用して C:/jakarta-tomcat-5.0.28 に Tomcat をインストールした前提とします。
TOMCAT_HOME は、C:/jakarta-tomcat-5.0.28 です。 ( exe ファイルを使用してインストールした場合も本ページの手順と同様です。 )




サーブレットを使用した Web アプリケーションは、そのままでは HTTP POST 送信時に日本語入力された文字に含めると文字化けになります。 ここでは、HTTP POST 送信時に日本語入力された文字に対応します。

サーブレットフィルターの作成

まず、以下のページを参考にサーブレットフィルターを作成します。

サーブレットの様々なサンプル - フィルターの使用 -
setCharacterEncoding の追記

上記で作成したフィルタークラス ( javax.servlet.Filter を実装した ) に以下の処理を追記します。

request.setCharacterEncoding("SJIS");

● ここでは、クライアント - サーバ間で使用する符号化方式を Shift_JIS とします。

ここでは、以下の DeffFilter クラスを使用して例を記述します。
doFilter メソッド内で chain.doFilter メソッドが実行される前に記述します。

ファイル名:DeffFilter.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;

public class DeffFilter implements Filter {
	
	public void init (FilterConfig config) throws ServletException {		
	  System.out.println("filter init ");
	}	
	
	public void doFilter (ServletRequest request, 
	  ServletResponse response, FilterChain chain)
	  throws IOException, ServletException {

	  /* リクエストに対する処理を記述します。chain.doFilter の前 */
	  System.out.println("exex doFilter");

	 /* 日本語対応のため、以下の処理を追記します。 */
	  request.setCharacterEncoding("SJIS");

	  chain.doFilter(request, response);	

	  /* レスポンスに対する処理を記述します。 chain.doFilter の後 */

	}
	
	public void destroy () {
	}
}
上記の追記後、ビルド、再起動するとHTTP POST 送信時に日本語入力された文字が使用できます。



参考情報

一般的に HTTP 通信の POST 送信では、以下のフローとなります。

1、Web クライアント ( ブラウザなど ) が URL にアクセスし、リクエストをサーバ側に送信します。
2、Web サーバは対象の Web ページをレスポンスとして Web クライアントに送信します。
3、Web クライアントから Form 内のエレメントに入力を行いWeb サーバへ POST 送信します。

上記 1 で Web クライアントで使用できるの符号化方式を Accept-Charset 属性で指定します。 上記 2 で Web サーバは Web クライアントから指定された符号化方式 ( 文字セット) が使用可能 であれば ( 使用不可ならば、エラーを返却 ) 、レスポンスを返却 ( Content-Type の charset を指定 ) し、 Web クライアントではその指定に従った charset を使用することになります。

また、HTTP 通信では、通常、POST 送信時にパラメータは URL エンコードが行われます。

URL エンコードを行った場合、送信されるデータは、すべて ASCII 文字と なります。( ASCII 以外の文字は「 %xx 」形式に変換。 xx は 16 進数。 ) システムで使用する符号化方式の違いにより、URL エンコードを行ったデータは 変化しますが、上述いたしましたように URL エンコードを行った場合、 送信されるデータは、すべて ASCII 文字となります。送信されたデータを受け取った後の処理に ついては Web サーバ側の実装に依存されます。( このページで対応したのはここです。 )

参考
RFC 2616 14.2 Accept-Charset

符号化方式が変われば、URL エンコードされた値も変わります。以下に例を挙げます。

データ:あいうえお

・Shift_JIS ( 及び Windwos-31J )
%82%A0%82%A2%82%A4%82%A6%82%A8

・UTF-8
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A

Web クライアントは Internet Explorer 6.0 SP2

上述の処理を理解することで、文字化けの予測や原因調査に役立つと思います。
技術情報 TOP へ


Google
WWW を検索 whitemark.co.jp を検索

Copyright © 2006 by WhiteMark, All rights Reserved. Last Modified: 2006/05