我在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}" />
有人可以帮助我以正确的顺序或严格的代码执行操作吗? 谢谢
答案 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.href
,
<p:commandButton value="Download" ajax="false"
onclick="PrimeFaces.monitorDownload(null, function() { window.location.href='newpage';});"
action="#{downloadBackingBean.onStarted}">
如果您不需要,则完全不需要在服务器端进行p:remoteCommand
和onCompleted
回调。