TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:
* I% T: z# b8 m- w. s' p4 c监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
! P+ B( o. z O. n
6 u v: U4 c7 T7 W% g: j
2 [# m. {, A) r: d$ p. q' g6 y$ V0 n9 w$ z* c8 V4 e1 f
简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
9 Q+ v- Z0 L+ r; D" x6 f2 m3 | E简单的类图示例:
A1 ^* h+ ^ d. D5 v8 l
' e2 X0 |7 d9 b5 C' \
8 z+ |% Z7 t4 _0 h L6 @二、简介:
+ M1 ~! ^; A+ j. h% |& Q在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
; ^0 b8 I$ u9 _. i& y8 ^3 |Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:9 ]$ N! l- b3 z; a; p
1>监听三个域对象创建和销毁的事件监听器: j f3 {) o y ]/ @ [6 k5 n
2>监听域对象中属性的增加和删除的事件监听器
& ^3 N3 @" | ?" ?6 ?( j3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
. R6 X4 X/ ]. n9 [a、如三个域对象的创建与销毁方法签名:
4 `0 W( t" m9 d1 y& G4 pServletRequestListener有以下两个方法
9 [0 D! l2 z p) c5 {3 v( k; Jvoid requestDestroyed(ServletRequestEvent sre) 6 s p6 X' K2 U/ \5 b1 e
void requestInitialized(ServletRequestEvent sre)
' X; @, r) ?# M" X* A. k3 U6 EHttpSessionListener有以下两个方法+ L g+ a6 s7 L8 h) }
void sessionCreated(HttpSessionEvent se)
- n7 {& s5 h5 x( h# R; G nvoid sessionDestroyed(HttpSessionEvent se)
0 d* T; ^2 o8 I4 k! }! OServletContextListener) n1 |$ V$ `+ p% O% I
void contextDestroyed(ServletContextEvent sce) ; y; g% l1 b" O6 \3 K b; M" u
void contextInitialized(ServletContextEvent sce)
" X5 H, C# x8 B! {7 c* S6 Zb、三个类型对象域中增、删、改的监听器(3个)1 ?' e2 r7 }- I- I' d
ServletContextAttributeListener,- u5 n: \* ]5 A$ s4 W- W+ O+ d3 _; W) y
HttpSessionAttributeListener,, L0 ~8 @' ]" d2 K2 ?
ServletRequestAttributeListener' k" t9 K' \9 C7 W% q
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
' Y w4 Y! L' \) R注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。* p7 P- {; `" d; [" r8 ]) J& U! O' ?
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑
/ y9 R2 E% g0 X; a: w5 U9 D- lHttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。. O& |0 f6 p3 z( |! A; I7 @
三、Listenner的注册6 u+ H0 J% L% E) s5 p6 }; v1 @$ J
Javaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:& T1 k- n5 u+ a4 c- [
<listener>
4 ?- |. Z; E! B0 {0 R# \<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>6 k' g$ c: h& C8 @( P
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>7 H7 F; b1 ^$ V; Q5 }/ P2 v
<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
' { t' k$ A, x9 g</listener>' N5 f* n1 u- B- t
注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。
; {2 ?: ~0 @7 [% u; ?三、应用场景:2 ^3 e! c/ v4 t: h' R
由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:; y$ K( N+ M7 b# ]4 q
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。/ ~3 w' Y& p( r; r* M
2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。2 U; C% q& N" M( f
等等。
, P5 B2 g8 B' I. U
! P; ?- ?& H- _! }& y |
|