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 ...
随机推荐
- pthread_create线程创建的过程剖析(转)
概述 在Linux环境下,pthread库提供的pthread_create()API函数,用于创建一个线程.线程创建失败时,它可能会返回ENOMEM或EAGAIN.这篇文章主要讨论线程创建过程中碰到 ...
- Xshell连接服务器密钥改成密码登录
密钥登陆 直接点本地shell打开之后直接ssh ip连接 需要centos用户登录,选择机器密钥. 登录后 sudo su - root 修改root密码 passwd root 修改文件 vi / ...
- Android Lights
Android Lights 很多Android手机上都配有LED灯,手机在充电.新来短信等时候都会有相应的指示灯提示. Android系统之中,一共定义了8个逻辑灯,包含:背光,键盘灯,按键灯,充电 ...
- ural 1698. Square Country 5(记忆化搜索)
1698. Square Country 5 Time limit: 2.0 secondMemory limit: 64 MB The first arithmetical operation ta ...
- offset()值不准问题
本来应该只需获取含图片的div的offset(),然后将标签div的坐标设置好即可,但是不知为何越靠后的div的offset().top越不正常,跟标准值偏离的越来越大. 即使你在$(document ...
- hibernate的批量更新、批量删除
hibernate的批处理API:session.createQuery(hql).executeUpdate(),如果有参数则在执行之前设置参数. 批量更新示例: @Test public void ...
- ssl证书验证
当我们在访问https网站时,浏览器就会自动下载该网站的SSL证书,并对证书的安全性进行检查. 其他概念不说了,有效期之类的验证也不说了.只说数字证书的真实性和可信性验证. 1.CA下发给网站的证书是 ...
- JQuery 多选按钮checkbox
JQuery 多选按钮checkbox 在需要全选和选择部分的时候我们就需要多选在这里主要介绍了具体的实现 JQuery $(function () { //全选或全不选 $("#allbo ...
- HDU 5776 sum
猜了一下,发现对了.n>m是一定有解的.所以最多m*m暴力,一定能找到.而T较小,所以能过. #pragma comment(linker, "/STACK:1024000000,10 ...
- linux脚本Shell之九九乘法表
说到9*9乘法表,许多朋友在想这是小学二年级就会的东西,不错,确实是这样,那么在linux下,使用shell打印出99乘法表应该如何编写脚本的? 笔者的文档今天就写下来,有需要的朋友可以参考下 代码: ...