ヘッドファーストのJSPおよびサーブレットを読んでいます。異なるタイプのリスナーを調べてみると、HttpSessionBindingListener
とHttpSessionAttributeListener
に出会いました。
私はこの2つの違いについて考えていました。実際の使用例を、これら2つのリスナーの実世界の例で見たいです。 valueBound()
とvalueUnBound()
を実装してHttpSessionBindingListener
をテストしました-なぜオブジェクトが追加されたかどうかを知る必要があるのですか?
私は実際の使用法についてかなり混乱しています。これを明確にするのを手伝ってください。
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());
}
}
}
_
これが実際の使用例です。