2013-07-21 10 views
31

私は最初のJSPとサーブレットを読んでいます。さまざまなタイプのリスナーを見て、私はHttpSessionBindingListenerHttpSessionAttributeListenerを見つけました。HttpSessionBindingListenerとHttpSessionAttributeListenerの実際の使用

私は両者の違いについて考えていました。実践的な使い方を、2人のリスナーの実例で見たいと思っています。私はHttpSessionBindingListenerを実装して、valueBound()valueUnBound()を実装しました。なぜオブジェクトが追加されたかどうかを知る必要がありますか?

実用的な使用法についてはかなり混乱しています。これを明確にするのを助けてください。

答えて

41

HttpSessionBindingListenerは、ログインしているユーザーなどのセッションにインスタンスを格納できるクラスに実装する必要があります。

など。このActiveUserのインスタンスは、その後valueBound()が呼び出されます、HttpSession#setAttribute()によってセッション属性として設定します

public class ActiveUser implements HttpSessionBindingListener { 

    @Override 
    public void valueBound(HttpSessionBindingEvent event) { 
     logins.add(this); 
    } 

    @Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
     logins.remove(this); 
    } 

} 

HttpSession#removeAttribute()またはセッションの無効化によって削除されるか、別のHttpSession#setAttribute()に置き換えられると、valueUnbound()が呼び出されます。ここで

は、いくつかの現実世界のユースケースです:

HttpSessionAttributeListenerのいずれかの属性が追加、削除、または置換されたときに呼び出される@WebListenerのアプリケーションとして実装されます(HttpSession)。上記のActiveUserの例を続けると、これはクラスを変更してHttpSessionBindingListener(サードパーティ製なので)または任意の量の「マーカーインターフェイス」を使用する場合に特に便利です1つの中心的な場所でリスニングを行うことができます。

+0

本当にありがとうございました@BalusC:

@WebListener public class ActiveUserListener implements HttpSessionAttributeListener { @Override public void attributeAdded(HttpSessionBindingEvent event) { if (event.getValue() instanceof ActiveUser) { logins.add(event.getValue()); } } @Override public void attributeRemoved(HttpSessionBindingEvent event) { if (event.getValue() instanceof ActiveUser) { logins.remove(event.getValue()); } } @Override public void attributeReplaced(HttpSessionBindingEvent event) { if (event.getValue() instanceof ActiveUser) { logins.add(event.getValue()); } } } 

はここで現実の世界ユースケースです。私はその違いを理解した。詳細な答えをありがとうございました。 – benz

+0

これはすばらしい答えです。 @BalusCどのようにこのすべての情報を取得し、そのような良い方法で表示するために管理します。 – Makky

+0

ようこそ。 – BalusC

関連する問題