j2ee : le serveur perd la main... - Java - Programmation
Marsh Posté le 30-07-2008 à 17:22:33
Code :
|
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 :
|
Marsh Posté le 30-07-2008 à 17:39:29
Bidem a écrit :
|
Ok, merci pour les infos !
I incline myself.
Par contre... comment faire pour à la fois pouvoir envoyer le fichier au client, et malgré tout pouvoir faire un "forwardage" de requête ?
Merci.
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
Marsh Posté le 31-07-2008 à 09:48:29
Bidem a écrit : il faut que le client (navigateur) fasse 2 requettes : |
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 ?
...
Marsh Posté le 31-07-2008 à 10:08:49
ReplyMarsh 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é" )...
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 ?
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 : |
Hum..., idée à creuser en effet...
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 ?