【问题标题】:Refreshing a JSF/PrimeFaces interface from the backing Bean从支持 Bean 刷新 JSF/PrimeFaces 接口
【发布时间】: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:非常感谢您的提示!

标签: jsf primefaces javabeans


【解决方案1】:

当从非 jsf 后端调用更新时,您无法从 bean 访问 faces 上下文。为此使用 PrimeFaces 推送。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多