下载后如何刷新页面

Tha*_*ham 4 java jsf refresh primefaces

我有一个命令按钮,它将调用一个函数来下载文件(标准内容,例如InputStreamBufferedOutputStream...) 下载成功后,在函数末尾,我更改当前对象的一些值并将其保存到数据库中。所有这些都可以正常工作。现在,当文件下载完成时,页面内容不会更新。我必须点击刷新才能看到更新的内容。请帮忙。以下是我的代码的基本结构

document:托管 Bean
getDrawings():方法返回绘图(实体类)列表
CheckedOutBy:实体的属性Drawing

<p:dataTable id="drawing_table" value="#{document.drawings}" var="item" >                            
    <p:column>
        <f:facet name="header">
              <h:outputText value="CheckedOutBy"/>
        </f:facet>
        <h:outputText value="#{item.checkedOutBy}"/>
        ...
</p:dataTable>
<p:commandButton ajax="false" action="#{document.Download}" value="Download" />
Run Code Online (Sandbox Code Playgroud)

在我的托管 Bean 中

public void Download(){
    Drawing drawing = getCurrentDrawing();
    //Download drawing
    drawing.setCheckedOutBy("Some Text");
    sBean.merge(drawing);  //Update "Some Text" into CheckedOutBy field
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

您基本上想让客户端发出两个请求。一个用于检索下载,另一个用于刷新新页面。它们无法在单个 HTTP 请求中完成。由于下载需要同步进行,并且无法从客户端完成下载,因此没有干净的 JSF/JS/Ajax 方法可以在下载完成时更新组件。

在 PrimeFaces 的帮助下,您最好的 JSF 赌注是<p:poll>

<h:outputText id="checkedOutBy" value="#{item.checkedOutBy}"/>
...
<p:poll id="poll" interval="5" update="checkedOutBy" />
Run Code Online (Sandbox Code Playgroud)

或者<p:push>

<p:push onpublish="javaScriptFunctionWhichUpdatesCheckedOutBy" />  
Run Code Online (Sandbox Code Playgroud)

轮询很容易,但我可以想象它会增加不必要的开销。当同步下载开始时,您无法使用标准 JSF/PrimeFaces 组件来启动它。但您可以停止它,让它对属性进行自检rendered。从技术上讲,推送是最好的解决方案,但入门更困难。PrimeFaces 在用户指南的第 6 章中很好地解释了它的用法。