在 ICEFaces 中通知一个 bean

Posted

技术标签:

【中文标题】在 ICEFaces 中通知一个 bean【英文标题】:Notifying one bean from another in ICEFaces 【发布时间】:2010-11-24 11:03:13 【问题描述】:

我有一个我们申请的 ICEFaces。一页有两个 bean,它们在页面上显示不同的内容。

我希望能够在另一个 bean 更改 bean 上的某些内容时通知一个 bean,以便第一个 bean 更新其在页面上的内容。

这在 ICEFaces 中可行吗?如果有怎么办?

谢谢,

【问题讨论】:

【参考方案1】:

我打算发布一些我自己的工作示例,但ICEFaces blog 上的人已经有了自己的非常好的博客文章。看看吧。

【讨论】:

【参考方案2】:

如前所述,JSF 也可以进行简单的注入。在你的 faces-config.xml 文件中有这样的东西:

<managed-bean>
    <managed-bean-name>bean1</managed-bean-name>
    <managed-bean-class>org.icefaces.sample.Bean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>bean2</managed-bean-name>
    <managed-bean-class>org.icefaces.sample.Bean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>bean1</property-name>
        <value>#bean1</value>
    </managed-property>
</managed-bean>

至于当 bean 值改变时更新用户界面,可以通过定期的客户端与页面交互来触发。但是,如果您正在执行协作类型的应用程序(其中一个用户的更改可以更新其他用户可以看到的值),那么 ICEfaces 有一个您可以使用的称为 Ajax Push 的功能。查看他们的文档了解更多信息。

【讨论】:

【参考方案3】:

您可以做的是将 bean1“注入”到 bean2 中,这样 bean2 就可以访问 bean1 中存在的任何方法。

如果您使用的是 Spring,则在定义 bean 时可以轻松完成:

<bean id="bean1" class="foo.bar.Bean1"/>
<bean id="bean2" class="foo.bar.Bean2">
    <property id="bean1" ref="bean1"/>
</bean>

在 bean2 的 Java 代码中:

public class Bean2 

    private Bean1 bean1 = null;

    // The setter will be used by Spring to inject Bean1 in Bean2...
    public void setBean1(Bean1 bean1) 
        this.bean1 = bean1;
    

    ...

    public void someMethod() 
        ...
        // Now, you can call the bean1 instance to update what you want...
        bean1.updateSomething();
    


如果您不使用 Spring:

您可以像这样在 bean2 代码中直接访问 bean1 实例:

Bean1 bean1 = (Bean1) FacesContext.getCurrentInstance().getCurrentInstance()
    .getExternalContext().getSessionMap().get("bean1");

【讨论】:

以上是关于在 ICEFaces 中通知一个 bean的主要内容,如果未能解决你的问题,请参考以下文章

JSF、RichFaces、PrimeFaces 和 IceFaces 之间的区别

Icefaces 1.8.2 中的整页刷新?

在 Android 中通知用户新推文

在多个等待线程中通知后哪个线程将开始运行[重复]

为啥提供者组合不会在飞镖测试中通知其新状态?

如何在 facebook 应用程序/Safari IOS 中通知应用程序用户已更改