HttpSessionBindingListener和HttpSessionAttributeListener的实际用法

时间:2013-07-21 20:42:17

标签: session servlets listener

我正在阅读第一个JSP和servlet。通过不同类型的听众,我遇到了HttpSessionBindingListenerHttpSessionAttributeListener

我在考虑两者之间的区别 - 我希望看到这两位听众在现实世界中的实际用法。我通过实施HttpSessionBindingListenervalueBound()来测试valueUnBound() - 为什么对象需要知道它是否已被添加?

我对实际用法感到很困惑。请帮助澄清这一点。

1 个答案:

答案 0 :(得分:47)

HttpSessionBindingListener将在其实例可能存储在会话中的类上实现,例如登录用户。

E.g。

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实施,在HttpSession中添加,删除或替换任何属性时会调用此ActiveUser。继续上面的ActiveUser示例,如果您无法修改HttpSessionBindingListener类来实现@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()); } } } (因为它是第三方左右),或者您想要制作时,这将非常有用在任意数量的类上使用“标记接口”,以便您可以在一个中心位置进行监听工作。

{{1}}

这是一个真实世界的用例: