web-dev-qa-db-ja.com

HttpSessionBindingListenerおよびHttpSessionAttributeListenerの実用的な使用法

ヘッドファーストのJSPおよびサーブレットを読んでいます。異なるタイプのリスナーを調べてみると、HttpSessionBindingListenerHttpSessionAttributeListenerに出会いました。

私はこの2つの違いについて考えていました。実際の使用例を、これら2つのリスナーの実世界の例で見たいです。 valueBound()valueUnBound()を実装してHttpSessionBindingListenerをテストしました-なぜオブジェクトが追加されたかどうかを知る必要があるのですか?

私は実際の使用法についてかなり混乱しています。これを明確にするのを手伝ってください。

34
benz

HttpSessionBindingListener は、ログインしたユーザーなど、インスタンスをセッションに格納できるクラスに実装されます。

例えば。

_public class ActiveUser implements HttpSessionBindingListener {

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

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

}
_

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

以下に、実際の使用例を示します。

HttpSessionAttributeListener は、anyのときに呼び出されるアプリケーション全体の_@WebListener_として実装されます属性は、HttpSessionで追加、削除、または置換されます。上記のActiveUserの例を続けると、ActiveUserクラスを変更してHttpSessionBindingListenerを実装できない場合(サードパーティなどのため)、または任意の量のクラスで「マーカーインターフェイス」を使用して、リスニングジョブを1つの中央の場所で実行できるようにする場合。

_@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());
        }
    }

}
_

これが実際の使用例です。

47
BalusC