从支持 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 接口的主要内容,如果未能解决你的问题,请参考以下文章

检测 RefreshScope bean 的刷新

springcloud刷新范围

JSF 如何从支持 bean 重定向到支持 bean 中动态构建的 URL?

从支持 bean 访问 JSF 组件标记属性值

如何从支持 bean 获取命令链接值(显示名称)?

如何从非人脸请求中调用 JSF 支持 bean 方法?