1

サーブレットクラスのdoPostメソッドでこれを行うときにPrintWriterでIOExcepitonを取得します。

doPost(HttpServletRequest request,
        HttpServletResponse response){
    String replyMessage = "STATUS_ACCEPT";
    response.setStatus(HttpServletResponse.SC_OK);
    response.setContentType("text/plain; charset=utf-8");

    response.setContentLength(replyMessage.length());
    response.setIntHeader("content-length", replyMessage.length());
    response.getWriter().println(replyMessage);//getting IOException closed on calling this method
    response.flushBuffer();}

データの送信に出力ストリームを使用する場合、エラーは発生しません。

    ServletOutputStream outputStream = response.getOutputStream();
    byte[] result = "STATUS_ACCEPT".getBytes("UTF-8");

    response.setStatus(HttpServletResponse.SC_OK);
    response.setContentType("text/plain; charset=utf-8");

    response.setContentLength(result.length);
    response.setIntHeader("content-length", result.length);

    outputStream.write(httpOutData);

IOExceptionを取得しないためにプリントライターをどのように使用する必要がありますか?

4

2 に答える 2

4

理由のほとんどはこれです:

response.setContentLength(replyMessage.length());
// ...
response.getWriter().println(replyMessage)

つまり、応答の内容は、setContentLenght次のようにアナウンスされるよりも少なくとも1バイト長くなります。末尾の改行に。が追加されprintln()ます。おそらく違いは、CRとLFの2バイトです。

注:これを修正しても、一般的なケースでは問題が発生します。コンテンツの長さを文字数に設定します。UTF -8エンコーディングでは必ずしもバイト数とは限りません。 setContentLength()バイト数が必要です。

したがって、content-lengthを設定しないと自動的に計算されるため、content-lengthをいじるすべてのコードを削除することをお勧めします。

于 2012-09-03T18:14:07.867 に答える
1
PrintWriter pw = response.getWriter();
pw.println("hello");     // flush is not required here....
于 2012-09-03T18:03:37.067 に答える