我正在阅读第一个JSP和servlet。通过不同类型的听众,我遇到了HttpSessionBindingListener
和HttpSessionAttributeListener
。
我在考虑两者之间的区别 - 我希望看到这两位听众在现实世界中的实际用法。我通过实施HttpSessionBindingListener
和valueBound()
来测试valueUnBound()
- 为什么对象需要知道它是否已被添加?
我对实际用法感到很困惑。请帮助澄清这一点。
答案 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}}
这是一个真实世界的用例: