Listener

一、监听器简介
1、生活中的监听器:监听器:朝阳群众;监听的对象:明星;监听的事件:离婚、嫖娼、吸毒;回调函数:鼓掌庆贺、报警;又比如:地铁车站的安检仪,有危险物时自动报警;
2、JavaWeb中的监听器Listener是服务器端的三大组件之一;当web应用中发生某些特定的事件时,监听器可以监听到这些事件并自动触发一些操作;
 
二、监听器分类:
1、使用Servlet监听器可以实现对事件的监听。ServletAPI中共定义了3类8个监听器接口,用于监听ServletContext、HttpSession、ServletRequest对象的生命周期。如下图所示:
2、监听的分类
根据三个域对象(request、session、application)上的具体操作,可将监听器划分为三类:
监听三个域对象的创建和销毁的监听器,称为生命周期监听器(3个);
监听域对象中属性的增加、删除、替换事件的监听器,称为属性变化监听器(3个);
监听被绑定到HttpSession域中的某个对象的状态的监听器,称为感知型监听器(2个);
 
三、生命周期监听器
1、ServletRequest的生命周期监听器:ServletRequestListener
  • 方法:
    • requestDestroyed(ServletRequestEvent sre):ServletRequest对象被销毁时调用
    • requestInitialized(ServletRequestEvent sre):ServletRequest对象被创建时调用
  • 方法中参数sre的作用
1)获取ServletRequest对象
                    ServletRequest servletRequest = sre.getServletRequest();
2)获取ServletContext对象
                    ServletContext servletContext = sre.getServletContext();
2、HttpSession的生命周期监听器:HttpSessionListener
  • 方法:
    • sessionCreated(HttpSessionEvent se):HttpSession对象被创建时调用
    • sessionDestroyed(HttpSessionEvent se):HttpSession对象被销毁时调用
  • 方法中参数se的作用:获取HttpSession对象
3、ServletContext的生命周期监听器:★ServletContextListener (相当于application,对一个应用进行全局监听.随应用启动而启动,随应用消失而消失)
  • 方法:
    • contextDestroyed(ServletContextEvent sce):ServletContext对象被销毁时调用
    • contextInitialized(ServletContextEvent sce):ServletContext对象被创建调用
  • 方法中参数sce的作用:获取ServletContext对象
四、属性变化监听器
  • 属性的变化指属性的添加、替换、移除
1、ServletRequest的属性变化监听器:ServletRequestAttributeListener
  • 方法:
    • attributeAdded(ServletRequestAttributeEvent srae):向request域中添加属性时调用
    • attributeRemoved(ServletRequestAttributeEvent srae):将request域中的属性移除时调用
    • attributeReplaced(ServletRequestAttributeEvent srae):request域中的属性被替换时调用
  • 参数srae的作用:
    • 获取属性名
    • 获取属性值
    • 获取ServletRequest对象
    • 获取ServletContext对象
2、HttpSession的属性变化监听器:HttpSessionAttributeListener
  • 方法:
    • attributeAdded(HttpSessionBindingEvent se):向session域中添加属性时调用
    • attributeRemoved(HttpSessionBindingEvent se):将session域中的属性移除时调用
    • attributeReplaced(HttpSessionBindingEvent se):session域中的属性被替换时调用
  • 参数se的作用
  • 获取属性名
1
2
//获取属性名         
String name = se.getName();
  • 获取属性值
1
2
3
4
//获取属性值         
Object value = se.getValue();         
System.out.println("session域中的属性名是:"+name);         
System.out.println("session域中的被替换之前的属性值是:"+value);
  • 获取HttpSession对象
1
2
3
4
5
//获取session域中被替换之后的属性值        
//获取Session对象         
HttpSession session = se.getSession();         
Object newValue = session.getAttribute("user");         
System.out.println("session域中的被替换之后的属性值是:"+newValue);

 

3、ServletContext的属性变化监听器:ServletContextAttributeListener
  • 方法:
    • attributeAdded(ServletContextAttributeEvent scae):向application域中添加时调用
    • attributeRemoved(ServletContextAttributeEvent scae):将application域中的属性移除时调用
    • attributeReplaced(ServletContextAttributeEvent scae):application域中的属性被替换时调用
  • 参数scae的作用
    • 获取属性名
    • 获取属性值
    • 获取ServletContext对象
五、感知型监听器
即:session域中的属性变化监听器
  • 通过以下两个接口创建的监听器不需要在web.xml中注册
  • 以下两个接口是由JavaBean来实现,然后JavaBean实例下session域中的变化将会被自动监听
1、★HttpSessionBindingListener
  • 用来监听JavaBean实例在session域中的被添加和被移除事件
  • 其实现类的实例可以感知自己被绑定到session中或从session中解绑
  • 方法:
    • valueBound(HttpSessionBindingEvent event):JavaBean实例被添加到session域中时调用
    • valueUnbound(HttpSessionBindingEvent event):JavaBean实例从session域中移除时调用
  • 方法中参数event的作用
  • 获取属性名
  • 获取属性值
  • 获取HttpSession对象
2、HttpSessionActivationListener
  • 用来监听Session与session域中的JavaBean实例的活化和钝化
  • 其实现类的实例绑定到session中后,容器在钝化和活化session时将通知该实例
  • 方法:
    • sessionDidActivate(HttpSessionEvent se):JavaBean实例与Session对象活化时调用
    • sessionWillPassivate(HttpSessionEvent se):JavaBean实例与Session对象钝化时调用
  • 方法中参数se的作用
  • 获取HttpSession对象
 
一个问题:像统计在线人数、记录访问日志、读取参数、初始化资源之类的功能直接使用session,request就能完成,为什么要用Listenter,意义在哪里?
答:一般用Listener实现集中日志,计数器这些运维方面的功能,Servlet只实现业务逻辑。否则业务逻辑与运维功能混淆,而且在Servlet中会有大量的重复代码。这其实跟Spring AOP的概念是类似的。

posted @   皮蛋&&瘦肉  阅读(232)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示