37

ヘッドファーストの JSP とサーブレットを読んでいます。さまざまなタイプのリスナーを経て、HttpSessionBindingListenerHttpSessionAttributeListener.

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

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

4

1 に答える 1

51

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アプリケーション全体として実装され、で属性が追加、削除、または置換され@WebListenerときに呼び出されます。上記の例を続けると、実装するクラスを変更できない場合(サードパーティなどの理由で)、または任意の数のクラスで「マーカー インターフェイス」を利用したい場合に特に便利です。リスニングの仕事を 1 か所で集中的に行うことができます。HttpSessionActiveUserActiveUserHttpSessionBindingListener

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

}

実際のユースケースは次のとおりです。

于 2013-07-21T20:52:31.517 に答える