3

我正在尝试使用 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();
4

1 回答 1

0

你打电话pResponse.getOutputStream();是非法的。你应该使用任何一个ServletResponse.getOutpustStream()for ServletResponse.getWriter()。您不能在同一响应中同时使用两者。

ServletResponse.getWriter()由于默认使用 JSP 。你应该写信ServletResponse.getWriter()ServletResponse.getOutpustStream()

这就是 Java Doc 所说的:

获取输出流...

ServletOutputStream getOutputStream() 抛出 IOException

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

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

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

于 2013-03-27T17:23:29.863 回答