1

我有两个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) {
            ...
        }

    }

我可以用PropertyChangeListenerinViewController来了解 的变化SessionController吗?会不会有什么问题?

4

1 回答 1

1

不,你不能。要添加PropertyChangeSupport@SessionScopedbean,您需要调用

   propertyChangeSupport.addPropertyChangeListener("instanceofViewScopedBean")     

在一个方便的地方(最好是@PostConstructor)。请注意,您需要目标 bean 的实际实例(实现PropertyChangeListener)传递给addPropertyChangeListener. 据我所知,您无法从会话 bean 中获取此信息,尤其是在 bean 初始化时。为什么?好吧,它是视图范围的,它只在查看页面时才存在。

与此限制相关的是 JSF 策略,即 Managed Beans 只能注入到更窄范围的其他 bean 中(使用您的情况,只有会话 bean 可以注入到 viewscoped bean 中)。您要做的几乎相反,将视图范围的 bean 绑定到会话范围的变量。

我想您正在尝试实现低成本的服务器端推送机制。好吧,除了好的轮询或彗星推动之外,我不知道还有其他方法可以完成这项工作。

于 2013-03-26T16:01:55.047 回答