getOutputStream () a déjà été appelé pour cette réponse

Je google le message d’erreur getOutputStream() has already been called for this response et beaucoup de gens ont dit que c’était à cause de l’espace ou de la nouvelle ligne après <% ou %> , mais dans mon code, J’utilise tomcat6 sur Linux.

 <% 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  

~

 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) 

cause première

 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) 

Ok, vous devriez utiliser un servlet pas un JSP mais si vous avez vraiment besoin de … append cette directive en haut de votre page:

 <%@ page trimDirectiveWhitespaces="true" %> 

Ou dans la section jsp-config de votre web.xml

   *.jsp true   

Aussi flush / close le OutputStream et retourner lorsque vous OutputStream terminé.

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

Le problème ici est que votre JSP parle directement à la réponse OutputStream . Ceci n’est techniquement pas interdit, mais ce n’est pas une bonne idée.

Plus précisément, vous appelez response.getOutputStream() et y écrivez des données. Plus tard, lorsque le moteur JSP essaie de vider la réponse, il échoue car votre code a déjà “réclamé” la réponse. Une application peut appeler getOutputStream ou getWriter sur une réponse donnée, il n’est pas autorisé à faire les deux. Les moteurs JSP utilisent getWriter et vous ne pouvez donc pas appeler getOutputStream .

Vous devriez écrire ce code sous forme de servlet, pas de JSP. Les JSP ne conviennent que pour la sortie textuelle contenue dans le JSP. Vous pouvez voir qu’il n’y a pas de sortie de texte dans votre JSP, il ne contient que du java.

Ajoutez ce qui suit à la fin de try / catch pour éviter l’erreur qui apparaît lorsque le moteur JSP vide la réponse via getWriter ()

 out.clear(); // where out is a JspWriter out = pageContext.pushBody(); 

Comme il a été noté, ce n’est pas la meilleure pratique, mais cela évite les erreurs dans vos journaux.

Je viens de vivre ce problème.

Le problème était dû à la méthode de contrôleur qui tentait de renvoyer le type de chaîne (nom de la vue) à la fermeture. Lorsque la méthode quitterait, un deuxième stream de réponse serait initié.

Changer le type de retour de la méthode du contrôleur pour annuler le problème.

J’espère que cela aide si quelqu’un d’autre éprouve ce problème.

Je n’ai eu ce problème que la deuxième fois que je suis allé à l’exportation. Une fois que j’ai ajouté:

 response.getOutputStream().flush(); response.getOutputStream().close(); 

Après l’exportation, mon code a fonctionné tout le temps.

Voici ce qui a fonctionné pour moi dans un cas similaire.

Une fois que vous avez terminé d’écrire dans le Servlet OutputStream appelez simplement response.sendRedirect("yourPage.jsp"); . Cela provoquerait le lancement d’une nouvelle requête depuis le navigateur, évitant ainsi d’écrire dans le même stream de sortie.

JSP est le cadre de présentation et n’est généralement pas censé contenir de logique de programme. Comme skaffman l’a suggéré, utilisez des servlets purs, ou tout autre framework Web MVC pour obtenir ce que vous voulez.

Cette erreur se produisait dans mon programme car le jeu de résultats appelait plus de colonnes à afficher dans le document PDF que la firebase database. Par exemple, la table contient 30 champs mais le programme appelait 35 (resultset.getSsortingng (35))

J’ai eu la même erreur en utilisant response.getWriter() avant un request.getRequestDispatcher(path).forward(request, response); . Donc, le démarrage fonctionne bien lorsque je le remplace par response.getOutputStream()

Utilisez plutôt Glassfish 4.0. Cela s’avère être un problème uniquement dans la version de Glassfish 4.1.1.

PT-BR: Utilisez o Glasfish 4.0. Este parece ser um problema apenas no Glassfish 4.1.1.

Dans certains cas, ce cas se produit lorsque vous déclarez

 Writer out=response.getWriter 

après la déclaration ou l’utilisation de RequestDispatcher .

J’ai rencontré ce problème similaire en créant un LoginServlet simple, où j’ai défini Writer après avoir déclaré RequestDispatcher .

Essayez de définir un object de classe Writer avant la classe RequestDispatcher .