getOutputStream () wurde bereits für diese Antwort aufgerufen
Habe bei google die Fehlermeldung getOutputStream() has already been called for this response
und viele Leute gesagt, dass es ist, weil der Raum oder die newline nach <%
oder %>
, aber in meinem code gibt es keinen, der ein Leerzeichen oder ein Zeilenumbruch. Ich benutze tomcat6 auf 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)
Ursache
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)
InformationsquelleAutor der Frage Southsouth | 2009-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, Sie sollte mit einer servlet nicht eine JSP-aber wenn Sie wirklich brauchen, um... fügen Sie diese Richtlinie an der Spitze Ihrer Seite:
Oder in der jsp-config-Abschnitt Ihrer web.xml
Auch
flush
/close
dieOutputStream
und zurück, wenn Sie fertig.InformationsquelleAutor der Antwort RealHowTo
Das Problem hier ist, dass Ihr JSP ist im direkten Gespräch die Antwort
OutputStream
. Dieses technisch nicht verboten, aber es ist sehr viel nicht eine gute Idee.Speziell, rufen Sie
response.getOutputStream()
und schreiben von Daten. Später, wenn die JSP-engine versucht, Spülen Sie die Antwort, es schlägt fehl, da der code bereits ", behauptete" die Antwort. Eine Anwendung kann entweder telefonischgetOutputStream
odergetWriter
auf jede gegebene Antwort, es ist nicht erlaubt, beides zu tun. JSP-engines verwendengetWriter
und so kann man nicht nennengetOutputStream
.Sollten Sie das schreiben als ein Servlet, nicht JSP. JSPs sind nur wirklich geeignet für die textuelle Ausgabe die in der JSP. Sie können sehen, dass es keine tatsächlichen text-Ausgabe in Ihrer JSP, es enthält nur java.
InformationsquelleAutor der Antwort skaffman
Fügen Sie den folgenden in das Ende des try/catch um den Fehler zu vermeiden, die erscheint, wenn die JSP-engine spült die Reaktion über getWriter()
Als festgestellt wurde, das ist nicht best practice, aber es vermeidet die Fehler in den Protokollen.
InformationsquelleAutor der Antwort pnairn
Ich gerade erlebt dieses problem.
Das problem wurde verursacht von meinem controller-Methode versucht Rückgabetyp String (view name)wenn er sich beendet. Wenn die Methode verlassen, eine zweite Antwort stream eingeleitet werden würde.
Ändern der controller-Methode Rückgabetyp zu void das problem behoben.
Ich hoffe das hilft wenn noch jemand Erfahrungen mit diesem problem.
InformationsquelleAutor der Antwort Dan Torrey
Ich hatte dieses problem erst das zweite mal, ich ging zu exportieren. Einmal habe ich Hinzugefügt:
nachdem der export fertig war, meinen code zu arbeiten begann.
InformationsquelleAutor der Antwort michaelp
Hier ist was für mich gearbeitet in ähnlicher Fall.
Nachdem Sie fertig zu schreiben, in der
Servlet
OutputStream
einfach anrufenresponse.sendRedirect("yourPage.jsp");
. Dazu führen würde, dass die Einleitung einer neuen Anfrage aus dem browser, daher vermeiden Sie das schreiben in den gleichen output-stream.InformationsquelleAutor der Antwort Igor
JSP ist s presentation framework und ist in der Regel eigentlich nicht enthalten keine Programmlogik. Als skaffman vorgeschlagen, die Verwendung reinen servlets, oder jede MVC-web-framework, um das zu erreichen, was Sie wollen.
InformationsquelleAutor der Antwort Bozho
Dieser Fehler war vorkommenden in meinem Programm, weil die Ergebnismenge, die Berufung war mehr Spalten angezeigt werden, in das PDF-Dokument über die Datenbank enthalten. Zum Beispiel enthält die Tabelle mit 30 Feldern, aber das Programm aufrufen 35 (resultset.getString(35))
InformationsquelleAutor der Antwort Wandile Nxumalo
Ich habe den gleichen Fehler mit
response.getWriter()
vor einemrequest.getRequestDispatcher(path).forward(request, response);
. So starten funktioniert, wenn ich es ersetzen durchresponse.getOutputStream()
InformationsquelleAutor der Antwort Daniel De León
Verwenden Glassfish 4.0 statt. Das stellt nur ein problem in Glassfish 4.1.1 Version.
PT-BR:
O Glasfish 4.0. Este parece ser um problema apenas no Glassfish 4.1.1.
InformationsquelleAutor der Antwort Max
In einigen Fällen kann dieser Fall tritt ein, wenn Sie erklären
nach dem deklarieren oder mit
RequestDispatcher
.Ich auf dieses ähnliche problem beim erstellen einer einfachen
LoginServlet
wo ich definiert habenWriter
nach dem deklarierenRequestDispatcher
.Versuchen zu definieren
Writer
class-Objekt vorRequestDispatcher
Klasse.InformationsquelleAutor der Antwort Aman Kumar