从支持 Bean 刷新 JSF/PrimeFaces 接口
Posted
技术标签:
【中文标题】从支持 Bean 刷新 JSF/PrimeFaces 接口【英文标题】:Refreshing a JSF/PrimeFaces interface from the backing Bean 【发布时间】:2015-04-30 15:08:03 【问题描述】:我的目标是使用 JSF 和/或 PrimeFaces 在网页上显示文本。文本由服务器端的进程实时更新。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:body>
<f:view id="view">
<f:event type="preRenderView" listener="#MyBean.init"/>
<h:form>
<p:outputLabel id="output" value="#MyBean.text"/>
</h:form>
</f:view>
</h:body>
</html>
我的支持 bean 将文本映射到 p:outputLabel。我还在 bean 中添加了一个修改文本的方法 foo()。这个方法被另一个在后台运行的进程调用(它持有一个指向 bean 的指针)。
@ManagedBean(name="MyBean")
@SessionScoped
public class MyBean
private String text = "text";
public void init()
MyOtherClass.getPointer(this);
public String getText()
return text;
public String foo(String s)
text = text + s;
// ...and refresh ?
到目前为止,我不能做的是每次更新文本时自动更新/刷新视图。我能做的最好的就是让用户手动刷新网页,或者使用 p:poll 定期刷新。
我对此进行了研究,并且发现了非常相似的线程;答案通常是使用 FacesContext.getCurrentInstance() (JSF) 或 RequestContext.getCurrentInstance() (PrimeFaces) 来访问组件并刷新它。我试过了,但是 foo() 中没有上下文。
我猜这是一个生命周期问题。我对JSF的了解非常有限。任何帮助表示赞赏。
【问题讨论】:
p:poll
是一个选项吗?无论您是否已排除,我都无法从您的描述中提炼出来。
您可以使用 PrimeFaces push 进行实时更新,但如果您不想仅使用 PrimeFaces 来限制自己(例如,您将来可能还想处理其他库/框架) ,然后选择 WebSockets - 一个独立的全双工协议。 (以给定的固定时间间隔更新某些内容本质上不是实时更新,其中当且仅当其他事情发生或永远不会发生时才会发生(或更新)某些事情)。
@Tiny:非常感谢您的提示!
【参考方案1】:
当从非 jsf 后端调用更新时,您无法从 bean 访问 faces 上下文。为此使用 PrimeFaces 推送。
【讨论】:
谢谢 Kukeltje :) 当我研究 p:push 时,我发现了这个帖子:***.com/questions/3471880/… -- 如果有人有同样的需求,他们可以在那里找到一些代码 sn-ps。跨度> 链接中的信息是旧的...最好留意PrimeFaces push examples in the showcase以上是关于从支持 Bean 刷新 JSF/PrimeFaces 接口的主要内容,如果未能解决你的问题,请参考以下文章