写在前面:

监听器用的不多,了解下就行,毕竟万一用到了呢。

这课不录视频。教程内容我直接复制其他人的,毕竟不是很重要,我也不怎么用,而且也太简单了。


教程:

Listener(监听器)

简介


  • Listener用于监听JavaWeb程序中的事件。
  • 例如:ServletContext、HttpSession、ServletRequest的创建、修改和删除。
  • Listener和我们之前学习的JS中的事件处理机制类似。在JS中,当我们触发某个事件后(例如:点击一个按钮)程序会调用一个响应函数来处理事件。同样的,在JavaWeb中,我们可以为某些事件来设置监听器,当事件被触发时,监听器中的指定方法将会被调用。

观察者模式


  • Listener的原理是基于观察者模式的,所谓观察者模式简单来说,就是当被观察者的特定事件被触发(一般这某些方法被调用)后,会通知观察者(调用观察者的方法),观察者可以在自己的方法中来对事件做一些处理。
  • 在我们的JavaWeb中,观察者就是Listener,而被观察者可能有三个ServletContext、HttpSession、ServletRequest。而事件指的就是这些对象的创建、修改和删除等。

监听器的分类

  1. 监听对象的创建与销毁
  • ServletContextListener

  1. 作用:监听ServletContext对象的创建与销毁
  2. 方法:

  1. public void contextInitialized ( ServletContextEvent sce );
  1. ServletContext创建时调用
  1. public void contextDestroyed ( ServletContextEvent sce );
  1. ServletContext销毁时调用

  1. ServletContextEvent对象
  1. 作用:public ServletContext getServletContext ()
  1. 获取ServletContext对象



  • HttpSessionListener

  1. 作用:监听HttpSession对象的创建与销毁
  2. 方法:

  1. public void sessionCreated ( HttpSessionEvent se );
  1. HttpSession对象创建时调用
  1. public void sessionDestroyed ( HttpSessionEvent se );
  1. HttpSession对象销毁时调用
  1. HttpSessionEvent对象
  1. 作用:public HttpSession getSession ()
  1. 获取当前HttpSession对象


  • ServletRequestListener

  1. 作用:监听ServletRequest对象的创建与销毁
  2. 方法:

  1. public void requestInitialized ( ServletRequestEvent sre );
  1. ServletRequest对象创建时调用
  1. public void requestDestroyed ( ServletRequestEvent sre );
  1. ServletRequest对象销毁时调用
  1. ServletRequestEvent对象
  1. 作用:

  1. public ServletRequest getServletRequest ();
  1. 获取当前的ServletRequest对象。
  1. public ServletContext getServletContext ();
  1. 获取当前项目的ServletContext对象。




创建与销毁监听器的使用:


  • 三种创建与销毁的监听器使用起来基本一致。
  • 下边来编写一个ServletContext的监听器:
  1. 步骤:
  1. 创建一个类实现ServletContextListener


publicclass MyServletContextListener implements ServletContextListener {

   @Override

   publicvoid contextInitialized(ServletContextEvent sce) {

      System.out.println("哈哈,我是ServletContext,我出生了");

   }

   @Override

   publicvoid contextDestroyed(ServletContextEvent sce) {

      System.out.println("~~~~(>_<)~~~~,我是ServletContext,我要死了");  

   }

}


  1. 在web.xml文件中注册监听器


<listener>

<listener-class>com.atguigu.web.listener.MyServletContextListener</listener-class>

</listener>



  1. 由于ServletContext对象在服务器启动时创建,停止时销毁。所以启动服务器时我们会发现contextInitialized()方法被调用,服务器停止时contextDestroyed()方法被调用。
  2. 其他两个监听器和该监听器使用方法一样,不再多说。

