3

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

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

这在 ICEFaces 中可能吗?如果是这样怎么办?

谢谢,

4

3 回答 3

5

您可以做的是将 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");
于 2009-09-01T08:11:35.963 回答
3

如前所述,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 的功能。查看他们的文档以获取更多信息。

于 2009-09-01T15:40:20.127 回答
0

我本来打算发布一些我自己工作的例子,但是ICEFaces 博客上的人已经有了他们自己的非常好的博客文章。看一看。

于 2009-09-01T08:18:01.643 回答