首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >已经为此响应调用了getOutputStream()

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

Stack Overflow用户
提问于 2009-11-22 01:37:59
回答 12查看 224.7K关注 0票数 63

我在谷歌上搜索了错误信息getOutputStream() has already been called for this response,很多人说这是因为<%%>后面的空格或换行符,但在我的代码中,没有空格或换行符。我在linux上使用tomcat6。

代码语言:javascript
复制
<%@
    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();
    }

%>

~

代码语言:javascript
复制
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)

根本原因

代码语言:javascript
复制
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)
EN

回答 12

Stack Overflow用户

发布于 2009-11-22 01:43:40

这里的问题是您的JSP直接与响应OutputStream对话。从技术上讲,这并不是禁止的,但这在很大程度上不是一个好主意。

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

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

票数 39
EN

Stack Overflow用户

发布于 2012-09-07 15:23:22

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

代码语言:javascript
复制
out.clear(); // where out is a JspWriter
out = pageContext.pushBody();

如前所述,这不是最佳实践,但它避免了日志中的错误。

票数 9
EN

Stack Overflow用户

发布于 2014-08-28 00:25:48

我只在第二次去出口的时候遇到了这个问题。一旦我添加了:

代码语言:javascript
复制
response.getOutputStream().flush();
response.getOutputStream().close();

导出完成后,我的代码开始一直工作。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1776142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档