0

私は、JSPのフォームから入力を受け取り、JSONを使用してデータをサーブレットに渡す単純なAJAXアプリケーションをプログラミングしています。サーブレットには、次のような迅速で汚いコードがあります。

    char[] charBuffer = new char[500];
    String[] names;
    String[] values = new String[20];
    int amountRead;

    JSONObject jsonObject1;
    JSONObject jsonObject2;

    PrintWriter out = response.getWriter();
    BufferedReader in = request.getReader();

    amountRead = in.read(charBuffer);

    charBuffer[amountRead]='\0';
    String invalue = new String( charBuffer, 0, amountRead);

その後try、JSONオブジェクトでいくつかの処理を行うブロックが続きます。基本的には、演習として、同じフォームデータをやり取りして表示しようとしています。

問題は次のとおりです。もちろん、この迅速で汚いコードでは、リクエストから完全なメッセージを受け取る保証はありません。read()ストリームの終わりに達した場合にのメソッドが-1を返すことを知っているのでBufferedReader、次の追加を試みました。

    while( in.read() != -1 ) {
         amountRead = in.read(charBuffer); 
    }

ただし、これを実装すると、出力が空白になります。何も得られません。デバッガーでステップスルーしようとしても、そのwhileループが意図した効果をもたらさない理由は完全にはわかりません。

シンプルでバカなことだと思います。誰かが私のやり方の誤りを指摘するほど親切にできますか?いつものように、よろしくお願いします。

4

2 に答える 2

1

あなたは文字を読んでいて、EOSを取得しなかった場合はそれを捨てています。Javaでストリームを読み取る正しい方法は次のとおりです。

while ((count = in.read(buffer)) > 0)
{
   out.write(buffer, 0, count);
   // or
   String s = new String(buffer, 0, count);
   // or whatever else you want.
}

末尾のヌル文字の挿入も不要です。それはC-ismです。カウントを指定することですでに文字列を制限しているため、ヌル文字が表示されることはありません。

于 2013-02-11T22:55:57.310 に答える
1

このBufferedReader.readLine()メソッドは一度に正確に1行を読み取り、データが利用可能になるまで各読み取りはブロックされます。ストリームの終わりに達すると、nullを返します。

したがって、whileループで使用できます

String line;
BuffererReader br = request.getReader();
while ((line = br.readLine()) != null) { 
    //process the line here
}

また、Javaクラスをから逆シリアルGson化できるようなライブラリを使用することもできます。Reader

于 2013-02-11T23:00:15.250 に答える