JSF页面上有一个命令链接。单击链接时,将打开模态。 选择模态中的下载按钮,对输入字段进行验证,然后下载文件。要求是关闭模态并在成功下载文件后返回到同一页面。当“打开文件”对话框出现在同一页面上时,我们如何关闭模态。
<h:panelGroup rendered="#{downloadBacking.showDownloadModal}">
<ui:include src="DownloadFile.xhtml" />
</h:panelGroup>
showDownloadModal
字段在viewscoped bean中定义。
单击模态中的下载按钮时,将调用downloadFile()
方法。
public String downlaodFile(){
// response.getwriter.write(string);
showDownloadModal = false;
return "";
}
答案 0 :(得分:1)
您的downloadFile()
方法无法正常工作。每个请求只能发送一个响应。文件下载本身已经是一个完整的响应。您无法向其附加其他数据;它只会破坏下载的文件与该数据。或者,如果您已正确编写了下载文件代码,那么您还应该看到IllegalStateException: response already committed
。
您有两个选择:
在某些JS代码的帮助下,点击下载链接立即关闭对话框。
<h:commandButton value="Download" action="#{bean.downloadFile}"
onclick="some JS code here to hide the modal" />
保存文件服务器的临时磁盘(如果它不大,则保存为内存中的byte[]
)并返回到隐藏对话框并有条件地渲染某些JS window.location
的同一页面它指向该文件。如果实际上需要首先创建/生成要下载的文件,这可能是非常有用的。
<h:panelGroup rendered="#{bean.downloadReady}">
<script>window.location = '#{bean.downloadURL}';</script>
</h:panelGroup>
URL可以指向一个简单的servlet,它从磁盘或内存中流式传输文件。