我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > javaweb开发中监听器Listener详解
总共48087条微博

动态微博

查看: 1590|回复: 1

javaweb开发中监听器Listener详解

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2015-05-19 19:11:41 |只看该作者 |倒序浏览
    一、监听器原理:
    1 w- m" _. ]  ^! l监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。6 G( E0 M& z7 {2 v5 G! k' N
    * x- F! Y: S& T8 t+ n4 \8 F
    0 X9 h. u5 z" L; f# S9 I7 t
    ; m  \% a5 Q# R3 t6 v2 v
    简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。- r4 y: K" D: T: V9 N/ w# W
    简单的类图示例:
    9 s7 ]* |8 M1 c3 f - M/ W4 W2 N& l

    ( ^; X, P* Z( y9 ~" G# P9 ~二、简介:) Z6 ~, W, |, E9 N' J
    在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。( \/ N! n- h; S
    Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:7 w( k. t4 K, Y+ b6 ?0 h, a
    1>监听三个域对象创建和销毁的事件监听器" w" D  E( L! E/ ~% m$ K2 E
    2>监听域对象中属性的增加和删除的事件监听器. g% t6 g, l1 f* ~; X( P% G) z
    3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
    ( [; k' g6 z) C) Pa、如三个域对象的创建与销毁方法签名:
    ! N& ?+ x" M# I4 O7 U- M9 n2 r4 P+ O+ KServletRequestListener有以下两个方法! N4 X! b) h9 e' `
    void requestDestroyed(ServletRequestEvent sre)  , M2 k* _: a* @. r5 I. y2 q
    void requestInitialized(ServletRequestEvent sre)
    9 M5 l0 G. `1 cHttpSessionListener有以下两个方法& n1 L2 \! f4 n' t% K
    void sessionCreated(HttpSessionEvent se) # n& Q  b7 b' g/ ~# I
    void sessionDestroyed(HttpSessionEvent se)  
    : _; f3 r# g0 g+ KServletContextListener
    6 G# u' G6 a% g- O, r3 Jvoid contextDestroyed(ServletContextEvent sce)
    . [5 ]% F* G0 n2 Y" ~& C0 avoid contextInitialized(ServletContextEvent sce)  & a* E* G+ u/ i% D( l  J$ F
    b、三个类型对象域中增、删、改的监听器(3个)
    : Y+ ^# C: L  h* OServletContextAttributeListener,2 v2 k3 W2 i/ Z! r5 f
    HttpSessionAttributeListener,. k5 [! C2 D! k& v
    ServletRequestAttributeListener
    7 Z7 I0 a4 a$ k! C6 ?! F7 H+ xc、感知型监听器(2个):监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
    + X2 t5 z- h. n# d6 H% f注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。! {2 |; Y( F% D) l8 g3 ^6 N
    HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑" b2 B6 j9 I  k) l' Q1 O) A
    HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。
    3 L: A. C8 K& n/ f* U7 X/ w" W4 G三、Listenner的注册9 t. Q& U5 }. k6 _! S2 f
    Javaweb的这些特别的监听器注册比较简单,因为ServletRequest、HttpSession、ServletContext对象都是容器创建的,所以需要它们的监听器的话,只需要在应用的web-info的web.xml里配置即可:
    4 C1 d. t4 u1 p& `  _  w# {  t2 P+ K<listener>
    $ `( C5 g9 F( S2 Y' Z) b<listener-class>com.test.listener.MyHttpSessionAttributeListener</listener-class>
    " E" G4 w2 i' U% {4 L, s<listener-class>com.test.listener.MyServletContextAttributeListener</listener-class>
    9 @$ p: c+ n. w3 @3 }6 ~" P6 E<!--  多个实现相同的Listenner接口,在执行时是按web.xml注册出现的来决定。 -->
    7 T4 w9 S- X6 [  v) j+ T8 n$ B</listener>! S# N# t, F+ P3 J/ Q; K0 Y) E
    注意:感知型监听器HttpSessionBindingListener、HttpSessionActivationListener不需要注册。, x9 D5 Z1 l) P" m
    三、应用场景:9 _9 ?8 y: J+ i: \  y) `" ^
    由于ervletRequest、HttpSession、ServletContext对象都是容器创建的,什么时候创建,用户都不知道。通过实现这些对象的监听器后,就可以得知了。比如:8 c. w* ]6 U7 g( W
    1>在ServletContextLintener监听器的contextInitialized方法中,进行应用级的资源初始化以便提高效率,在contextDestroyed方法中对应用级的资源进行释放。
    # Z* R9 F8 c5 V: T$ v6 [1 A9 }2>又比如web应用中,会存在会话,通常的作法是将当前登录的用户存放在session会话中。那么如何统计在线人数话,如何显示出当前登录的用户呢。如何踢出某些已登录的用户呢。就可以通过HttpSessionAttributeListener监听器的attributeAdded方法。3 C$ a$ o6 c) S6 G
    等等。2 A, H) d, N2 |- X
    + n7 n2 w  |# o7 j# C( w) [! i, A

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    3

    主题

    0

    听众

    212

    金钱

    四袋长老

    该用户从未签到

    沙发
    发表于 2016-03-07 18:00:06 |只看该作者
    很不错哟,谢谢楼主,受教了。
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表