已发生响应已发生错误

时间:2013-03-27 16:47:07

标签: jsp servlets atg

我正在尝试使用Servlet以CSV格式下载数据,因为JSP包含在flush=true中。堆栈跟踪如下所示。报告按预期保存,但我可以在后面看到异常。能帮我解决一下原因吗?我关闭了OutputStream并试图冲洗缓冲区,但仍然没有运气。

1:36:38,304 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:619)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
    at atg.taglib.dspjsp.IncludeTag.flushOut(IncludeTag.java:873)
    at atg.taglib.dspjsp.IncludeTag.doEndTag(IncludeTag.java:773)

pResponse.setContentType(MS_EXCEL);
pResponse.setHeader(CONTENT,FILENAME);

outputStream = pResponse.getOutputStream();
pResponse.flushBuffer();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();

1 个答案:

答案 0 :(得分:0)

您正在呼叫pResponse.getOutputStream();这是非法的。您应该ServletResponse.getOutpustStream()使用ServletResponse.getWriter()作为ServletResponse.getWriter()。您不能在同一响应中使用它们。

由于JSP默认使用ServletResponse.getWriter()。您应该写信至ServletResponse.getOutpustStream()而不是{{1}}

这就是Java Doc所说的:

  

的getOutputStream ...

     

ServletOutputStream getOutputStream()抛出IOException

     

返回适合在响应中写入二进制数据的ServletOutputStream。 servlet容器不对二进制数据进行编码。

     

在ServletOutputStream上调用flush()会提交响应。   可以调用此方法或getWriter()来编写正文,而不是两者。

     

返回:用于写入二进制数据的ServletOutputStream      抛出: IllegalStateException - 如果已在此响应上调用getWriter方法