监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

面试题:请描述一下java事件监听机制。
  1. java的事件监听机制涉及到三个组件:事件源、事件监听器、事件对象
  2. 当事件源上发生操作时,它将会调用事件监听器的一个方法,并在调用这个方法时,会传递事件对象过来。
  3. 事件监听器由开发人员编写,开发人员在事件监听器中,通过事件对象可以拿到事件源,从而对事件源上的操作进行处理。

监听自己开发的Person类的两个方法的调用 :观察者设计模式

//观察者设计模式(observer设计模式)

//事件源
class Person{
    private PersonListener listener;
    public void registerListener(PersonListener listener){
        this.listener = listener;
    }
    public void run(){
        if(listener!=null){
            Even even = new Even(this);
            this.listener.dorun(even);
        }
        System.out.println("runn!!");
    }
    public void eat(){
        if(listener!=null){
            Even e = new Even(this);
            this.listener.doeat(e);
        }
        System.out.println("eat!!");
    }
}
//事件监听器
interface PersonListener{
    public void dorun(Even even);
    public void doeat(Even even);
}
//事件对象(封装事件源)
class Even{
    private Person person;
    public Even() {
        super();
    }

    public Even(Person person) {
        super();
        this.person = person;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}
public class Demo3 {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Person p = new Person();
        p.registerListener(new MyListener1());
        p.eat();
        p.run();
    }
}

class MyListener1 implements PersonListener{

    public void doeat(Even even) {
        System.out.println(even.getPerson()+"你天天吃,你就知道吃,你猪啊!!");
    }

    public void dorun(Even even) {
        System.out.println(even.getPerson()+"你吃完就跑,有病!!");

    }

}

在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。

Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。

  1. 监听三个域对象创建和销毁的事件监听器

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

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

具体查看API   servlet.chm

应用:监听ServletContex的启动和销毁

public class MyServletContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("servletContext被创建了!");//web应用启动的时候,执行
    }
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("servletcontext被销毁了!!");//web应用关闭的时候,执行
    }
}

监听器要在web.xm注册一下:

<listener>
     <listener-class>cn.itcast.web.listener.MyServletContextListener </listener-class> 
</listener>

统计当前在线人数:Session监听器,统计出当前有多少session即可

public class CountNumListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer count = (Integer) context.getAttribute("count");
        if(count==null){
            count = 1;
            context.setAttribute("count", count);
        }else{
            count++;
            context.setAttribute("count", count);
        }
    }
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer count = (Integer) context.getAttribute("count");
        count--;
        context.setAttribute("count", count);
    }
}

自定义Session扫描器:自己扫描管理session,比如五分钟没有人用了,就摧毁session。

即写一个session监听器,当有session创建的时候,加入到一个集合中,实现自己管理session。

public class SessionScanner implements HttpSessionListener,ServletContextListener {

    private List<HttpSession> list = Collections.synchronizedList(new LinkedList<HttpSession>());//涉及到大量的增删操作,使用链表结构
    private Object lock = new Object();
    public void contextInitialized(ServletContextEvent sce) {//web应用启动的时候,定时器就开始计时。
        Timer timer = new Timer();
        timer.schedule(new MyTask(list,lock), 0, 30*1000);
    }

    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println(session + "被创建了!!");
        synchronized (lock) {  //锁旗标
            list.add(session);
        }
    }
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println(se.getSession() + "被销毁了");
    }

    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub
    }
}

class MyTask extends TimerTask{
    private List list;
    private Object lock;
    public MyTask(List list,Object lock){
        this.list = list;
        this.lock = lock;
    }
    @Override
    public void run() {
        System.out.println("定时器执行!!");
        synchronized (this.lock) {
            ListIterator it = list.listIterator();
            while(it.hasNext()){
                HttpSession session = (HttpSession) it.next();
                if((System.currentTimeMillis()-session.getLastAccessedTime())>30*1000){
                    session.invalidate();
                    //list.remove(session);  //并发修改异常
                    it.remove();
                }
            }
        }
    }
}

