我有一个我们申请的 ICEFaces。一页有两个 bean,它们在页面上显示不同的内容。
我希望能够在另一个 bean 更改 bean 上的某些内容时通知一个 bean,以便第一个 bean 更新其在页面上的内容。
这在 ICEFaces 中可能吗?如果是这样怎么办?
谢谢,
谭
您可以做的是将 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");
如前所述,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 的功能。查看他们的文档以获取更多信息。
我本来打算发布一些我自己工作的例子,但是ICEFaces 博客上的人已经有了他们自己的非常好的博客文章。看一看。