TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
一、监听器原理:7 a; ^1 ]$ T( z1 f N4 T
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
5 n! ^! [. f, a8 l/ `
2 u* ?- M" T8 N5 _6 h [, L
% B8 V& H9 f* u; Z }7 o+ X. q1 k9 v- |, E6 j0 h5 U
简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
6 ~! V9 x7 w0 D/ R$ u; N: x$ ]" [# b简单的类图示例:6 P' S7 E# H2 V0 v) C# r7 r2 Z
+ w1 K% Q# `4 H6 d! Y" n
% E) l5 y0 ^- J$ a
二、简介:3 E' J; D A. V3 t r2 } E! u9 z' k
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
0 N* ^( T# e' Y( l# ]; CServlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:
0 t" U k; T, b0 _+ N1>监听三个域对象创建和销毁的事件监听器# H9 t& C5 w+ r1 K( V8 L' t. a
2>监听域对象中属性的增加和删除的事件监听器1 \6 y) a6 N3 V) E8 i' m, u8 b8 c' {
3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
0 C. l7 i+ U( S7 J$ {* O9 s( Ka、如三个域对象的创建与销毁方法签名:
2 |" @3 M, `, t3 D; UServletRequestListener有以下两个方法
- Q3 i& p7 J- C, ]void requestDestroyed(ServletRequestEvent sre) , j, o0 B# @* T$ L+ R4 @
void requestInitialized(ServletRequestEvent sre)
. I9 \/ ?* q, Z) a# p/ QHttpSessionListener有以下两个方法
0 `) b1 e. Y8 T0 Svoid sessionCreated(HttpSessionEvent se)
# I" E- H) n9 Z3 w1 Evoid sessionDestroyed(HttpSessionEvent se)
/ Q6 ?3 g" F3 F) q( {( BServletContextListener' z* l1 |0 ?$ }$ W! f2 W# A4 [# [, g
void contextDestroyed(ServletContextEvent sce) & S1 q9 v5 q. u# S* L9 J* i
void contextInitialized(ServletContextEvent sce) " c* \- }, O0 t- A. A
b、三个类型对象域中增、删、改的监听器(3个) ^' G0 ~" ]2 g& I" l& A
ServletContextAttributeListener,4 B0 ~ H. Q+ r$ K& [* E
HttpSessionAttributeListener,+ P5 g; ^ v" N2 Z% g0 Z7 t4 s
ServletRequestAttributeListener. L. s! g* P7 X8 `0 h2 {
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
/ {5 i, O; K& J; ^注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。/ b- S: e1 r# y5 ]
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑0 C0 D$ a# m3 ^- q; u, n% X
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。$ \ B4 r- q6 S" X) R& y( q1 e
三、Listenner的注册
0 }+ w+ @6 |4 H9 a' c4 G* F$ NJavaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:
& \* j+ k4 s# u+ ^, ~1 H<listener>
' f! L$ g% w- D* n( n0 L<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>1 Q7 @" @1 O$ u |
<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>
F6 f: P: z$ l9 n* Q' `. o<!-- 多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
J3 B H+ {2 u) o1 a</listener># k+ h+ ?6 j m8 v6 w' z
注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。( A/ C! V$ P) v
三、应用场景:
/ ?( q, d* T' H9 `% Z# H由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:; P U+ l) m( U, E% k" i, W9 a6 J
1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。% B( {. M6 E. F/ Z/ ~. [* F. O! f
2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。
! p$ _1 h. S8 [5 J等等。 V- n" M! V) l0 }
! a Z" I; B: @& x |
|