zoukankan      html  css  js  c++  java
  • 16.Listener(监听器)

    /*监听器*/

    java的事件监听机制(主要是对一些web元素的监听 (ServletContext(计时器),HttpSession和ServletRequest))

      1.事件监听涉及到三个组件:事件源、事件对象、事件监听器(当事件源上发生某个事件对象时,调用事件监听器中的方法)

      2.当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去,

      开发人员在监听器中通过事件对象,就可以拿到事件源,从而对事件源进行操作。


    设计一个可以 /*被别的对象监听*/的对象(事件源类 事件对象类 事件监听器接口)如:windows窗口

    (Windows窗口是事件源,当点击关闭时,调用事件监听器类的关闭方法,传递事件对象 Event e 然后再通过e.getSource拿到事件源,重写关闭方法)

    /*JAVAWEB中的监听器*/

      1.写监听器(实现相应接口后写方法)

     1 public class UserLoginListener implements HttpSessionAttributeListener {
     2 
     3     @Override
     4     public void attributeAdded(HttpSessionBindingEvent se) {
     5         //从servletContext 域中得到用于保存所有的登陆用户的map
     6         ServletContext context = se.getSession().getServletContext();
     7         Map map = (Map) context.getAttribute("map");
     8         if (map == null) {
     9             map = new HashMap();
    10             context.setAttribute("map", map);
    11         }
    12 
    13         Object obj = se.getValue();
    14         HttpSession session = se.getSession();
    15         if (obj instanceof User) {
    16             User user = (User) obj;
    17             map.put(user.getUsername(), session);
    18         }
    19 
    20     }
    21 
    22     @Override
    23     public void attributeRemoved(HttpSessionBindingEvent arg0) {
    24         // TODO Auto-generated method stub
    25 
    26     }
    27 
    28     @Override
    29     public void attributeReplaced(HttpSessionBindingEvent arg0) {
    30         // TODO Auto-generated method stub
    31 
    32     }
    33 
    34 }

      2.注册到事件源上(web.xml)

    1 <listener>
    2       <listener-class>cn.itcast.listener.UserLoginListener</listener-class>
    3 </listener>

    在Servlet监听器分类

    用于监听的事件源分别为:ServletContext(计时器),HttpSession和ServletRequest
      1.监听域对象自身的创建和销毁的事件监听器。
      2.监听三个域对象属性的变化,三个域对象有各自的监听器接口(如:ServletContextAttributeListener)
       这三个接口都定义了三个方法,对属性的变化(增,删,替换)的监听
      3.监听绑定到HttpSession域中的某个对象的状态的事件监听器。

    注: 监听器对象只有一个(和过滤器类似)(即一个session监听器为所有的session创建服务)


    应用:

      1.统计当前在线用户个数(使用session监听器 只要用户访问,即为用户创建session,统计内存里面有多少session)(不准确)

      2.自定义session扫描器(

        1.实现HttpSessionLinstener和ServletContextListener接口

         2.在servletContext对象创建时,设置一个定时器 每隔一分钟执行任务

         3.对任务进行描述  (TimerTask的run方法))

      注:1.一个类可以实现多个接口(实现HttpSessionLinstener和ServletContextListener接口),这个类可以 /*监听两个事件源*/

        2.将每个session对象放在一个List中 (涉及多次增删改查,所以用LinkedList)

        3.如果使用Iterator对List进行迭代 Iterator如果并发执行操作,迭代器会出现不确定性行为。(抛出ConcurrentModificationException)(并发修改异常)


        /*ListIterator可以并发执行操作*/ 不会抛出这种异常

        出现这种异常的原因(集合在迭代的过程中 集合元素不能增删) 如果使用Iterator 只能 List集合自己完成增删

         如果使用 ListIterator 可以使用迭代器(不是集合自身)的remove和 add方法

    /*监听绑定到HttpSession域中的某个对象的状态的事件监听器。 */
    保存在Session域中的对象可以有多种状态:

      1.绑定到Session中;

      2.从Session域中解除绑定;

      3.随Session对象持久化到一个存储设备中(钝化);

      4.随Session对象从一个存储设备中恢复 (活化)

    Servlet规范中定义了两个特殊的监听器接口来帮助JavaBean对象了解自己在Session域中的这些状态“HTTPSessionBindingListener接口(1、2)

    和HttpSessionActivationListener(3、4)接口,实现这两个接口的类 /*不需要*/在web.xml文件中注册(因为它们监听的对象是自己)

  • 相关阅读:
    32/64位平台printf uint64的方法
    [Linux 安装]centos安装vmware tools
    【Linux】fg bg ctrl + z jobs & 等命令
    让我们慢慢地彼此遗忘
    ctrl+c,ctrl+d,ctrl+z在linux中意义
    Windows 7 右键菜单 添加命令
    修改vs2010所有工程的include目录和lib目录
    Vmware虚拟机的linux与主机共享
    防止atoi函数内存越界
    JavaScriptSerializer使用条件
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7360249.html
Copyright © 2011-2022 走看看