我有一个命令按钮,它将调用一个函数来下载文件(标准的东西,比如InputStream
, BufferedOutputStream
...)下载成功后,在函数结束时,我更改当前对象的一些值并将其保存到数据库中。所有这些都可以正常工作。现在,当文件下载完成时,页面内容不会更新。我必须点击刷新才能看到更新的内容。请帮忙。以下是我的代码的基本结构
document
:托管 Bean
getDrawings()
:方法返回Drawing列表(实体类)
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" />
在我的托管 Bean 中
public void Download(){
Drawing drawing = getCurrentDrawing();
//Download drawing
drawing.setCheckedOutBy("Some Text");
sBean.merge(drawing); //Update "Some Text" into CheckedOutBy field
}
你基本上想让客户解雇two要求。一个用于检索下载,另一个用于刷新新页面。它们无法在单个 HTTP 请求中完成。由于下载需要同步进行,并且无法从客户端连接完成下载,因此没有干净的 JSF/JS/Ajax 方法可以在下载完成时更新组件。
在 PrimeFaces 的帮助下,您最好的 JSF 赌注是<p:poll>
<h:outputText id="checkedOutBy" value="#{item.checkedOutBy}"/>
...
<p:poll id="poll" interval="5" update="checkedOutBy" />
or <p:push>
<p:push onpublish="javaScriptFunctionWhichUpdatesCheckedOutBy" />
轮询很容易,但我可以想象它会增加不必要的开销。当同步下载开始时,您无法使用标准 JSF/PrimeFaces 组件来启动它。但你可以停止它,让它进行自检rendered
属性。从技术上讲,推送是最好的解决方案,但入门更困难。 PrimeFaces 在用户指南的第 6 章中很好地解释了它的用法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)