IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

message "getOutputStream() has already been called for this response" impossible à supprimer


Sujet :

Servlets/JSP Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 35
    Points : 31
    Points
    31
    Par défaut message "getOutputStream() has already been called for this response" impossible à supprimer
    Bonjour,

    je travaille sur un programme qui doit utiliser un stream pour télécharger un fichier PDF à partir d'un lien dans une page Web JSTL
    Le programme fonctionne (le téléchargement se fait bien) mais j'ai toujours le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR [http-0.0.0.0-8000-Processor1] core.StandardWrapperValve (StandardWrapperValve.java:253) - Servlet.service() for servlet jsp threw exception
    java.lang.IllegalStateException: getOutputStream() has already been called for this response
    je n'arrive pas à trouver la cause.
    si je mets des traces dans le programme JSP lorsque je clique sur le lien de ma page web, la trace est bien affichée avant d'afficher l’exception. Du coup je ne sais pas où se situe le problème.
    Je ne sais plus où chercher.

    Extrait de ma page web
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     <table>
     
                    <c:forEach items="${myList3}" var="item">
                       <tr>  
                         <td>
                           <a href="lire.jsp?url=<c:out value="${item.lienAcces}" />"><c:out value='${item.lienAffiche}'/></a>
                         </td>
                       </tr>    
     
                     </c:forEach>
     
    		</table>
    gestion du stream dans mon programme JSP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    try
    	{
     
        BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
    	OutputStream out1 = (OutputStream)response.getOutputStream ();
    	response.setContentType( "application/pdf" ); 
    	BufferedOutputStream bos = null;
    	bos = new BufferedOutputStream(out1);
    	byte[] buff = new byte[2048];
    	int bytesRead;
    	while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    	bos.write(buff, 0, bytesRead);
    	} 
    		if (bis != null)
    		bis.close();
    		if (bos != null)
    		bos.close(); 
     
     
                   System.out.println("affiche ce message avant d'afficher le message d'erreur !!!")
     
    	}

    merci d'avance pour vos idées

  2. #2
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 35
    Points : 31
    Points
    31
    Par défaut solution
    Ca y est, j'ai trouvé la cause et la solution:
    Lorsqu’on affiche une page JSP, on utilise implicitement du code java qui va lui-même utiliser un stream. (Par la classe JspWriter je crois).
    On se retrouve avec deux stream d’ouvert ce qui correspond bien au message qu’on a eu
    Donc dans la page JSP, il faut ajouter un clear concernant le stream du buffer de la page JSP. (attention, pas sur le stream qu’on a créé)
    Cela donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
            BufferedOutputStream bos = null;
    	bos = new BufferedOutputStream(out1);
    	byte[] buff = new byte[2048];
    	int bytesRead;
    	while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    	bos.write(buff, 0, bytesRead);
     
    	// Sachant que l'utilisation d'une page JSP génère du code java qui ouvre un stream,
    	// il faut faire un clear de ce stream, pour ne pas avoir le message getOutputStream has already been called for this response
    	out.clear();
    En espérant que ca pourra aider

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/05/2015, 18h02
  2. Erreur "getOutputStream() has already been called for this response"
    Par Malatok dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 22/02/2013, 19h11
  3. Réponses: 0
    Dernier message: 05/06/2012, 13h36
  4. Réponses: 6
    Dernier message: 04/04/2009, 19h51
  5. [FPDF] Some data has already been output, mais où ?
    Par baggie dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 11/04/2008, 22h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo