已经为此响应调用了 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)

根本原因

java.lang.IllegalStateException: getOutputStream() has already been called for this response
    org.apache.catalina.connector.Response.getWriter(Response.java:610)
    org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
    org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
    org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
    org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
    org.apache.jsp.Account.Domain.testPDF_jsp._jspService(testPDF_jsp.java:94)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    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)

原文由 Southsouth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

好的,您应该使用 servlet 而不是 JSP,但是如果您确实需要……在页面顶部添加此指令:

 <%@ page trimDirectiveWhitespaces="true" %>

或者在 jsp-config 部分你的 web.xml

 <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;

原文由 RealHowTo 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

原文由 skaffman 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题