HttpSessionBindingListener和HttpSessionAttributeListener的实际使用

HttpSessionBindingListener和HttpSessionAttributeListener的实际使用,session,servlets,listener,Session,Servlets,Listener,我正在阅读headfirstjsp和servlet。通过不同类型的侦听器,我遇到了httpsessionbindingstener和HttpSessionAttributeListener 我在想这两者之间的区别——我想看看这两位听众在现实世界中的实际用法。我通过实现valueBound()和valueUnBound()测试了httpsessionbindingstener——为什么一个对象需要知道它是否已被添加 我对实际用法感到相当困惑。请帮助澄清这一点。将在其实例可能存储在会话中的类(如登录

我正在阅读headfirstjsp和servlet。通过不同类型的侦听器,我遇到了
httpsessionbindingstener
HttpSessionAttributeListener

我在想这两者之间的区别——我想看看这两位听众在现实世界中的实际用法。我通过实现
valueBound()
valueUnBound()
测试了
httpsessionbindingstener
——为什么一个对象需要知道它是否已被添加

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

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

例如

HttpSession\setAttribute()
将此
ActiveUser
的实例设置为会话属性时,将调用
valueBound()
。当它被
HttpSession#removeAttribute()
删除,或会话的无效,或被另一个
HttpSession#setAttribute()
替换时,将调用
valueUnbound()

以下是一些真实世界的用例:

将作为应用程序范围的
@WebListener
实现,当
HttpSession
中添加、删除或替换任何属性时,将调用该属性。继续上面的
ActiveUser
示例,如果您无法修改
ActiveUser
类来实现
httpsessionbindingstener
(因为它是第三方),或者当您想要使用“标记接口”时,这将特别有用在任意数量的课堂上,这样你就可以在一个中心位置完成听力工作

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

}
下面是一个真实的用例:


非常感谢@BalusC。我理解其中的区别。非常感谢你的详细回答。这是一个很好的答案@BalusC您是如何获得这些信息并以这样好的方式呈现的。@BalusC-我的书用真实世界的例子解释了Http会话绑定。它说-考虑一个<代码>客户> /Cuff>类,每个活动实例代表一个客户的姓名、地址、订单信息等信息。真实数据存储在一个基础数据库中。使用数据库填充客户对象的字段。
HttpSessionBindingListener
方法帮助您保持对象与数据库同步,反之亦然。@BalusC-那么,如果客户登录到他的电子购物帐户信息页面,是否会有某种
javascript/js
对象
从db加载所有这些信息以防止重复点击db?当用户编辑其家庭地址时,该对象将用于更新数据库?
@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());
        }
    }

}