java – 下载后如何刷新页面

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

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

<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" />

在我的Managed Bean里面

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

解决方法:

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

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

<h:outputText id="checkedOutBy" value="#{item.checkedOutBy}"/>
...
<p:poll id="poll" interval="5" update="checkedOutBy" />

<p:push>

<p:push onpublish="javaScriptFunctionWhichUpdatesCheckedOutBy" />  

轮询很容易,但我可以想象它增加了不必要的开销.在同步下载开始时,您无法使用标准JSF / PrimeFaces组件启动它.但是你可以阻止它让它自己检查渲染的属性.推送在技术上是最好的解决方案,但开始时更难. PrimeFaces在用户指南的第6章中很好地解释了它的用法.

上一篇:Android RecyclerView绘图问题(闪烁)


下一篇:c# – 当其他用户进行更改时刷新Windows程序?