TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:
Q+ o( q1 ?+ F0 a监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。, V2 F4 d% }# Q" V2 N
- Q( L6 D; S( ]' }; b; w
; Y3 \; r* M; A4 {0 o2 \* p+ F( I9 Y- y2 F6 k) V6 T
简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。2 u _ e" R1 ?9 t2 r J
简单的类图示例:- x& e3 h- H3 f5 t7 n5 A5 r- Y
5 w$ N& V8 G- p, _6 a$ E
" v* M* Y% R6 T' i- o6 _" H( R二、简介:' d* [9 i, b8 F& e7 `
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
. `! C2 S, z$ ?* o3 a QServlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:
v6 T# D& \/ U$ p' `5 h4 f1>监听三个域对象创建和销毁的事件监听器$ @$ _* e# `( a
2>监听域对象中属性的增加和删除的事件监听器
+ {. ^1 T. }5 R! u, k0 t# O/ i3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
4 p+ Z! A0 e; W" t7 @. ma、如三个域对象的创建与销毁方法签名:
9 ?4 v, ~& o* e, H7 @9 G; K4 `% @ServletRequestListener有以下两个方法' N* }5 w1 d0 |% n* S
void requestDestroyed(ServletRequestEvent sre)
* | E$ X& m5 y" d+ R3 kvoid requestInitialized(ServletRequestEvent sre) $ D: F/ y/ f* `9 w
HttpSessionListener有以下两个方法
" ]! p" T" S9 X. tvoid sessionCreated(HttpSessionEvent se) " H) `" n6 Z8 X8 V' z
void sessionDestroyed(HttpSessionEvent se)
7 G8 Z+ S3 ^; H5 |0 f! bServletContextListener$ |3 f1 _) ?3 S: W& J
void contextDestroyed(ServletContextEvent sce) 8 V8 l6 E: j, `5 p; t, M
void contextInitialized(ServletContextEvent sce)
5 w4 B- Q9 R' S% K) Zb、三个类型对象域中增、删、改的监听器(3个)3 U/ J1 W& C& Z" D q) _4 w. T2 L
ServletContextAttributeListener,
: N4 |$ m( D5 L, l" K( mHttpSessionAttributeListener,; L; u7 Z+ t+ b, O9 e# |
ServletRequestAttributeListener
3 L. m8 M' T$ Z" {9 O/ b# N5 Uc、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。( V( U- U2 b: i6 _+ N
注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。
" }7 ]$ d- _0 IHttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑
' _$ y' m+ J6 X$ ]: y: nHttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。6 }! U9 D# w; i0 \- ?: x1 C
三、Listenner的注册; W9 {& I# C9 p4 B% z
Javaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:- L: E1 |: K: a, d2 m
<listener>
* z% q* Q" y4 B<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>
- o/ Q% `( {5 n<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>; q6 ]! m' \6 H6 U+ _* W+ i! c
<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->- M9 s* B- B+ _% ^- F
</listener>7 Y& |4 Z: K' g6 N D) M
注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。* }0 L# `# g- n; A
三、应用场景:
; j: t2 V0 W7 n) C0 t由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:8 Q" b) g( U7 `$ E: g. v& Q) X
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。4 P) m4 @1 |( O3 d3 x, @) I
2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。3 M! n1 l% F4 N3 N, N2 Z
等等。: e' M. f6 `8 A
2 [; ?/ X- {# [! q9 X- D
|
|