在jsf/primeface中有没有办法下载一个文件然后更改页面?

在jsf/primeface中有没有办法下载一个文件然后更改页面?,jsf,primefaces,download,Jsf,Primefaces,Download,我在jsf项目中使用primefaces。我需要在用户单击时实现两个操作: -下载文件 -执行后退操作,然后更改页面 我尝试了几种方法,但都没有效果,要么我可以下载文件,要么我可以进行后台处理和更改页面,但这两种方法不能同时进行 我试过这段代码: <p:commandButton id="exportEventLogButton" value="#{msg['avoir.creer']}" ajax="false" title="Export Log" onclick="PrimeFace

我在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}" />

有人能帮我按正确的顺序或使用正确的代码执行操作吗?
谢谢你说得对。在
action=”“
属性上设置时,
p:remoteCommand
的实现似乎不支持页面重定向。我尝试了一些不同的变化,它似乎一点也不喜欢

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

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

请注意,此代码假定
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:remoteCommand
onCompleted
回调(如果您不需要)的需要。

您所说的“执行后退操作,然后更改页面”是什么意思?你需要什么来改变页面?然后我可以为您写一个答案,我必须对我的对象执行处理,更改状态,在数据库中保持,等等,然后更改页面以显示来自我的对象的其他数据。对不起,如果我不清楚我的英语不是我想要的那么流利!你的英语很好,问题和评论中缺少的更多的是事情的顺序以及你在行动中需要它们的步骤。“我的对象,更改状态,在数据库中持久化”很可能是在下载之前完成的,因此与此无关。或者你下载后需要它吗。这是决定答案中哪种解决方案最适合的相关部分。以及与一般编程/开发相关的内容。事实上下载和状态更改等。。。可以同时执行,但我想先执行下载。downlad ha启动后,我可以执行其他操作。然后您可以在
窗口中使用答案中的解决方案。location
如果不需要在服务器端方法中执行任何操作,则无需使用
p:remoteCommand
即可实现此目的。这就是我在评论中问的原因。如果你在答案中加上这一部分,我就投你一票!是的,那肯定是另一种方式。话虽如此,
p:remoteCommand
还允许您在需要时执行其他业务逻辑。我想这一切都取决于OP的要求。我将编辑答案并将其添加为第二选项。
@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");
    }
}
<p:commandButton value="Download" ajax="false" 
    onclick="PrimeFaces.monitorDownload(null, function() { window.location.href='newpage';});"
    action="#{downloadBackingBean.onStarted}">