我正在通读 JSP 和 servlet。通过不同类型的监听器,我遇到了 HttpSessionBindingListener
和 HttpSessionAttributeListener
。
我正在考虑两者之间的区别 - 我想看看这两个听众在现实世界中的实际用法。我通过实现 valueBound()
和 valueUnBound()
测试了 HttpSessionBindingListener
- 为什么对象需要知道它是否已添加?
我对实际用途很困惑。请帮助澄清这一点。
最佳答案
HttpSessionBindingListener
是在其实例可能存储在 session 中的类上实现的,例如登录的用户。
例如
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()
设置为 session 属性时,valueBound()
将是调用。当它被 HttpSession#removeAttribute()
删除,或者 session 无效,或者被另一个 HttpSession#setAttribute()
替换时,valueUnbound ()
将被调用。
以下是一些现实世界的用例:
- Getting SessionScoped bean from HttpSessionListener?
- How to call a method before the session object is destroyed?
- Call an action when closing a JSP
- implementing HttpSessionListener
- How to access HTTP sessions in Java
HttpSessionAttributeListener
将作为应用程序范围的 @WebListener
实现,当在 HttpSession
中添加、删除或替换任何属性时,它会被调用。继续上面的 ActiveUser
示例,如果您无法修改 ActiveUser
类来实现 HttpSessionBindingListener
(因为它是第 3 方或so),或者当您想在任意数量的类上使用“标记接口(interface)”以便您可以在一个中心位置完成监听工作时。
@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());
}
}
}
这是一个现实世界的用例:
关于session - HttpSessionBindingListener 和 HttpSessionAttributeListener 的实际用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17776704/