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