JSF / Seam.У меня есть страница, которая принимает некоторые параметры, предоставленные пользователем через форму, а затем (когда пользователь нажимает кнопку на странице) сервер генерирует файл и отправляет его в ответ так, что пользователю предлагается сохранитькак диалог.
Вот сценарий, с которым у меня возникли проблемы:
- Если пользователь сначала вводит неверный ввод и затем нажимает кнопку, Seam обрабатывает запрос, но останавливаетсяна этапе проверки процесса.Затем на моей странице отображается сообщение об ошибке проверки.
- Далее, если пользователь затем вводит правильный ввод и нажимает кнопку, Seam вызывает мой обработчик действий, файл генерируется и отправляется пользователю в ответ - , но сообщение об ошибке проверки по-прежнему отображается!
Изначально я попытался взломать некоторые из них, чтобы вызвать повторную визуализацию тега <h:messages/>
, но ничего не было удовлетворительным. Теперь я подозреваю, что основная причина в том, что Seam не входит в фазу ответа на запрос, когда я помещаю файл в ответ.
Вот моя кнопка:
<h:commandButton value="#{messages.Reports_RunReportPDF}"
action="#{bean.generateReportPdf}"/>
А вот мой обработчик действий:
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";
}
Если я закомментирую код, который добавляет файл (и просто вернусь "success"
, страница будет следовать правилам навигации, которые я настроил правильно. Но с файломстраница остается такой же, какой она была до нажатия кнопки.
Итак, как я могу вернуть файл в ответе и вызвать повторную визуализацию тега <h:messages/>
?