java - respuesta - getoutputstream() has already been called for this response
getOutputStream() ya ha sido llamado para esta respuesta (11)
Acabo de experimentar este problema.
El problema fue causado por mi método de control al intentar devolver el tipo de Cadena (nombre de vista) cuando sale. Cuando el método salga, se iniciará un segundo flujo de respuesta.
Cambiar el tipo de retorno del método del controlador a vacío resolvió el problema.
Espero que esto ayude si alguien más experimenta este problema.
Busco en google el mensaje de error getOutputStream() has already been called for this response
y mucha gente dijo que es por el espacio o nueva línea después de <%
o %>
, pero en mi código, no hay un espacio o una nueva línea. Estoy usando tomcat6 en Linux.
<%@
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)
causa principal
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)
Agregue lo siguiente al final del try / catch para evitar el error que aparece cuando el motor JSP vacía la respuesta mediante getWriter ()
out.clear(); // where out is a JspWriter
out = pageContext.pushBody();
Como se ha observado, esta no es la mejor práctica, pero evita los errores en sus registros.
De acuerdo, debería usar un servlet, no un JSP, pero si realmente necesita ... agregue esta directiva en la parte superior de su página:
<%@ page trimDirectiveWhitespaces="true" %>
O en la sección jsp-config tu web.xml
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
</jsp-property-group>
</jsp-config>
También flush
/ close
el OutputStream
y regrese cuando termine.
dataOutput.flush();
dataOutput.close();
return;
El marco de presentación de JSP es, en general, no se supone que contenga ninguna lógica de programa. Como sugirió skaffman, use servlets puros o cualquier framework web MVC para lograr lo que quiere.
El problema aquí es que su JSP está hablando directamente con la respuesta OutputStream
. Esto técnicamente no está prohibido, pero no es una buena idea.
Específicamente, llama a response.getOutputStream()
y escribe datos en eso. Más tarde, cuando el motor JSP intenta descargar la respuesta, falla porque su código ya ha "reclamado" la respuesta. Una aplicación puede llamar a getOutputStream
o getWriter
en cualquier respuesta dada, no está permitido hacer ambas cosas. Los motores JSP usan getWriter
, por lo que no puedes llamar a getOutputStream
.
Debería escribir este código como un servlet, no como un JSP. Los JSP solo son realmente adecuados para la salida textual tal como figura en el JSP. Puede ver que no hay salida de texto real en su JSP, solo contiene java.
En algunos casos, este caso ocurre cuando declaras
Writer out=response.getWriter
después de declarar o usar RequestDispatcher
.
Encontré este problema similar al crear un LoginServlet
simple, donde he definido Writer
después de declarar RequestDispatcher
.
Intente definir el objeto de la clase Writer
antes de la clase RequestDispatcher
.
Este error estaba ocurriendo en mi programa porque el conjunto de resultados llamaba a más columnas para mostrarse en el documento PDF que la base de datos contenida. Por ejemplo, la tabla contiene 30 campos pero el programa llamaba a 35 (resultset.getString (35))
Esto es lo que funcionó para mí en un caso similar.
Después de que termine de escribir en Servlet
OutputStream
simplemente llame a response.sendRedirect("yourPage.jsp");
. Eso provocaría el inicio de una nueva solicitud desde el navegador, por lo tanto, evite escribir en la misma secuencia de salida.
Tuve este problema solo la segunda vez que fui a exportar. Una vez que agregué:
response.getOutputStream().flush();
response.getOutputStream().close();
después de la exportación, mi código comenzó a funcionar todo el tiempo.
Use Glassfish 4.0 en su lugar. Esto resulta ser un problema solo en la versión de Glassfish 4.1.1.
PT-BR: utilice o Glasfish 4.0. Este parece ser un problema no meramente Glassfish 4.1.1.
request.getRequestDispatcher(path).forward(request, response);
el mismo error al usar response.getWriter()
antes de una request.getRequestDispatcher(path).forward(request, response);
. Así que empezar funciona bien cuando lo reemplazo por response.getOutputStream()