zoukankan      html  css  js  c++  java
  • 四、监听器

    一、概述

    监听器用于监听事件,如WEB启动、关闭,session链接、断开,用户请求到达,某某范围类属性值发生改变。

    当事件发生时会回调监听器里的方法。

    定义监听器需要两个步骤

      1、定义Listener实现类。

      2、通过Annotation或web.xml文件来配置。

    二、监听器类型

    按监听的对象划分:servlet2.4规范定义的事件有三种:

    1.用于监听应用程序环境对象(ServletContext)的事件监听器

    2.用于监听用户会话对象(HttpSession)的事件监听器

    3.用于监听请求消息对象(ServletRequest)的事件监听器

    按监听的事件类项划分

    1.用于监听域对象自身的创建和销毁的事件监听器

    2.用于监听域对象中的属性的增加和删除的事件监听器

    3.用于监听绑定到HttpSession域中的某个对象的状态的事件监听器

    在一个web应用程序的整个运行周期内,web容器会创建和销毁三个重要的对象,ServletContext,HttpSession,ServletRequest。

    总共有8个监听器接口和6个Event类,其中HttpSessionAttributeListener与HttpSessionBindingListener皆使用HttpSessionBindingEvent;

    HttpSessionListener和HttpSessionActivationListener则都使用HttpSessionEvent;

    Listener对应的Event如下所示:

    Listener接口  Event  事件描述
     ServletContextListener  ServletContextEvent 监听Web应用启动和关闭
     ServletContextAttributeListener  ServletContextAttributeEvent 监听ServletContext范围内(application)的属性值的改变
     HttpSessionListener  HttpSessionEvent 监听session的开始与结束
     HttpSessionActivationListener    
     HttpSessionAttributeListener  HttpSessionBindingEvent 监听HttpSession范围内(session)属性的改变
     HttpSessionBindingListener    
     ServletRequestListener  ServletRequestEvent 监听用户请求
     ServletRequestAttributeListener  ServletRequestAttributeEvent 监听ServletRequest范围内(request)属性的改变

    以下为复制

    一 ServletContext相关监听接口

     补充知识:通过ServletContext 的实例可以存取应用程序的全局对象以及初始化阶段的变量。
     在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
     
     注意:全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由<context-param>元素所设定的变量,它的范围也是Application范围,例如:

     <context-param> 
      <param-name>Name</param-name> 
      <param-value>browser</param-value>
     </context-param>
     
     当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:
      String name = (String)application.getInitParameter("Name");
     或者使用EL时:
      ${initPara.name}
     若是在Servlet中,取得Name的值方法:
      String name = (String)ServletContext.getInitParameter("Name");

     1.ServletContextListener:
     用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
     ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

     ServletContextListener接口的方法:
      void contextInitialized(ServletContextEvent sce)  
     通知正在接受的对象,应用程序已经被加载及初始化。
      void contextDestroyed(ServletContextEvent sce)  
     通知正在接受的对象,应用程序已经被载出。
     ServletContextEvent中的方法:
     ServletContext getServletContext() 
     取得ServletContext对象

     2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。

     ServletContextAttributeListener接口方法:
     void attributeAdded(ServletContextAttributeEvent scab)
     若有对象加入Application的范围,通知正在收听的对象
     void attributeRemoved(ServletContextAttributeEvent scab)
     若有对象从Application的范围移除,通知正在收听的对象
     void attributeReplaced(ServletContextAttributeEvent scab)
     若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象


     ServletContextAttributeEvent中的方法:
     java.lang.String getName()
     回传属性的名称
     java.lang.Object getValue()
     回传属性的值

    二、HttpSession相关监听接口
     1.HttpSessionBindingListener接口
     注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener

     当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法:
     void valueBound(HttpSessionBindingEvent event)
     void valueUnbound(HttpSessionBindingEvent event)

     思考:如何实现记录网站的客户登录日志, 统计在线人数?

     2.HttpSessionAttributeListener接口
     HttpSessionAttributeListener监听HttpSession中的属性的操作。
     当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。这和ServletContextAttributeListener比较类似。

     3.HttpSessionListener接口
     HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

     4.HttpSessionActivationListener接口
      主要用于同一个Session转移至不同的JVM的情形。

    四、ServletRequest监听接口
     1.ServletRequestListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
     2.ServletRequestAttributeListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest 

    自己敲了一些

    1   <listener>
    2   <listener-class>package.class</listener-class>
    3   </listener>
    4   <!-- 用于xml配置 -->
     1 @WebListener
     2 public class HttpSessionListenerTest implements HttpSessionListener {
     3     //再控制器或页面配合session.invalidate();使用
     4     public void sessionCreated(HttpSessionEvent event) {
     5         System.out.println("session开始");
     6     }
     7     
     8     public void sessionDestroyed(HttpSessionEvent event) {
     9         System.out.println("session结束");
    10     }
    11 }
     1 @WebListener
     2 public class ServletContextAttributeListenerTest implements
     3         ServletContextAttributeListener {
     4 
     5     public void attributeAdded(ServletContextAttributeEvent event) {
     6         System.out.println(event.getName());
     7     }
     8 
     9 
    10     public void attributeRemoved(ServletContextAttributeEvent event) {
    11         System.out.println(event.getName());
    12     }
    13 
    14 
    15     public void attributeReplaced(ServletContextAttributeEvent event) {
    16         System.out.println(event.getName());
    17     }
    18 
    19 }
     1 @WebListener
     2 public class ServletContextListenerTest implements ServletContextListener {
     3     ServletContext cxt = null;
     4     
     5     public void contextDestroyed(ServletContextEvent event) {
     6         System.out.println(cxt.getInitParameter("b")+"结束咯");
     7     }
     8 
     9     public void contextInitialized(ServletContextEvent event) {
    10         cxt = event.getServletContext();
    11         System.out.println(cxt.getInitParameter("a")+"开始咯");
    12         System.out.println(cxt.getRealPath("/"));
    13         System.out.println(cxt.getServerInfo());
    14         System.out.println(cxt.getServletNames());
    15         System.out.println(cxt.getServletRegistrations());
    16         System.out.println(cxt.getContextPath());
    17         System.out.println(cxt.getMajorVersion());
    18     }
    19 
    20 }
     1 @WebListener
     2 public class ServletRequestListenerTest implements ServletRequestListener {
     3 
     4     public void requestDestroyed(ServletRequestEvent arg0) {
     5         System.out.println("request抵达");
     6     }
     7 
     8     public void requestInitialized(ServletRequestEvent arg0) {
     9         System.out.println("request消失");
    10     }
    11 
    12 }
  • 相关阅读:
    前端课程体系
    原生ajax
    更加方便获取eid和fp的一种方式-通过HTML文件【京东飞天茅台1499抢购】
    已解决No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    前端如何封装一个组件?怎么造轮子?手写js封装一个dialog弹窗组件。
    Zookeeper集群介绍及其搭建
    重装系统后软件安装 ----一直更新
    ubantu环境下fidder安装
    HDU1281: 棋盘游戏(二分图匹配)
    HDU1083 :Courses(二分图匹配)
  • 原文地址:https://www.cnblogs.com/xunol/p/3231413.html
Copyright © 2011-2022 走看看