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的作用
  • 获取属性名
//获取属性名          
String name = se.getName();
  • 获取属性值
//获取属性值          
Object value = se.getValue();          
System.out.println("session域中的属性名是:"+name);          
System.out.println("session域中的被替换之前的属性值是:"+value);
  • 获取HttpSession对象
//获取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 @ 2021-11-30 15:30  皮蛋&&瘦肉  阅读(244)  评论(0)    收藏  举报