java - 已为此响应调用 getOutputStream()

标签 java jsp tomcat

我用谷歌搜索错误消息 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)

最佳答案

好吧,您应该使用 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>

刷新/关闭OutputStream并在完成后返回。

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

关于java - 已为此响应调用 getOutputStream(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56078675/

相关文章:

javascript - 在html输入文本框中存储字符串数组的值

jsp - 如何从jsp内部的HTML属性中转义值以避免XSS攻击?

java - Tomcat 自动关闭

spring - 获取 java.lang.ClassNotFoundException : com. mysql.jdbc.Driver 异常

java - 防止JPopupMenu被任务栏覆盖

java - 一个微调器中是否可以有两种不同的字体大小

java - 从 Java 发送数据并在 Node.js 应用程序中接收

javascript - onclick 按钮多个文本框只读属性应在 jsp 中更改

java - On Click 方法不适用于通过膨胀布局获得的按钮!

jsp - 没有地址在使用时的tomcat Address already in use错误