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文件中注册(因为它们监听的对象是自己)

  • 相关阅读:
    LeetCode 326. Power of Three
    LeetCode 324. Wiggle Sort II
    LeetCode 322. Coin Change
    LeetCode 321. Create Maximum Number
    LeetCode 319. Bulb Switcher
    LeetCode 318. Maximum Product of Word Lengths
    LeetCode 310. Minimum Height Trees (DFS)
    个人站点大开发!--起始篇
    LeetCode 313. Super Ugly Number
    LeetCode 309. Best Time to Buy and Sell Stock with Cooldown (DP)
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7360249.html
Copyright © 2011-2022 走看看