TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:
5 c2 l; g* I8 u9 l- N( d监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
: C! _2 P. t6 f: _+ E' q& t
/ Z) `* m( h( J4 N
: w! v4 Q: b/ D% ]
2 ~$ b+ F$ w6 H9 k! A简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
" u$ J' }) b6 @' S简单的类图示例:
* ~! H! w% H0 {/ v' e: u
. n Q/ n" V: q5 o) m
1 j. A: Z4 [# Y! b; @* ?) d: x
二、简介:
+ }4 c% Y; {8 @+ d# O在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
P+ x0 I" X0 j9 D6 u$ {% R2 i; FServlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:! B! ], i" |) @+ ~
1>监听三个域对象创建和销毁的事件监听器
7 D& e: d: k. @8 o2>监听域对象中属性的增加和删除的事件监听器
5 e( d- N# C$ P$ x& o- \9 I3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
) Y* f- a; t- c, y7 v$ ]) I# Oa、如三个域对象的创建与销毁方法签名:" n5 [" X' [5 r; F& \
ServletRequestListener有以下两个方法
2 f, v& ~( a$ _- \* o5 p% bvoid requestDestroyed(ServletRequestEvent sre)
# @( C' G- Y" T* f2 |3 Vvoid requestInitialized(ServletRequestEvent sre)
) r4 g# J4 D" Z0 E4 o6 H# H, NHttpSessionListener有以下两个方法7 M0 s: L3 L! W
void sessionCreated(HttpSessionEvent se)
: V8 U' [0 M% G6 k, S4 Bvoid sessionDestroyed(HttpSessionEvent se) % \/ Q" r# _% Q7 p) E
ServletContextListener
" b' _# k* O& ~! i" n$ ?void contextDestroyed(ServletContextEvent sce) / o4 D. i) o0 c& }; [( \7 Q. C
void contextInitialized(ServletContextEvent sce)
( K6 a+ a" q- d. s6 O8 Hb、三个类型对象域中增、删、改的监听器(3个)3 P' i3 I5 K f0 Y
ServletContextAttributeListener,3 Y2 N8 J- e s3 Q- ~
HttpSessionAttributeListener,$ J- T# H" P) Q1 Q
ServletRequestAttributeListener6 `% C1 i) b, W0 D
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。+ H, \9 t! y% O
注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。
# E& t6 N$ b' J0 @2 uHttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑; _, e. u+ E5 L! L
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。' n6 f( @ ~/ {+ ^% x: `
三、Listenner的注册
, H9 P: G5 W) R- bJavaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:
+ q( g( ^; U* @3 I( A( p' I<listener>
; \. u" h7 v3 V<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>
/ A# N) H+ X; F2 a<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>
6 z2 U2 h( T0 r# |8 s<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
- ^" k7 K6 I% e0 F7 o</listener>& T0 e0 O3 a! A: |
注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。5 q1 v7 S* c2 n2 S/ C0 U
三、应用场景:
7 L( `- z. g. }* k* b: H由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:
: Y+ b* S: y& n H$ K5 E1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。
; V& {; @0 {: Y! I n3 e& }8 g2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
. a2 R: f4 i2 r6 F+ j( b5 y; o, N$ m等等。* ~$ K" J5 o* h7 |3 |6 [ E
8 M. W: K, R2 }5 a |
|