ManagedBean和PropertyChangeListener

时间:2013-03-24 09:52:33

标签: jsf-2 managed-bean propertychangelistener

我有两个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中的更改吗?会有问题吗?

1 个答案:

答案 0 :(得分:1)

不,你不能。要将PropertyChangeSupport添加到@SessionScoped bean,您需要调用

   propertyChangeSupport.addPropertyChangeListener("instanceofViewScopedBean")     

在方便的地方(最好是@PostConstructor)。请注意,您需要将目标bean的实际实例(实现PropertyChangeListener)传递给addPropertyChangeListener。据我所知,你无法从会话bean中获取它,特别是在bean初始化时。为什么?好吧,只要正在查看某个页面,它就会存在。

与此限制相关的是JSF策略,即Managed Beans只能注入到较窄范围的其他bean中(使用您的情况,只有会话bean可以注入到viewscoped bean中)。您正在寻找的事情几乎完全相反,将视图结构bean绑定到会话范围变量。

我认为您正试图实现低成本的服务器端推送机制。好吧,我不知道另外一种方法可以做到这一点,除了好的&ol;投票或彗星推动。