2. 监听对象的属性变化


  • ServletContextAttributeListener

  1. 作用:监听ServletContext中属性的创建、修改和销毁
  2. 方法:

  1. public void attributeAdded(ServletContextAttributeEvent scab);
  1. 向ServletContext中添加属性时调用
  1. public void attributeRemoved(ServletContextAttributeEvent scab);
  1. 从ServletContext中移除属性时调用
  1. public void attributeReplaced(ServletContextAttributeEvent scab);
  1. 当ServletContext中的属性被修改时调用

  1. ServletContextAttributeEvent对象
  1. 作用:

  1. public String getName()
  1. 获取修改或添加的属性名
  1. public Object getValue()
  1. 获取被修改或添加的属性值
  1. public ServletContext getServletContext ()
  1. 获取当前WEB应用的ServletContext对象


  • HttpSessionAttributeListener

  1. 作用:监听HttpSession中属性的创建、修改和销毁
  2. 方法:

  1. public void attributeAdded ( HttpSessionBindingEvent se );
  1. 向HttpSession中添加属性时调用
  1. public void attributeRemoved(HttpSessionBindingEvent se);
  1. 从HttpSession中移除属性时调用
  1. public void attributeReplaced(HttpSessionBindingEvent se);
  1. 当HttpSession中的属性被修改时调用

  1. HttpSessionBindingEvent对象
  1. 作用:

  1. public String getName()
  1. 获取修改或添加的属性名
  1. public Object getValue()
  1. 获取被修改或添加的属性值
  1. public HttpSession getSession ()
  1. 获取当前的HttpSession对象


  • ServletRequestAttributeListener

  1. 作用:监听ServletRequest中属性的创建、修改和销毁
  2. 方法:

  1. public void attributeAdded (ServletRequestAttributeEvent srae );
  1. 向ServletRequest中添加属性时调用
  1. public void attributeRemoved(ServletRequestAttributeEvent srae);
  1. 从ServletRequest中移除属性时调用
  1. public void attributeReplaced(ServletRequestAttributeEvent srae);
  1. 当ServletRequest中的属性被修改时调用

  1. ServletRequestAttributeEvent对象
  1. 作用:

  1. public String getName()
  1. 获取修改或添加的属性名
  1. public Object getValue()
  1. 获取被修改或添加的属性值
  1. public ServletRequest getServletRequest ()
  1. 获取当前的ServletRequest对象



对象属性变化监听器的使用:

  • 同样三种对象属性变化监听器使用方式类似,下边以request属性监听器为例。
  1. 创建一个类实现ServletRequestAttributeListener接口


publicclass ReqAttrListener implements ServletRequestAttributeListener {

   @Override

   publicvoid attributeAdded(ServletRequestAttributeEvent srae) {

      System.out.println("request域中添加一个属性"+srae.getName()+"="+srae.getValue());

   }

   @Override

   publicvoid attributeRemoved(ServletRequestAttributeEvent srae) {

      System.out.println("request域中移除一个属性"+srae.getName()+"="+srae.getValue());

   }

   @Override

   publicvoid attributeReplaced(ServletRequestAttributeEvent srae) {

      System.out.println("request域中一个属性被修改了"+srae.getName()+"="+srae.getValue());

   }


}


  1. 在web.xml文件中注册监听器


   <listener>

      <listener-class>com.atguigu.web.listener.ReqAttrListener</listener-class>

   </listener>


  1. 如此当我们操作request域中的属性时,对应方法将会被调用。

3. 监听Session内的对象


  • HttpSessionBindingListener

  1. 作用:监听某个对象在session域中的创建与移除。
  2. 方法:

  1. public void valueBound(HttpSessionBindingEvent event)
  1. 该类的实例被放到Session域中时调用
  1. public void valueUnbound(HttpSessionBindingEvent event)
  1. 该类的实例从Session中移除时调用

  1. HttpSessionBindingEvent对象
  1. 作用:

  1. public HttpSession getSession ()
  1. 获取HttpSession对象
  1. public String getName()
  1. 获取操作的属性名
  1. public Object getValue()
  1. 获取操作的属性值


  • 使用:要监听哪一个类,直接使该类实现HttpSessionBindingListener接口即可。


publicclass Student implements HttpSessionBindingListener {

   @Override

   publicvoid valueBound(HttpSessionBindingEvent event) {

      //doSomeThing

   }

   @Override

   publicvoid valueUnbound(HttpSessionBindingEvent event) {

      //doSomeThing

   }

}




  • HttpSessionActivationListener

  1. 作用:监听某个对象在session中的序列化与反序列化。
  2. 方法:

  1. public void sessionWillPassivate(HttpSessionEvent se)
  1. 该类实例和Session一起钝化到硬盘时调用
  1. public void sessionDidActivate(HttpSessionEvent se)
  1. 该类实例和Session一起活化到内存时调用

  1. HttpSessionEvent对象
  1. 作用:
  1. public HttpSession getSession ()
  1. 获取HttpSession对象

  • 使用:要监听哪一个类,直接使该类实现HttpSessionActivationListener接口即可。


publicclass Student implements HttpSessionActivationListener , Serializable {

   privatestaticfinallongserialVersionUID = 1L;

   @Override

   publicvoid sessionWillPassivate(HttpSessionEvent se) {

      // TODO Auto-generated method stub

   }

   @Override

   publicvoid sessionDidActivate(HttpSessionEvent se) {

      // TODO Auto-generated method stub

   }

}


注意:这里为了是Student对象可以正常序列化到硬盘上,还需要让类实现java.io.Serializable接口