JSF/Seam. J'ai une page qui accepte certains paramètres fournis par l'utilisateur via un formulaire, puis (lorsque l'utilisateur clique sur un bouton de la page) le serveur génère un fichier et l'envoie dans la réponse de sorte que l'utilisateur est invité avec un enregistrement comme dialogue.Navigation dans la page/La phase de réponse de rendu est ignorée lorsque la réponse contient un fichier
Voici le scénario que je vais avoir du mal avec:
- Si l'utilisateur entre d'abord entrée non valide et puis clique sur le bouton, traite Seam la demande, mais arrête au processus de la phase de Validations. Ma page affiche ensuite le message d'erreur de validation.
- Ensuite, si l'utilisateur entre ensuite l'entrée correcte et clique sur le bouton, Seam appelle mon gestionnaire d'actions, le fichier est généré et envoyé à l'utilisateur dans la réponse - mais le message d'erreur de validation est toujours affiché!
Dans un premier temps, j'ai essayé quelques hacks pour forcer le nouveau rendu de la balise <h:messages/>
, mais rien n'a été satisfaisant. Je soupçonne maintenant que la cause première est que Seam n'entre pas dans la phase de réponse de rendu lorsque je place un fichier dans la réponse.
Voici mon bouton:
<h:commandButton value="#{messages.Reports_RunReportPDF}"
action="#{bean.generateReportPdf}"/>
Et voici mon gestionnaire d'action:
public String generateReportPdf() throws IOException {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)facesContext.getExternalContext().getResponse();
ServletOutputStream servletOutputStream = response.getOutputStream();
// add this header to make browser prompt user with a save-as dialog
response.addHeader("Content-Disposition",
"attachment;filename=" + reportName + ".pdf");
response.setContentType(exportType.contentType());
try {
HashMap<String, Object> parameters = getReportParameters();
ReportContent content = createReport(parameters);
servletOutputStream.write(content.getContents());
servletOutputStream.flush();
servletOutputStream.close();
} catch (ReportingException e) {
e.printStackTrace();
return "fail";
}
return "success";
}
Si je en commentaire le code qui ajoute le fichier (et juste revenir "success"
, la page ci-après règles de navigation que j'ai configurées correctement, mais avec le fichier, la page reste exactement la même qu'avant le bouton. comment puis-je à la fois renvoyer un fichier dans la réponse et provoquer la redirection de la balise <h:messages/>
?
'" Ce n'est pas possible avec une seule requête HTTP. "' Gotcha. Je peux voir comment la solution de sondage ajax pourrait fonctionner, mais ce n'est pas une solution idéale pour nous, alors il semble que je devrais penser à aborder cela sous un autre angle. À votre santé. –