TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:8 m* X6 V, N9 H% j
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。) X- X; n0 D/ ^6 K9 n( b+ P' ^/ ?8 t2 I
3 e* n4 c7 C+ |& N" W
; E- S! q9 P$ \& w+ h8 J# h. v: u# a
简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。$ Y9 P- S9 P# }/ m2 ]" u: O9 w0 F; V4 j- @" u
简单的类图示例:$ N& K0 ?" n8 p9 A4 R5 p+ j3 n
2 I- g+ P6 s8 E" V/ x# p
% c2 t. w% g* [$ P二、简介:
; C0 ^/ l; j% @, {( }' s在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。; E2 b" }: t0 s b" `
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:
6 |* k, B6 I# ~( [% o( a4 Q7 p1>监听三个域对象创建和销毁的事件监听器
/ t [0 A* v# S0 m% Q' n. x) m2>监听域对象中属性的增加和删除的事件监听器
' f2 [/ q# r2 y3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。) f D A" x1 G! l% t4 f* s, Z
a、如三个域对象的创建与销毁方法签名:
& u" ~3 y5 F9 M8 u2 W) m$ Y& XServletRequestListener有以下两个方法
; G8 X' _: z9 }5 R# jvoid requestDestroyed(ServletRequestEvent sre)
5 K3 v8 [& {6 Qvoid requestInitialized(ServletRequestEvent sre)
% v5 e% y5 _ A; l7 XHttpSessionListener有以下两个方法
1 @5 y% A0 T2 K: D- `void sessionCreated(HttpSessionEvent se)
6 V+ ~2 f) s( Zvoid sessionDestroyed(HttpSessionEvent se)
+ q5 Q: O. f3 F0 Y3 @7 J% `ServletContextListener: W9 G' v: Y# k2 ?* J$ Y4 k3 i: j
void contextDestroyed(ServletContextEvent sce) 0 S( G5 }6 D. k4 j
void contextInitialized(ServletContextEvent sce) & O; L: n2 n0 G" h" `
b、三个类型对象域中增、删、改的监听器(3个)
2 L7 d; h" Y% H T$ ?. ]2 NServletContextAttributeListener,7 X+ A" a3 s! i5 q/ P1 l
HttpSessionAttributeListener,
9 e; r8 ~2 N! h. F. O! B$ OServletRequestAttributeListener0 b# r( J/ Q, x* k
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
: K; a* K$ a! C8 C7 e注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。
0 L4 w" n' U5 f8 T! AHttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑) x8 p9 V) D% T+ W0 t
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。
+ {" o' j& K2 ^1 W; O三、Listenner的注册
7 x; t1 V1 g3 T& tJavaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:9 t3 U" r) w) A! O% L! E8 ?6 Z
<listener>2 u L8 q' q+ Z- {; U
<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>& T4 W( A% L u4 o0 L, [
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>
: S4 u6 c9 b/ x" f& ~2 J<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->$ N& B$ r2 {# l& j3 T
</listener>8 s% y0 O5 ]# q. Y" A _) |/ }
注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。1 ` ^* i% b1 o4 h; g
三、应用场景:8 `- c& a, R1 p3 `% Z2 N
由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:. h7 G2 l" k& n2 e' U$ U
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。7 F/ s! j; m$ O" M9 J
2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
4 i0 A! p- \/ f等等。# H4 @+ G- v6 c! |5 i
/ e/ \( W0 `3 l- T |
|