Listener 深入探究

监听器概述

监听你的web应用,监听许多信息的初始化,销毁,增加,修改,删除值等监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。     

  1.Listener是Servlet的监听器 

2.可以监听客户端的请求、服务端的操作等。

3.通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。

4.编写监听器需要实现相应的接口

5.编写完成后在web.xml文件中配置一下,就可以起作用了

6.可以在不修改现有系统基础上,增加web应用程序生命周期事件的跟踪




 监听器类型

按监听的对象划分:servlet2.4规范定义的事件有三种:

1.用于监听应用程序环境对象(ServletContext)的事件监听器    

 1.1 ServletContextListener             用于监听application启动和销毁的事件    

 1.2 ServletContextAttributeListener          用于于监听application属性改变的事件包括:增加属性、删除属性、修改属性

2.用于监听用户会话对象(HttpSession)的事件监听器   

  2.1 HttpSessionListener           用于监听session启动和销毁的事件   

  2.2 HttpSessionAttributeListener          用于于监听session属性改变的事件包括:增加属性、删除属性、修改属性

3.用于监听请求消息对象(ServletRequest)的事件监听器  

   3.1 ServletRequestListener           用于监听request启动和销毁的事件    

 3.2 ServletRequestAttributeListener          用于于监听request属性改变的事件包括:增加属性、删除属性、修改属性


监听器的启动顺序


Tomcat启动
1.监听器构造函数 
2.属性监听器Application 增加 *3 连续执行三次
3.监听器application初始化
4.过滤器构造函数
5.过滤器初始化

Chrome1 第一次请求
1.监听器Request 初始化
2.过滤器doFilter
3.属性监听器Application 增加
4.监听器session 初始化
5.监听器Request 销毁

Chrome1 第二次请求
1.监听器Request 初始化
2.过滤器doFilter
3.监听器Request 销毁


Chrome2 再打开一个相同的浏览器,请求
1.监听器Request 初始化
2.过滤器doFilter
3.监听器Request 销毁


FireFox1 再打开一个不同的浏览器(fireFox),请求
1.监听器Request 初始化
2.过滤器doFilter
3.监听器session 初始化
4.监听器Request 销毁

firefox1 再请求
1.监听器Request 初始化
2.过滤器doFilter

3.监听器Request 销毁


经验总结:    

  jsp内置的Application = servlet内置的servletContext   

  jsp内置的request = servlet内置的servletRequest  

  jsp内置的session = servlet内置的httpsession    


关于session,在本地电脑运行同一款浏览器,共享的是同一个session,不同浏览器就会代表不同session,除非服务器端,想控制一个IP对应一个session    问题来了,tomcat启动的时候,application没有初始化,application属性监听器就连续执行3次,这是为什么呢?

 

Lintener监听器实现大全,可以在自己电脑上运行测试以下代码,开着几个不同浏览器测试下application,session,request

package com.dxy.listener;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


public class ListenerTest implements 
			ServletContextListener,ServletContextAttributeListener,
			ServletRequestListener,ServletRequestAttributeListener,
			HttpSessionListener,HttpSessionAttributeListener{

	//servlet内置对象
	private ServletContext application;
	private ServletRequest request;
	private HttpSession session;
	
	
	//存放session对象
	private Map<String,String> sessionMap = new HashMap<String, String>();
	
	public ListenerTest(){
		System.out.println("监听器Listener 构造函数初始化");
	}
	

	
	/**
	 * 
	 * Application
	 * 
	 */
	 //ServletContextListener   (监听应用程序application)
	 // 用于监听WEB 应用启动和销毁的事件,监听器类需要实现
	//ServletContextEvent含有getServletContext()方法取得application对象;
	@Override
	public void contextDestroyed(ServletContextEvent servletContextEvent) {    //在web容器初始化是就调用
		System.out.println("监听器Application 销毁");
	}
	@Override
	public void contextInitialized(ServletContextEvent servletContextEvent) {    //当web容器销毁时调用
		System.out.println("监听器Application 初始化");
		application = servletContextEvent.getServletContext();
		application.setAttribute("sessionMap", sessionMap);
		
	}
	 //* ServletContextAttributeListener   (监听应用程序application)
	 //* 用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性
	@Override
	public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {   //当调用application.setAttribute()时调用
		System.out.println("属性监听器Application 增加");
	}
	@Override
	public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {  //当调用applcaition.removeAttribute()时调用
		System.out.println("属性监听器Application 删除");
	}
	@Override
	public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {  //当调用两次application.setAttribute()赋予相同属性时调用
		System.out.println("属性监听器Application 修改");
	}
	
	
	
	
	
	
	/**
	 * 
	 * Request
	 * 
	 */
	 // ServletRequestListener  (监听请求消息request)
	//(1)getServletContext();
	//(2)getServletRequest();
	@Override
	public void requestDestroyed(ServletRequestEvent servletRequestEvent) {   //当请求结束时会调用
		System.out.println("监听器Request 销毁");
	}
	@Override
	public void requestInitialized(ServletRequestEvent servletRequestEvent) {  //当请求一个网页时会调用
		System.out.println("监听器Request 初始化");
		request = servletRequestEvent.getServletRequest();
	}
	 // ServletRequestAttributeListener   (监听请求消息request)
	@Override
	public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {   //当调用request.setAttribute()时调用
		System.out.println("属性监听器Request增加");
		
	}
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {   //当调用request.removeAttribute()时调用
		System.out.println("属性监听器Request删除");
		
	}
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {   //当调用两次request.setAttribute()赋予相同属性时调用
		System.out.println("属性监听器Request修改");
		
	}
	
	
	
	
	
	/**
	 * 
	 * Session
	 * session listener是针对所有session对象实例的,全局session列表中会有很多session
	 */
	 //* HttpSessionListener  (监听用户会话session)
	 //* 用于监听Session对象的创建和销毁,监听器类需要实现
	@Override
	public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {    //当调用session.invalidate();或超时 时调用
		System.out.println("监听器session 销毁");
		sessionMap.remove(session.getId());
	}
	@Override
	public void sessionCreated(HttpSessionEvent httpSessionEvent) {  //当调用关于session对象的方法时,比如session.getId()
		System.out.println("监听器session 初始化");
		session = httpSessionEvent.getSession();
		session.setMaxInactiveInterval(5);  //设置session存活时间
		
		//每一个新的session进来,放到map里面,然后存到application里面
		sessionMap.put(session.getId(),"</br>sessionId:"+session.getId()+
				"</br>lastTime:"+session.getLastAccessedTime()+"</br>createTime:"+session.getCreationTime());
		
	}
	 //* HttpSessionAttributeListener    (监听用户会话session)
	//* 用于监听Session对象属性的改变事件,监听器类需要实现
	@Override
	public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {    //当调用session.setAttribute()时调用
		System.out.println("属性监听器Session 增加");
		
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {    //当调用session.removeAttribute()时调用
		System.out.println("属性监听器Session 删除");
		
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {    //当调用两次session.setAttribute()赋予相同属性时
		System.out.println("属性监听器Session 修改");
		
	}







}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值