定时发邮件:定时器的应用

public class SendMailTimer implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        Timer timer = new Timer();
        Calendar c = Calendar.getInstance();
        c.set(2011, 3, 7, 11, 54, 44);
        timer.schedule(new TimerTask(){
            @Override
            public void run() {
                System.out.println("发邮件!!!");
            }
        }, c.getTime());
    }

    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub

    }
}

Servlet事件监听器的更多相关文章

  1. 第六章 对象作用域与servlet事件监听器

          作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器     一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...

  2. Java精选笔记_Servlet事件监听器

    Servlet事件监听器 概述 在程序开发中,经常需要对某些事件进行监听,如监听鼠标点击事件.监听键盘按下事件等,此时就需要使用事件监听器. 事件监听器用于对程序中发生的事件进行监听,在监听的过程中会 ...

  3. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. 监听器第一篇【基本概念、Servlet各个监听器】

    什么是监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 为什么我们要使用监听器 ...

  5. 05).30分钟学会Servlet+过滤器+监听器+实际案例

    一.Servlet简介: Servlet程序处理流程 二.Servlet程序实现 实现要求 Servlet属于java ee范畴,而java和javac属于java se范畴,要想编译servlet必 ...

  6. Servlet的监听器

    Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...

  7. Servlet之监听器(Listener)

    一.监听器(Listener)概述 1.概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Se ...

  8. Java事件监听器的四种实现方式

    自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...

  9. 域对象中属性变更及感知session绑定的事件监听器

    域对象中属性的变更的时间监听器就是用来监听ServletContext,HttpSession,HttpServletRequest这三个对象中的属性变更信息事件的监听器.这三个监听器接口分别是Ser ...

随机推荐

  1. Java 集合 HashMap & HashSet 拾遗

    Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果选择 ...

  2. phpstrom 快捷使用方式

    file-settings--key map键映射-->collapse(代码折叠)---- ctrl (减减)2次全部折叠  (加加)2次全部展开 格式化代码  ctrl+alt+L 替换 c ...

  3. Caffe+Ubuntu14.04+CUDA7.5 环境搭建(新人向)指南

    序 本文针对想学习使用caffe框架的纯新手,如果文中有错误欢迎大家指出. 由于我在搭建这个环境的时候参考了许多网上的教程,但是没有截图,所以文中图片大多来源于网络. 本文没有安装matlab的步骤, ...

  4. 希望获取到页面中所有的checkbox怎么做?

    var domList = document.getElementsByTagName(‘input’); var checkBoxList = []; var len = domList.lengt ...

  5. HTML转PDF

    1)使用工具转换.如:wkhtmltopdf 2)Chrome浏览器打印功能中,有另存为PDF格式文件.(推荐最便捷)

  6. 移动端touch事件影响click事件的相关解决方法

    preventDefault()的方法,阻止事件的默认行为. 在移动端,手指点击一个元素,会经过:touchstart --> touchmove -> touchend -->cl ...

  7. 模拟SPI协议时序

    SPI是串行外设接口总线,摩托罗拉公司开发的一种全双工,同步通信总线,有四线制和三线制. 在单片机系统应用中,单片机常常是被用来当做主机(MASTER),外围器件被当做从机(SLAVE). 所以,在以 ...

  8. toggle的使用心得

    点击同一个标签可以实现不同效果 或者几个效果 以前一般都是if 判断的 逻辑还有判断比较繁琐 看啦手册后 发现这个功能可以不用判断的自动循环点击事件 比以前的简单好用 主要用法:$("td& ...

  9. winsock编程select模型

    winsock编程select模型 网络服务端连接数量过多时,为每一个连接申请一个线程会让机器性能急剧下降(大多说是因为线程在用户态和内核态之间切换会占用大量的CPU时间片).为了解决多线程带来的性能 ...

  10. 解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载

    解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载 当这两个头文件顺序颠倒时,编译会出现许多莫名其妙的错误,错误如下: 1>…\include\ws2def.h( ...