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

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


三国纷争
浏览 2095回答 3
3回答

慕的地6264312

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

叮当猫咪

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

慕少森

在try / catch的末尾添加以下内容,以避免JSP引擎通过getWriter()刷新响应时出现的错误out.clear(); // where out is a JspWriterout = pageContext.pushBody();如前所述,这不是最佳做法,但它可以避免日志中的错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java