已经为此响应调用了getOutputStream()我谷歌的错误信息getOutputStream() has already been called for this response ,许多人说这是因为空格或换行符后<%或%>,但在我的代码中,没有空格或换行符。我在linux上使用tomcat6。<%@
page import="java.servlet.*,
javax.servlet.http.*,
java.io.*,
java.util.*,
com.lowagie.text.pdf.*,
com.lowagie.text.*"
%><%
response.setContentType("application/pdf");
Document document = new Document();
try{
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter.getInstance(document, buffer);
document.open();
PdfPTable table = new PdfPTable(2);
table.addCell("1");
table.addCell("2");
table.addCell("3");
table.addCell("4");
table.addCell("5");
table.addCell("6");
document.add(table);
document.close();
DataOutput dataOutput = new DataOutputStream(response.getOutputStream());
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for(int i = 0; i < bytes.length; i++)
{
dataOutput.writeByte(bytes[i]);
}
}catch(DocumentException e){
e.printStackTrace();
}%>〜org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
3 回答

慕的地6264312
TA贡献1817条经验 获得超6个赞
好吧,您应该使用servlet而不是JSP,但如果您确实需要...在页面顶部添加此指令:
<%@ page trimDirectiveWhitespaces="true" %>
或者在你的web.xml的jsp-config部分
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <trim-directive-whitespaces>true</trim-directive-whitespaces> </jsp-property-group></jsp-config>
此外flush
/ close
中OutputStream
和完成后返回。
dataOutput.flush();dataOutput.close();return;

叮当猫咪
TA贡献1776条经验 获得超12个赞
这里的问题是你的JSP直接与响应交谈OutputStream
。这在技术上是不被禁止的,但这不是一个好主意。
具体来说,您可以调用response.getOutputStream()
和写入数据。稍后,当JSP引擎尝试刷新响应时,它会失败,因为您的代码已经“声明”了响应。应用程序可以调用getOutputStream
或getWriter
响应任何给定的响应,不允许同时执行这两个操作。JSP引擎使用getWriter
,所以你不能调用getOutputStream
。
您应该将此代码编写为Servlet,而不是JSP。JSP仅适用于JSP中包含的文本输出。您可以看到JSP中没有实际的文本输出,它只包含java。

慕少森
TA贡献2019条经验 获得超9个赞
在try / catch的末尾添加以下内容,以避免JSP引擎通过getWriter()刷新响应时出现的错误
out.clear(); // where out is a JspWriter
out = pageContext.pushBody();
如前所述,这不是最佳做法,但它可以避免日志中的错误。
添加回答
举报
0/150
提交
取消