TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:; O" n/ c% ~1 H+ a/ y, r- O
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
) f1 p; |1 `. j7 G( y
& N* J! O- w$ [ U
1 R4 D) |6 ?. J" ^6 f, G
2 [7 N' d8 N+ X( @3 ~简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
' u) Y4 s. N K# S& q1 n简单的类图示例:( l4 X( B; u2 U5 _1 t7 O
& {& ]* |0 @& o! K/ l1 K8 }) r J K! n1 I0 I' G
二、简介:
+ s4 w0 z7 t6 B, x7 I" D* S在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
! l! E+ C2 }/ |1 ^/ ?$ l1 K: a( tServlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:
6 ?9 k+ ~+ b# n1 f- o1>监听三个域对象创建和销毁的事件监听器1 D' B6 [- _4 C# D+ l' X* D
2>监听域对象中属性的增加和删除的事件监听器$ ]( X m3 K9 q
3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
R9 m0 C# U; }& va、如三个域对象的创建与销毁方法签名:
. b$ e& ?2 ~/ D, m, e3 ~! fServletRequestListener有以下两个方法
! W) V7 o6 s" J+ K0 _% V7 lvoid requestDestroyed(ServletRequestEvent sre) 4 t; u" K. A+ }4 O" m
void requestInitialized(ServletRequestEvent sre)
L9 j- B1 V& v; c1 \2 O. Z) xHttpSessionListener有以下两个方法; q g9 E' _9 i, e1 `
void sessionCreated(HttpSessionEvent se) ( g( G- _4 ~4 A3 m4 _" Q) F6 j
void sessionDestroyed(HttpSessionEvent se)
1 K/ u% o! y6 pServletContextListener4 T8 K$ [6 P0 r% {% z3 h9 y& z- J3 N
void contextDestroyed(ServletContextEvent sce)
" z. }0 e$ j: b8 H& Evoid contextInitialized(ServletContextEvent sce)
5 d! i* ?( J9 c6 ^: D h. S' Nb、三个类型对象域中增、删、改的监听器(3个)3 N" m/ S o5 N1 [
ServletContextAttributeListener,6 M' ] X+ g$ J" v' Q
HttpSessionAttributeListener,* c+ [0 k( F$ F' N5 e/ d
ServletRequestAttributeListener4 d8 G$ c1 p- m8 S/ j0 r3 W1 Z% @
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
& r/ _' J" k0 }% k' N2 Z& r注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。
# S, T+ d/ S! ?$ p$ {: HHttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑2 a; ^- {; N6 l/ A$ x2 B$ h
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。2 f P. j8 |0 Q U
三、Listenner的注册
8 t" R$ [# k9 j: IJavaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:& ^* \5 W! R9 P* N2 `
<listener>
: m1 K0 S. S# V3 @- ~& H<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>1 J$ I3 B3 \ Y. ~
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>0 \; ]! I- o# a/ K
<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
$ D3 F0 `( a7 D9 L</listener>
6 `( ?2 G! `9 m' a注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。% a/ F- _: ~8 @8 c: d( `* {
三、应用场景:2 q& d1 W2 p' {. ^
由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如: d4 f6 g5 y: m. d" ]3 _9 u9 z
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。
1 L0 h- x" P, @7 o$ Q9 _2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。2 \' l! g0 o- a9 q5 D2 N
等等。
* ~! ~: p, b8 G0 W5 ` f7 u# ~* u1 v5 J* U1 a% n6 t
|
|