TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:
) T3 `. B2 b# |% G4 u监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。" y) Y6 v6 _1 X
0 m- G4 r, ` S( _1 e* S# G. [
: v) h. p) ?' k/ |* j
7 {- @- P' G L/ A简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
( G+ ?0 e9 o) Y0 X& ]$ F5 O简单的类图示例:
+ p! Y& Q7 b$ j! B& r# J9 ~8 @
/ ^+ I! ~- N F3 V2 r
8 j* B; s) A+ E& M9 `* `) [二、简介:
* n. } Z- o; V7 Y8 b5 `7 R, H2 h在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。! s4 M4 ]0 C1 F6 ^# _
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:/ ^% P5 C6 r6 }& q/ N1 ~
1>监听三个域对象创建和销毁的事件监听器
/ h, j( ~4 a3 x; l7 `9 Q2 h2 U2>监听域对象中属性的增加和删除的事件监听器0 n7 A/ r% ~" B9 b8 o" d# }" I9 g
3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
4 j* q9 e- O: _/ D6 p8 }" z% ja、如三个域对象的创建与销毁方法签名:$ e! k, o, l0 T* |
ServletRequestListener有以下两个方法
4 h# Q/ W, l! S1 bvoid requestDestroyed(ServletRequestEvent sre) - m% o' A$ j4 [: d
void requestInitialized(ServletRequestEvent sre)
* w# x ^* L- \) g- [8 ?* cHttpSessionListener有以下两个方法3 s+ K& P9 \7 h6 k
void sessionCreated(HttpSessionEvent se) % ]: ?$ m1 D4 p" a
void sessionDestroyed(HttpSessionEvent se)
5 q; \: t: }3 N9 d. OServletContextListener
6 I1 R0 [6 n" A6 u5 w: ~) cvoid contextDestroyed(ServletContextEvent sce) : {/ r7 V& `4 A: R& d0 z3 H
void contextInitialized(ServletContextEvent sce) : O8 ]5 q( f: j
b、三个类型对象域中增、删、改的监听器(3个)
- O, E' d a: s: IServletContextAttributeListener,
- V( @8 @( l' C" [$ YHttpSessionAttributeListener,) O- ~, [; v! z: P8 ^
ServletRequestAttributeListener
2 m C; i. `1 O7 F8 n5 hc、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
0 S) N& B: ]" R" v: c0 R) Y" q9 W5 v注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。, i# S9 R2 }2 k
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑0 o9 a( B+ S, N3 S
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。! l3 j4 T) T) w# y4 t0 U3 d
三、Listenner的注册7 x2 p, {) |$ I+ k$ D
Javaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:; Y6 ^ n4 ~! f m7 F8 ?) f0 S. y, U
<listener>
1 `! K( N$ f/ l/ \+ R- c R<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>9 Y1 {% p5 C. x( O: R) ~/ u" Z
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>2 W5 F1 g" C3 ^; G$ E; E
<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->* n( F3 D3 E9 p+ x: X
</listener>* X$ v# T* {+ a
注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。7 n0 L6 h: J: K o* m- ?% i
三、应用场景:5 c) A: c& F) T' O! I. A0 H
由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:5 T' n: r) g8 h& y
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。
\ ~9 E' `" G0 n5 C2 a2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
/ |$ h6 I3 N! I" S7 ]) n. B5 k等等。1 M) `; H y- J# e" N3 i
7 O& }% E! C; V E- A+ O8 @8 d5 L
|
|