要求パケットのボディ部の読み出し

 


通常は、ボディ部分は要求パラメタとしてgetParameterなどのメソッドで読み出せばこと足りる。しかしながら、(名前、値)のデータ以外のデータ(例えばファイル)を取り込む必要がある場合は、ServletInputStreamBufferReaderを介して読み出すことになる。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)となる。%59ASCII”Y”なのでこの表のようにエンコードされている。この文字列をURLDecoder.decodeなるメソッドを通すだけで“firstName=純一郎&familyName=小泉”と正しいUnicodeの文字列に変換されており、便利である。ちなみにUnicodeでの“純一郎”は (&7D14, &4E00, &90CE)である。

 

java.net.URLDecoderというクラスはJ2Sev1.4からはpublic static String decode(String s)というメソッドは廃止になりエンコーディングを明示的に指定するように修正されていることに注意されたい。

 

 

 

前節     目次     次節