我有两个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) {
...
}
}
我可以使用PropertyChangeListener
中的ViewController
来了解SessionController
中的更改吗?会有问题吗?
答案 0 :(得分:1)
不,你不能。要将PropertyChangeSupport
添加到@SessionScoped
bean,您需要调用
propertyChangeSupport.addPropertyChangeListener("instanceofViewScopedBean")
在方便的地方(最好是@PostConstructor
)。请注意,您需要将目标bean的实际实例(实现PropertyChangeListener
)传递给addPropertyChangeListener
。据我所知,你无法从会话bean中获取它,特别是在bean初始化时。为什么?好吧,只要正在查看某个页面,它就会存在。
与此限制相关的是JSF策略,即Managed Beans只能注入到较窄范围的其他bean中(使用您的情况,只有会话bean可以注入到viewscoped bean中)。您正在寻找的事情几乎完全相反,将视图结构bean绑定到会话范围变量。
我认为您正试图实现低成本的服务器端推送机制。好吧,我不知道另外一种方法可以做到这一点,除了好的&ol;投票或彗星推动。