1

在 servlet 类的 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);

我应该如何使用 printwriter 没有得到 IOException?

4

2 回答 2

4

最喜欢的原因是这样的:

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

这意味着,您的响应内容至少比 宣布的长一个字节setContentLenght: 附加的尾随换行符println()。也许区别在于两个字节:CR 和 LF。

注意:如果您修复此问题,在一般情况下您仍然会遇到问题:您将内容长度设置为字符数,在 UTF-8 编码中并不总是字节数。 setContentLength()想要字节数。

因此,最好简单地删除所有摆弄内容长度的代码,因为如果您不设置它,它将自动计算。

于 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 回答