HttpSessionListener:
这个监听器主要监听一个Session对象被生成和销毁时发生的事件.对应有两个方法:
程序代码:
public void sessionCreated(HttpSessionEvent se) public void sessionDestroyed(HttpSessionEvent se) |
HttpSessionAttributeListener:和ServletContextAttributeListener一样,它监听一个session对象的Attribut被Add(一个特定名称的Attribute每一次被设置),replace(已有名称的Attribute的值被重设)和remove时的事件.
对就的有三个方法.
程序代码:
public void attributeAdded(HttpSessionBindingEvent se) public void attributeRemoved(HttpSessionBindingEvent se) public void attributeReplaced(HttpSessionBindingEvent se) |
我们只要完成逻辑功能,比如session.setAttribute("aaa","111");我只要把一个名为aaa的变量放在session中以便以后我能获取它,我并不关心当session.setAttribute("aaa","111");发生时我还要干什么.(当然有些时候要利用的),但对于下面这个监听器,你应该好好发解一下:
HttpSessionBindingListener:
上面的监听器都是作为一个独立的Listener在容器中控制事件的.而HttpSessionBindingListener对在一对象中监听该对象的状态,实现了该接口的对象如果被作为value被add到一个session中或从session中remove,它就会知道自己已经作为一个session对象或已经从session删除,这对于一些非纯JAVA对象,生命周期长于session的对象,以及其它需要释放资源或改变状态的对象非常重要.
比如:
session.setAttribute("abcd","1111");
以后session.removeAttribute("abcd");因为abcd是一个字符中,你从session中remove后,它就会自动被垃圾回收器回收,而如果是一个connection:(只是举例,你千万不要加connection往session中加入)程序代码:
session.setAttribute("abcd",conn);
以后session.removeAttribute("abcd");这时这个conn被从session中remove了,你已经无法获取它的句柄,所以你根本没法关闭它.而在没有remove之前你根本不知道什么时候要被remove,你又无法close(),那么这个connection对象就死了.另外还有一些对象可以在被加入一个session时要锁定
还要被remove时要解锁,应因你在程序中无法判断什么时候被remove(),add还好操作,我可以先加锁再add,但remove就后你就找不到它的句柄了,根本没法解锁,所以这些操作只能在对象自身中实现.也就是在对象被add时或remove时通知对象自己回调相应的方法:
程序代码:
MyConn extends Connection implements HttpSessionBindingListener{ public void valueBound(HttpSessionBindingEvent se){ this.initXXX(); } public void valueUnbound(HttpSessionBindingEvent se){ this.close(); } } session.setAttribute("aaa",new MyConn()); |