我有两个ManagedBeans (@SessionScoped和@ViewScoped):
@ManagedBean(name="sessionController")
@SessionScoped
public class SessionController implements Serializable{
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
...
}
@ManagedBean(name="viewController")
@ViewScoped
public class ViewController implements Serializable, PropertyChangeListener{
@ManagedProperty(value="#{sessionController}")
private SessionController sessionController ;
...
@PostConstruct
public void init() {
sessionController.addPropertyChangeListener(this);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
...
}
}我可以在ViewController中使用PropertyChangeListener来了解SessionController中的更改吗?会有什么问题吗?
发布于 2013-03-27 00:01:55
不,您不能。要向@SessionScoped bean添加PropertyChangeSupport,您需要调用
propertyChangeSupport.addPropertyChangeListener("instanceofViewScopedBean") 在一个方便的地方(最好是@PostConstructor)。请注意,您需要将目标bean的实际实例(实现PropertyChangeListener)传递给addPropertyChangeListener。据我所知,您不能从会话bean中获得它,特别是在bean初始化时。为什么?它是视图作用域,它只存在于页面被查看的时间。
与此限制相关的是JSF策略,即托管bean只能注入到范围较窄的其他bean中(在您的情况下,只有会话bean才能注入到视图范围内的bean中)。您要做的事情与此完全相反,即将视图范围内的bean绑定到会话范围内的变量。
我假设您正在尝试实现一种低成本的服务器端推送机制。嗯,除了好的投票或彗星推送之外,我不知道还有什么方法可以做到这一点。
https://stackoverflow.com/questions/15597059
复制相似问题