TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:" E& d# w- N9 P
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
& ~& o& K5 g% f g
5 Y: T/ v& r$ t. {# O( u
) U& P$ l" E" M& j) X( ]/ O+ ^8 A+ c8 L( J9 U3 W4 b, T$ F1 o) y+ Q9 O
简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
" U; z3 S, q) B9 B+ g简单的类图示例:1 \* K, k8 J" j5 K: ?) m
( w0 w! m/ V/ G3 D! E# [2 D& a
# `4 ^+ x! \" X+ H& t; x二、简介:0 l* ]/ k% l1 b3 T% M' S$ o
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
/ Q$ R/ i$ T% h Y& F% X( ZServlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:4 x4 O1 Z# E0 s+ ^! X
1>监听三个域对象创建和销毁的事件监听器, u& F- d( V7 W8 }" |9 Y
2>监听域对象中属性的增加和删除的事件监听器: d' m1 j6 j; a* a- g; X
3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
8 _( Y9 O+ Y; i3 ^a、如三个域对象的创建与销毁方法签名:
; |' r z4 |% l# Q n$ M: ^' K6 K* JServletRequestListener有以下两个方法
6 x. k% G7 m0 Dvoid requestDestroyed(ServletRequestEvent sre)
4 _: b( W7 Y3 f5 \' Wvoid requestInitialized(ServletRequestEvent sre)
( S' S6 {4 X3 B9 R. f, b' P& MHttpSessionListener有以下两个方法. a+ ?* P7 ~* q3 T. C/ ~1 j
void sessionCreated(HttpSessionEvent se)
7 `5 a) U7 P8 P4 Svoid sessionDestroyed(HttpSessionEvent se)
* n4 o& j! ?0 W, D! B9 [ServletContextListener
! ` N$ w" w9 c" p0 E) {/ Mvoid contextDestroyed(ServletContextEvent sce)
7 g7 y/ i H5 O2 t! x3 |) }4 M' D0 |void contextInitialized(ServletContextEvent sce) 2 E$ n& S- i- q% ]6 N
b、三个类型对象域中增、删、改的监听器(3个)
7 R, f+ d, }2 XServletContextAttributeListener,: p7 d$ }9 Z+ y% Z+ W( H
HttpSessionAttributeListener,
- w* _) l- Q4 e8 v$ W) }" LServletRequestAttributeListener7 I: f E7 Q7 K+ U& I* |, u# X: d0 y
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
9 ] Z( Y1 v$ [! a注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。/ I% t$ n" I& C* b+ }
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑, e n/ g- E- l! C4 [+ r- m' ?( ~% d
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。
2 Y9 K) u) b4 y三、Listenner的注册
4 `. n( F2 k+ U9 V/ O) w6 pJavaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:' t! T ?& c! D6 n2 ^
<listener>1 H$ }: H7 c5 q% G* Q2 \1 w& `
<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>
- j+ w/ b3 `: |3 N' K<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>
- `# a& I; M8 [ j8 m<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
' P, G$ r, x" J1 q</listener>
/ j( {1 w) m/ Z注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。
. I. r$ J% o$ H+ r7 N) i6 K三、应用场景:
; k7 _5 F: X' @) T _. j由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:
9 u/ ~. R [: z/ R5 e% l1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。7 T G j7 R% L% `$ h( y
2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
& e0 p' ?* t' I& j$ g$ D8 g等等。" T9 I5 g. D6 }3 Q
/ S [+ C; u& H0 }$ i/ X
|
|