jsf / primeface中有没有一种方法可以下载文件然后更改页面?

时间:2019-01-07 15:49:09

标签: jsf primefaces download

我在jsf项目上使用了primefaces。我需要在用户点击时实现两个操作: - 下载文件 -进行后退操作,然后更改页面

我尝试了几件事,但没有任何效果,要么我可以下载文件,要么可以进行后台处理并更改页面,但不能同时执行两个操作

我尝试过这段代码:

<p:commandButton id="exportEventLogButton" value="#{msg['avoir.creer']}" ajax="false" title="Export Log" onclick="PrimeFaces.monitorDownload(start, null)">
    <p:fileDownload value="#{avoirMB.download()}"/>
</p:commandButton>
<p:remoteCommand name="start" update="@this" action="#{avoirMB.saveAvoirTotalSsRefac}" />

有人可以帮助我以正确的顺序或严格的代码执行操作吗? 谢谢

1 个答案:

答案 0 :(得分:2)

您是正确的。在p:remoteCommand属性上进行设置时,action=""的实现似乎不支持页面重定向。我尝试了一些不同的变体,但看起来一点也不喜欢。

解决方案是在JSF和p:remoteCommand调用操作回调时以编程方式重定向(已通过Lombok和PrimeFaces 6.2进行了测试);

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui">
<h:head>
            <title>Test</title>
</h:head>
<h:body>
    <h:form>
        <p:remoteCommand process="@this"  action="#{downloadBackingBean.onCompleted}" name="stop" />
        <p:commandButton value="Download" ajax="false" onclick="PrimeFaces.monitorDownload(null, stop);" action="#{downloadBackingBean.onStarted}">
            <p:fileDownload value="#{downloadBackingBean.image}" />
        </p:commandButton>
    </h:form>
</h:body>

@Data
@Named
@RequestScoped
public class DownloadBackingBean {
    private StreamedContent image;

    public void onStarted() {
        System.out.println("download started");
    }

    public void onCompleted() throws IOException {
        System.out.println("download completed");
        FacesContext.getCurrentInstance().getExternalContext().redirect("newpage");
    }
}

此解决方案将在按下下载按钮时调用第一个backing bean操作,并在下载完成后立即重定向到新页面。

请注意,此代码假定image设置为某些值。为了简单起见,我选择在这里省略。

使用window.location的替代方法

如评论中所述,根据您的要求,您也可以像这样在完成后直接设置window.location.href

<p:commandButton value="Download" ajax="false" 
    onclick="PrimeFaces.monitorDownload(null, function() { window.location.href='newpage';});"
    action="#{downloadBackingBean.onStarted}">

如果您不需要,则完全不需要在服务器端进行p:remoteCommandonCompleted回调。