1

私は2つ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に使用できますか?問題がありますか?ViewControllerSessionController

4

1 に答える 1

1

いいえ、できません。Beanに追加PropertyChangeSupportするには、@SessionScoped電話する必要があります

   propertyChangeSupport.addPropertyChangeListener("instanceofViewScopedBean")     

便利な場所(できれば@PostConstructor)。PropertyChangeListenerに渡すには、ターゲットBeanの実際のインスタンス(実装)が必要であることに注意してくださいaddPropertyChangeListener。私の知る限り、特にBeanの初期化では、セッションBean内からこれを取得することはできません。なんで?ビュースコープです。ページが表示されている間だけ存続します。

この制限に関連するのは、マネージドBeanはより狭いスコープの他のBeanにのみ注入できるというJSFポリシーです(この場合、ビュースコープのBeanに注入できるのはセッションBeanのみです)。あなたがやろうとしていることは、ビュースコープのBeanをセッションスコープの変数に結び付けるという、ほとんど逆のことです。

低コストのサーバー側プッシュメカニズムを実現しようとしていると思います。まあ、古き良きポーリングや彗星の押し出しとは別に、これを成し遂げるための別の手段を私は知りません。

于 2013-03-26T16:01:55.047 に答える