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的概念是类似的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)