为了账号安全,请及时绑定邮箱和手机立即绑定

已经为此响应调用了getOutputStream()

已经为此响应调用了getOutputStream()

三国纷争 2019-08-08 16:51:45
已经为此响应调用了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>

此外flushcloseOutputStream和完成后返回。

dataOutput.flush();dataOutput.close();return;


查看完整回答
反对 回复 2019-08-08
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

这里的问题是你的JSP直接与响应交谈OutputStream。这在技术上是不被禁止的,但这不是一个好主意。

具体来说,您可以调用response.getOutputStream()和写入数据。稍后,当JSP引擎尝试刷新响应时,它会失败,因为您的代码已经“声明”了响应。应用程序可以调用getOutputStreamgetWriter响应任何给定的响应,不允许同时执行这两个操作。JSP引擎使用getWriter,所以你不能调用getOutputStream

您应该将此代码编写为Servlet,而不是JSP。JSP仅适用于JSP中包含的文本输出。您可以看到JSP中没有实际的文本输出,它只包含java。


查看完整回答
反对 回复 2019-08-08
?
慕少森

TA贡献2019条经验 获得超9个赞

在try / catch的末尾添加以下内容,以避免JSP引擎通过getWriter()刷新响应时出现的错误


out.clear(); // where out is a JspWriter

out = pageContext.pushBody();

如前所述,这不是最佳做法,但它可以避免日志中的错误。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 2094 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号