TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:, q/ }. [* H3 ?2 B+ f: M. ~5 }
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。: g! \& V& `) u# R- ]: Y( v |
. R' Q; |# z6 O' s1 ^
`9 K2 m4 _& G! U% \ Q* Q2 ]& g1 J5 j3 ~$ p# Y8 C
简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。; R- | W- |+ Y. i8 G3 `
简单的类图示例:6 P" i8 c$ e- p0 D- d/ w
" N3 H) n7 h6 p, R
3 r3 X% \( s" o0 p4 q
二、简介:
9 U' i" U' _# E4 {在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
( j3 c' b' S1 L, @2 VServlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:
6 J1 h V: Q2 P1>监听三个域对象创建和销毁的事件监听器, {) Q5 L! B6 }* q
2>监听域对象中属性的增加和删除的事件监听器
' e& q, O' t. l z, E- C3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。1 E2 z C" L% ?# }; n
a、如三个域对象的创建与销毁方法签名:
/ U, O" @3 T" n4 D( DServletRequestListener有以下两个方法) B" D/ Z4 l: v8 @, r$ f
void requestDestroyed(ServletRequestEvent sre) ^! H) S& D. N" w- B7 f
void requestInitialized(ServletRequestEvent sre) # u5 `$ y$ }% z* j& u1 Y
HttpSessionListener有以下两个方法0 a, e ~( [ w8 s# V6 B* {" k" x
void sessionCreated(HttpSessionEvent se)
Y5 L9 r& R) K6 ~7 p& w6 L0 h' ^void sessionDestroyed(HttpSessionEvent se) # h$ D/ l. z" `- F6 o
ServletContextListener$ j J3 n( T; {! r& N; Z
void contextDestroyed(ServletContextEvent sce) 0 d6 L! K7 u. I E# l; w2 Y; _
void contextInitialized(ServletContextEvent sce) . u) b! v% S* a4 H
b、三个类型对象域中增、删、改的监听器(3个)
u$ c9 f! y$ J2 c6 n9 FServletContextAttributeListener,
" `3 n& t i/ H6 ]- q& e1 }HttpSessionAttributeListener,
) v3 m3 Y3 i$ ~# P _ServletRequestAttributeListener
, S0 z- [' a* fc、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
+ [; f. l, M7 K注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。! z0 L/ J( i9 u/ K) k8 ?
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑
& {$ F6 v: c3 q1 {HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。
, d8 o0 F2 ~/ F三、Listenner的注册
' q/ H: k- e; `Javaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:3 A- O$ x% C: I( K: g9 O% X( t( x
<listener>
/ r c' n( q5 |6 v+ J4 }, ^1 X! d3 @/ f<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>: M. I- D q/ i* R& }4 j
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>: |$ _) j( M6 y+ S
<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
R+ B; n i5 b2 r6 B- \5 ]1 a" [</listener>
- k0 k: s' c& p; k3 S注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。* b1 G& `+ n' D, |
三、应用场景:
) X5 ~/ h2 G- v% b由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:4 }+ ?$ I1 Y( a
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。
( d1 q" u! o9 `$ S, x2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
* d8 @( _+ g% _( ~2 Y5 J7 p等等。
1 b# M, G9 X, W' A: ^* W; n4 A& d7 @! P2 p- o! H* F v' m
|
|