Servlet事件监听器
监听器就是一个实现特定接口的普通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事件监听器的更多相关文章
- 第六章 对象作用域与servlet事件监听器
作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器 一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...
- Java精选笔记_Servlet事件监听器
Servlet事件监听器 概述 在程序开发中,经常需要对某些事件进行监听,如监听鼠标点击事件.监听键盘按下事件等,此时就需要使用事件监听器. 事件监听器用于对程序中发生的事件进行监听,在监听的过程中会 ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 监听器第一篇【基本概念、Servlet各个监听器】
什么是监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 为什么我们要使用监听器 ...
- 05).30分钟学会Servlet+过滤器+监听器+实际案例
一.Servlet简介: Servlet程序处理流程 二.Servlet程序实现 实现要求 Servlet属于java ee范畴,而java和javac属于java se范畴,要想编译servlet必 ...
- Servlet的监听器
Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...
- Servlet之监听器(Listener)
一.监听器(Listener)概述 1.概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Se ...
- Java事件监听器的四种实现方式
自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...
- 域对象中属性变更及感知session绑定的事件监听器
域对象中属性的变更的时间监听器就是用来监听ServletContext,HttpSession,HttpServletRequest这三个对象中的属性变更信息事件的监听器.这三个监听器接口分别是Ser ...
随机推荐
- hdu_5790_Prefix(trie+主席树)
题目链接:hdu_5790_Prefix 题意: 给你n个字符串,字符串总长度不超过10W,然后给你一个区间,问你这个区间的字符串不相同的前缀有多少个. 题解: 由于z与上一个答案有关,所以强制在线, ...
- MongoDB文档基本操作
一.插入文档 使用insert()或save()方法向集合插入文档 >db.COLLECTION_NAME.insert(document) 详细用法可以参考MongoDB菜鸟教程 二.查找文档 ...
- 5. Java反射机制
Java反射机制 问题: 在运行时,对一个JAVA类,能否知道属性和方法:能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现. 目录 什么是JAVA的反射机制 JDK中提供的R ...
- Infix to postfix without '(' and ')'
#include<iostream> #include<stack> #include<string> #include<deque> using na ...
- marble 基本函数(一)
. 标记 GeoDataPlacemark *place = new GeoDataPlacemark( "Bucharest" ); place->setCoordinat ...
- Linode和DigitalOcean lnmp一键安装包哪个好?
Linode和DigitalOcean都是非常棒的VPS厂商,512MB内存的VPS每月低到5美元,搭建wordpress网站,非常方便,甚至可以多人共用,服务器足够强悍,跑几个wordpress博客 ...
- static 控件颜色修改
在对话框上放一个StaticText控件后如果文字长度不能铺满控件的 rect,如下: 那么运行时会出现如下效果 通过MSG_WM_CTLCOLORSTATIC消息修改static控件背景色模式为透明 ...
- FireFox站点标识按钮
Firefox 的站点标识按钮可以为您提供有关您访问的网站的详细信息.通过站点标识按钮,您可以了解到站点的加密信息.验证信息.网站所有者和网站验证者.这有助于避免恶意网站获得您的重要信息. 站点标识按 ...
- 【Machine Learning in Action --4】朴素贝叶斯电子邮件垃圾过滤
摘要:这里用的是词袋模型,即一个词在文档中出现不止一次,每个单词可以出现多次. 1.准备数据:切分文本 前一节过滤网站恶意留言中词向量是给定的,下面介绍如何从文本文档中构建自己的词列表 先举例说明,在 ...
- hdu5573 二叉树找规律,二进制相关
input T 1<=T<=100 n k 1<=n<=1e9 n<=2^k<=2^60 output 从1走到第k层,下一层的数是上一层的数×2或者×2+1,每 ...