要求パケットのボディ部の読み出し
|
|
通常は、ボディ部分は要求パラメタとしてgetParameterなどのメソッドで読み出せばこと足りる。しかしながら、(名前、値)のデータ以外のデータ(例えばファイル)を取り込む必要がある場合は、ServletInputStreamやBufferReaderを介して読み出すことになる。BufferReaderはエンコーディングの変換をやって文字データとしてユーザに渡してくれる。
POST要求でクライアントが要求パラメタをボディに入れて送信した場合は、データはURLエンコーディングされており、7ビットASCIIコードのバイト列となっている。これをUnicodeに変換したクエリ文字列として受理するサンプルとして次のコードを示す。
package
basic_servlets; import
java.io.*; import
java.lang.*; import
java.util.*; import
java.net.*; import
javax.servlet.*; import
javax.servlet.http.*; /** * RequestBodyDumpViaStreamは、InputStreamで要求パケットのボディを読み出し、 * コンソールに表示する。 * 作成日 : (01/06/06 11:28:09) * @author: Terry */ public class
RequestBodyDumpViaStream extends javax.servlet.http.HttpServlet { /** * Process incoming HTTP GET requests */ public void
doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse
response) throws javax.servlet.ServletException, java.io.IOException { performTask(request,
response); } /** * Process incoming HTTP POST requests */ public void
doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse
response) throws javax.servlet.ServletException, java.io.IOException { performTask(request,
response); } /** * 本サーブレット情報の文字列を返す。 */ public
String getServletInfo() { return
"RequstBodyDumpViaStream, Version 1.0 by Terry"; } /** * Process incoming requests */ public void
performTask(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) { try {
// Insert user code from here.
ServletInputStream sis = request.getInputStream(); //バイト入力用ストリームを取得
byte[] bytes = new byte[1024];
//バイトの配列を用意する
int len = (sis.readLine(bytes,0,1024)); //一行読み出し(URLには改行符号は入らない)
String is="";
for (int i = 0; i < len; i++) {
//これを文字列に変換(上8ビットはゼロ)
is =is +(char)bytes[i]; }
System.out.println("URL encoded byte string: " + is);
String os = URLDecoder.decode(is); //URLDecoderは、SJISの漢字をUnicodeにまで変換してくれる! // String os =
URLDecoder.decode(is, "Shift_JIS"); //J2SDKのv1.4からはこちらを使用すること System.out.println("URL
decoded body string: " + os ); } catch(IOException
theException) {
theException.printStackTrace(); } catch(Exception
anotherException){
anotherException.printStackTrace(); } } } |
これで正しくコンソールに以下のように表示される:
URL encoded byte string: firstName=%8F%83%88%EA%98Y&familyName=%8F%AC%90%F2 URL decoded body string: firstName=純一郎&familyName=小泉 |
“純一郎”はShift_JISでは(&8F83, &88EA, &9859)となる。%59はASCIIの”Y”なのでこの表のようにエンコードされている。この文字列をURLDecoder.decodeなるメソッドを通すだけで“firstName=純一郎&familyName=小泉”と正しいUnicodeの文字列に変換されており、便利である。ちなみにUnicodeでの“純一郎”は (&7D14, &4E00, &90CE)である。
java.net.URLDecoderというクラスはJ2Sev1.4からはpublic static String decode(String s)というメソッドは廃止になりエンコーディングを明示的に指定するように修正されていることに注意されたい。