Jsf 2 在JSF2.0中成功下载文件后关闭模式

Jsf 2 在JSF2.0中成功下载文件后关闭模式,jsf-2,Jsf 2,JSF页面上有一个命令链接。单击链接时,将打开一个模式。 选择模式中的下载按钮,对输入字段进行验证,然后下载文件。要求是在成功下载文件后关闭模式并返回到同一页面。当打开文件对话框显示在同一页面上时,我们如何关闭模式 <h:panelGroup rendered="#{downloadBacking.showDownloadModal}"> <ui:include src="DownloadFile.xhtml" /> </h:panelGroup>

JSF页面上有一个命令链接。单击链接时,将打开一个模式。 选择模式中的下载按钮,对输入字段进行验证,然后下载文件。要求是在成功下载文件后关闭模式并返回到同一页面。当打开文件对话框显示在同一页面上时,我们如何关闭模式

<h:panelGroup rendered="#{downloadBacking.showDownloadModal}">
    <ui:include src="DownloadFile.xhtml" />
</h:panelGroup>
您的
downloadFile()
方法无法以这种方式工作。每个请求只能发送一个响应。文件下载本身已经是一个完整的响应。不能向其附加其他数据;它只会损坏包含该数据的下载文件。或者,如果您正确编写了下载文件代码,您还应该看到一个
非法状态异常:响应已提交

您有两种选择:

  • 在一些JS代码的帮助下,点击下载链接立即关闭对话框

    <h:commandButton value="Download" action="#{bean.downloadFile}" 
        onclick="some JS code here to hide the modal" />
    
    URL可以指向一个简单的servlet,该servlet将文件从磁盘或内存流式传输


  • 您能告诉我如何保存文件服务器的临时磁盘吗。我还需要创建另一个Servlet类来存储文件,还是只需要备份bean中的代码就可以了?
    file.createTempFile(前缀,后缀)
    。是的,您需要创建一个servlet。这超出了JSF的责任范围,我在支持bean中创建了一个临时文件,并将内容复制到临时文件中。我创建了一个servlet。如何将临时文件从bean传递到servlet?我很困惑。请帮助我。只需在URL中传递文件名作为请求参数或路径信息。例如,
    pdfservlet?file=tempfilename.pdf
    pdfservlet/tempfilename.pdf
    ,然后使用
    新文件(System.getProperty(“java.io.tempdir”),filename)再次找到它。
    
    <h:commandButton value="Download" action="#{bean.downloadFile}" 
        onclick="some JS code here to hide the modal" />
    
    <h:panelGroup rendered="#{bean.downloadReady}">
        <script>window.location = '#{bean.downloadURL}';</script>
    </h:panelGroup>