【发布时间】:2011-05-23 07:25:59
【问题描述】:
JSF/接缝。我有一个页面,它接受用户通过表单提供的一些参数,然后(当用户单击页面上的按钮时)服务器生成一个文件并将其发送到响应中,以便提示用户保存 -作为对话框。
这是我遇到问题的场景:
- 如果用户最初输入无效输入然后单击按钮,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/> 标记被重新呈现呢?
【问题讨论】: