TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:
0 T6 S% F- f" c1 B$ H监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
! H! Q! ?# b3 M4 o+ S1 D) ^" Z
& ?$ E4 Y" \1 `- E- n, G
4 \/ X( A6 A0 R2 y# S& L9 t
/ `" j1 O! M6 Y( | O7 n Q简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
! a6 I& p' d1 T简单的类图示例:
7 V: u! ?/ Y8 k$ N
3 m- I0 _2 N# t2 B4 h+ Y& \) `# b! K' g( m4 d
二、简介:
# g2 v d3 v2 O8 t$ n* H在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
7 c; c! p3 }5 J EServlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:- D$ r# V+ N1 P
1>监听三个域对象创建和销毁的事件监听器
+ A/ s, I# Q: Q* }2>监听域对象中属性的增加和删除的事件监听器
( E3 E8 ]7 G$ _& A/ ^4 O! f* Z3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。8 A1 m- t! E' D0 s4 P a
a、如三个域对象的创建与销毁方法签名:; x: l0 d( J# m: x( ^) R
ServletRequestListener有以下两个方法
" C: s( F9 v' K; U, \4 q4 Y* D, }9 Nvoid requestDestroyed(ServletRequestEvent sre)
; [+ {& r* e& Xvoid requestInitialized(ServletRequestEvent sre)
7 Q8 W0 Z* b4 p" e% ~& \8 JHttpSessionListener有以下两个方法
2 m% ?3 t, D! B# F0 ~" Ovoid sessionCreated(HttpSessionEvent se)
' A+ _' f4 t+ U1 r- Evoid sessionDestroyed(HttpSessionEvent se)
5 p6 l/ h1 \5 Z3 K5 Y! jServletContextListener
/ A5 J( k8 } Yvoid contextDestroyed(ServletContextEvent sce)
7 {) K. ?7 [& bvoid contextInitialized(ServletContextEvent sce)
5 R/ M2 f1 t/ j O2 nb、三个类型对象域中增、删、改的监听器(3个)
2 P/ O9 v' ]6 }1 X. `. s8 QServletContextAttributeListener,
0 T. J2 \, {: h/ @' ^HttpSessionAttributeListener,( f( X- ^) W9 A2 X7 H: @$ A9 S
ServletRequestAttributeListener1 ]$ w7 t1 B+ ], d( V9 o
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。4 [' k5 p; u- `, d( |4 S
注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。" k8 v% |! D& }- _' h
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑& m6 x2 t% H5 O. u2 D8 K
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。6 k6 W6 i3 @1 B5 F5 `. m* e
三、Listenner的注册* U( I1 U; S7 m! w
Javaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:
5 E+ y ?0 E8 C5 `4 O. [$ Q$ h$ R- a* Z<listener>
; @+ D/ e2 H7 N, Z5 v<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>0 j0 Y. ]% x' x, L6 y! L
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>" u a& ^) v4 l3 t' }
<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
0 _8 K1 a. Q( _ @4 K</listener>
& O9 ?5 p7 _) z( E注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。' X" `9 P% {# y3 n3 O1 b
三、应用场景:, n- B4 N4 `$ A
由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:( L7 C" G' R9 @3 X% {( A' f
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。7 Y+ I: R" |# A, _& B% d- p
2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
/ I3 A' Z0 m& g$ M等等。
$ z9 i( n, g* I. T5 Q+ n: Z5 z" V8 d$ A) X( o& I
|
|