我正在尝试使用JSP中的ServletOutputStream
打开pdf文件。代码是:
response.setContentLength(statementVO.getOutputStream().size());
response.setContentType("application/pdf");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
ServletOutputStream out = response.getOutputStream();
out.write(statementVO.getOutputStream().toByteArray());
out.flush();
out.close();
我收到以下错误
WAS 6.0 - Response already committed / OutputStream already obtained
答案 0 :(得分:3)
您收到此错误是因为您正在使用JSP文件而不是Java类来编写Java代码.StM文件旨在提供模板文本,如HTML / CSS / JS等。 JSP隐式使用response.getWriter()
来编写模板文本。每当您在JSP中调用response.getOutputStream()
时,您都可能会收到此错误,因为您无法打开 Writer
和OutputStream
。您只能打开其中一个,另请参阅链接的javadoc。
要解决这个问题,基本上有两种解决方案:
在真正的Java类而不是JSP文件中执行此操作。 Servlet类是最适合的地方。您可以找到here基本示例。
从JSP文件中删除所有模板文本(包括空格和换行符!),以便它不会隐式调用response.getWriter()
。有关详细说明,另请参阅this answer。
答案 1 :(得分:0)
如果你想每次发送pdf文件作为响应,最好使用servlet而不是jsp。但如果是条件状态,则必须以有条件的方式发送响应!你不能两次写回复。