j2ee : le serveur perd la main...

j2ee : le serveur perd la main... - Java - Programmation

Marsh Posté le 30-07-2008 à 17:13:18    

d'abord voici le code:
 
   try {
    String theReportFile = prenomCollab+"_"+nomCollab +"_"+mois+"_"+mcSession.getAnnee()+".xls";
    out = response.getOutputStream();
    response.setContentType ("application/octet-stream" );
    response.setHeader ("Content-Disposition", "attachment; filename=\""+theReportFile+"\"" );
    wb.write(out);
    out.close();
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
   
   if (cnx != null) {
    cnx.close();
    cnx = null;
   }
  } catch (NamingException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 
  return mapping.findForward("imprimerOK" );
 }
 
Maintenant, le pb:
 
arrivé au return maping final, l'appli est dans les choux... tomcat ne sait plus où il habite... il semble que ça vienne de la gestion du response.getOutputStream... plus precisement du out.close...
 
d'ailleurs, dans les messages de la console tomcat, il nous indique que le getOutputStream a déjà été utilisé, cela semble le deranger, mais nous ne voyons absolument pas à quel autre endroit du projet cela aurait deja été fait...
 
a noter que tout le reste fonctionne, on recupere bien les infos envoyées par le serveur, c'est juste qu'ensuite il ne peut plus faire de redirection de page...
 
Avez vous une idée ?

Reply

Marsh Posté le 30-07-2008 à 17:13:18   

Reply

Marsh Posté le 30-07-2008 à 17:22:33    

Code :
  1. out = response.getOutputStream();
  2. wb.write(out);
  3. ...
  4. return mapping.findForward("imprimerOK" );
 

Donc là tu écrit dans la réponse un contenu binaire, puis tu fais un forward vers une autre page.

 

Mais réfléchis où donc est ce que ton autre page va essayer d'écrire ?
et oui, dans la réponse.

 

c'est pendant le traitement de imprimerOK que tu as le IllegalStateException

 

donc vu qu'une requêtes http ne peut avoir qu'une réponse, si tu écris directement dans la response, tu ne peux pas faire de forward

 

le code devient :

 
Code :
  1. out = response.getOutputStream();
  2. wb.write(out);
  3. ...
  4. //return mapping.findForward("imprimerOK" );
  5. // Avec Struts, si tu ne veux pas forwarder la requêtes , il suffit de retourner null
  6. return null;


Message cité 1 fois
Message édité par Bidem le 31-07-2008 à 10:07:20
Reply

Marsh Posté le 30-07-2008 à 17:39:29    

Bidem a écrit :

Code :
  1. out = response.getOutputStream();
  2. donc vu qu'une requette http ne peut avoir qu'une réponse, si tu écris directement dans la response, tu ne peux pas faire de forward
  3. return null;




 
Ok, merci pour les infos !
 
I incline myself.  :jap:  
 
Par contre... comment faire pour à la fois pouvoir envoyer le fichier au client, et malgré tout pouvoir faire un "forwardage" de requête ?
 
Merci.

Reply

Marsh Posté le 31-07-2008 à 09:39:23    

il faut que le client (navigateur) fasse 2 requêtes :
 - une requêtes pour le fichier
 - une requêtes pour l'enchainement de page

Message cité 1 fois
Message édité par Bidem le 31-07-2008 à 10:06:48
Reply

Marsh Posté le 31-07-2008 à 09:48:29    

Bidem a écrit :

il faut que le client (navigateur) fasse 2 requettes :
 - une requette pour le fichier
 - une requette pour l'enchainement de page


 
L'ennui, c'est struts... car le bouton dans la page JSP est codé en "struts", comme suit:
 
<html:submit title="Crée le fichier Excel du collaborateur sélectionné" property="typeAction">
    <bean:message key="menuCollabs.imprimer" />  
   </html:submit>
 
Du coup comment lui faire faire DEUX requêtes ?
 
...  :cry:

Reply

Marsh Posté le 31-07-2008 à 10:08:49    

Elle doit faire quoi ta 2ème requêtes ?

Reply

Marsh Posté le 31-07-2008 à 10:33:26    

Bidem a écrit :

Elle doit faire quoi ta 2ème requêtes ?


 
La première requête permet l'envoi du fichier ZIP par le serveur, envoi clôturé par le fameux out.close().
 
La deuxième requête serait censée redonner au serveur un accès au navigateur client (à son "response" ) afin que le serveur puisse s'en servir pour rediriger le client vers une autre page JSP (du style "téléchargement terminé" )...

Reply

Marsh Posté le 31-07-2008 à 10:47:32    

et si tu fais l'inverse, genre ce qu'on voit sur sourceForge, et bien d'autres :
tu rediriges vers une page qui dit "votre téléchargement va débuter sous peu, ou cliquez là" et qui elle lance le DL ?

Message cité 1 fois
Message édité par brisssou le 31-07-2008 à 11:27:54

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 31-07-2008 à 10:58:16    

brisssou a écrit :

et si tu fais l'inverse, genre ce qu'on voit sur sourceForge, et bien d'autre :
tu rediriges vers une page qui dit "votre téléchargement va débuter sous peu, ou cliquez là" et qui elle lance le DL ?


 
Hum..., idée à creuser en effet...  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed