TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:
1 w- m" _. ] ^! l监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。6 G( E0 M& z7 {2 v5 G! k' N
* x- F! Y: S& T8 t+ n4 \8 F
0 X9 h. u5 z" L; f# S9 I7 t
; m \% a5 Q# R3 t6 v2 v
简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。- r4 y: K" D: T: V9 N/ w# W
简单的类图示例:
9 s7 ]* |8 M1 c3 f
- M/ W4 W2 N& l
( ^; X, P* Z( y9 ~" G# P9 ~二、简介:) Z6 ~, W, |, E9 N' J
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。( \/ N! n- h; S
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:7 w( k. t4 K, Y+ b6 ?0 h, a
1>监听三个域对象创建和销毁的事件监听器" w" D E( L! E/ ~% m$ K2 E
2>监听域对象中属性的增加和删除的事件监听器. g% t6 g, l1 f* ~; X( P% G) z
3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
( [; k' g6 z) C) Pa、如三个域对象的创建与销毁方法签名:
! N& ?+ x" M# I4 O7 U- M9 n2 r4 P+ O+ KServletRequestListener有以下两个方法! N4 X! b) h9 e' `
void requestDestroyed(ServletRequestEvent sre) , M2 k* _: a* @. r5 I. y2 q
void requestInitialized(ServletRequestEvent sre)
9 M5 l0 G. `1 cHttpSessionListener有以下两个方法& n1 L2 \! f4 n' t% K
void sessionCreated(HttpSessionEvent se) # n& Q b7 b' g/ ~# I
void sessionDestroyed(HttpSessionEvent se)
: _; f3 r# g0 g+ KServletContextListener
6 G# u' G6 a% g- O, r3 Jvoid contextDestroyed(ServletContextEvent sce)
. [5 ]% F* G0 n2 Y" ~& C0 avoid contextInitialized(ServletContextEvent sce) & a* E* G+ u/ i% D( l J$ F
b、三个类型对象域中增、删、改的监听器(3个)
: Y+ ^# C: L h* OServletContextAttributeListener,2 v2 k3 W2 i/ Z! r5 f
HttpSessionAttributeListener,. k5 [! C2 D! k& v
ServletRequestAttributeListener
7 Z7 I0 a4 a$ k! C6 ?! F7 H+ xc、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
+ X2 t5 z- h. n# d6 H% f注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。! {2 |; Y( F% D) l8 g3 ^6 N
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑" b2 B6 j9 I k) l' Q1 O) A
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。
3 L: A. C8 K& n/ f* U7 X/ w" W4 G三、Listenner的注册9 t. Q& U5 }. k6 _! S2 f
Javaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:
4 C1 d. t4 u1 p& ` _ w# { t2 P+ K<listener>
$ `( C5 g9 F( S2 Y' Z) b<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>
" E" G4 w2 i' U% {4 L, s<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>
9 @$ p: c+ n. w3 @3 }6 ~" P6 E<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
7 T4 w9 S- X6 [ v) j+ T8 n$ B</listener>! S# N# t, F+ P3 J/ Q; K0 Y) E
注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。, x9 D5 Z1 l) P" m
三、应用场景:9 _9 ?8 y: J+ i: \ y) `" ^
由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:8 c. w* ]6 U7 g( W
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。
# Z* R9 F8 c5 V: T$ v6 [1 A9 }2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。3 C$ a$ o6 c) S6 G
等等。2 A, H) d, N2 |- X
+ n7 n2 w |# o7 j# C( w) [! i, A
|
|