一般来说,一个session对象被create时,可以说明有一个新客端进入.可以用来粗略统计在线人数,注意这不是精确的,因为这个客户端可能立即就关闭了,但sessionDestroyed方法却会按一定的策略很久以后才会发生. HttpSessionAttributeListener:和ServletContextAttributeListener一样,它监听一个session对象的Attribut被Add(一个特定名称的Attribute每一次被设置),replace(已有名称的Attribute的值被重设)和remove时的事件.对就的有三个方法.* R3 g2 O0 w1 j" k* }
程序代码:8 Z/ O/ m2 y" t+ y) W
public void attributeAdded(HttpSessionBindingEvent se)
9 r2 } T. v8 ^. I$ [' P public void attributeRemoved(HttpSessionBindingEvent se)
) R" k1 Y- h/ i+ a9 m- b4 _ public void attributeReplaced(HttpSessionBindingEvent se)* u" }6 V( J9 G% O3 k
上面的几个监听器的方法,都是在监听应用逻辑中servlet逻辑中发生了什么事,一般的来说.我们只要完成逻辑功能,比如session.setAttribute("aaa","111");我只要把一个名为aaa的变量放在session中以便以后我能获取它,我并不关心当session.setAttribute("aaa","111");发生时我还要干什么.(当然有些时候要利用的),但对于下面这个监听器,你应该好好发解一下:
5 W' i$ ~ a Z- F3 P( v/ t HttpSessionBindingListener:% ~0 Y g2 b" c: x8 b9 B6 ]
上面的监听器都是作为一个独立的Listener在容器中控制事件的.而HttpSessionBindingListener对在一对象中监听该对象的状态,实现了该接口的对象如果被作为value被add到一个session中或从session中remove,它就会知道自己已经作为一个session对象或已经从session删除,这对于一些非纯JAVA对象,生命周期长于session的对象,以及其它需要释放资源或改变状态的对象非常重要.8 M% U; U2 M# n
比如:5 \0 H* b3 L P' E, s8 d
session.setAttribute("abcd","1111");
" _; a& t$ f3 F# _- a6 d 以后session.removeAttribute("abcd");因为abcd是一个字符中,你从session中remove后,它就会自动被垃圾回收器回收,而如果是一个connection:(只是举例,你千万不要加connection往session中加入)+ u2 c/ m4 q$ i" z1 G9 @7 g; ^
程序代码:* E x- L' g) o2 u4 v
session.setAttribute("abcd",conn);9 T( r2 j% `4 h1 g) V/ ^- s
以后session.removeAttribute("abcd");这时这个conn被从session中remove了,你已经无法获取它的句柄,所以你根本没法关闭它.而在没有remove之前你根本不知道什么时候要被remove,你又无法close(),那么这个connection对象就死了.另外还有一些对象可以在被加入一个session时要锁定还要被remove时要解锁,应因你在程序中无法判断什么时候被remove(),add还好操作,我可以先加锁再add,但remove就后你就找不到它的句柄了,根本没法解锁,所以这些操作只能在对象自身中实现.也就是在对象被add时或remove时通知对象自己回调相应的方法:5 L2 T8 Z2 y3 e: s
程序代码:9 ~6 ]0 `# K9 r, z9 e
MyConn extends Connection implements HttpSessionBindingListener{
' h# Q. h1 q; r7 q! B public void valueBound(HttpSessionBindingEvent se){
8 }* f9 E8 @: s3 B this.initXXX();! e' J, n0 r' n, d ~! v1 g
}' O: a# U1 Z9 Q8 |5 x8 l! G
public void valueUnbound(HttpSessionBindingEvent se){
8 v3 _7 |0 F, a$ u- r this.close();
! v( m o5 S% y* Y/ T( f }0 T6 |9 ?& @! R' F2 _
}
w n) e1 y# l/ U/ F+ g session.setAttribute("aaa",new MyConn());* L! K6 J) n2 a) j6 Y0 X- Q: \) m; J
这时如果调用session.removeAttribute("aaa"),则触发valueUnbound方法,就会自动关闭自己.而其它的需要改变状态的对象了是一样. |