为了防止重新加载整个页面,您必须通过ajax提交表单。但是,为了能够下载文件,您必须关闭ajax。一起做得不好。
最好的选择是将操作分为两个请求。首先发送一个ajax请求,该请求将在服务器端的临时位置创建文件。如果失败,则可以按常规方式显示人脸消息。成功后,您可以通过有条件呈现的Javascript提交隐藏的非ajax命令按钮来自动触发第二个请求。然后,第二个请求可以将已经成功创建的文件从临时位置流式传输到响应。
之前已经提出并回答了类似的问题:有条件地提供文件下载或显示导出验证错误消息。但这涉及PrimeFaces和OmniFaces。以下是标准的JSF方法:
<h:form id="form"> ... <h:commandButton value="Export" action="#{bean.export}"> <f:ajax ... render="result" /> </h:commandButton> <h:panelGroup id="result"> <h:messages /> <h:commandButton id="download" action="#{bean.download}" /> <h:outputscript rendered="#{not facesContext.validationFailed}"> document.getElementById("form:download").onclick(); </h:outputscript> </h:panelGroup></h:form>并使用此
@ViewScopedbean(逻辑基于您现有的逻辑)。基本上,只需
File在导出操作(ajax)中获取as实例变量,然后在下载操作(非ajax)中将其流式传输即可。
private File pdfFile;public void export() { try { pdfFile = pdfService.getPdfReport(...); } catch (Exception e) { context.addMessage(...); }}public void download() throws IOException { DownloadUtils.exportPdf(pdfFile);}


