Listener监听器

一、监听器的概念

Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

监听对象:

1、ServletContext:application,整个应用只存在一个

2、HttpSession:session,针对每一个对话

3、ServletRequest:request,针对每一个客户请求

监听内容:创建、销毁、属性改变事件

监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。

 

二、监听器的基本使用

创建步骤:

1、创建一个实现监听器接口的类

    

2、配置web.xml文件,注册监听器

<listener>
    <listener-class>完整类名</listener-class>
</listener>

监听器的启动顺序:按照web.xml的配置顺序来启动

加载顺序:监听器>过滤器>Servlet

说明:web.xml的加载顺序是:【Context-Param】->【Listener】->【Filter】->【Servlet】,而同个类型之间的实际程序调用的时候的顺序是根据对应的Mapping的顺序进行调用。

三、常用监听器

1、ServletContextListener 与 ServletContextAttributeListener

public class ServletContextListenerImpl implements ServletContextListener{

	/**
	 * 在web应用服务器关闭时触发
	 */
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		System.out.println("服务器关闭时触发contextDestroyed");
	}

	/**
	 * 在web应用服务器启动时触发
	 */
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		System.out.println("服务器启动时触发contextInitialized");
		ServletContext sc = sce.getServletContext();
		System.out.println("===" + sc.getServletContextName());
	}

}


public class ServletContextAttributeListenerImpl implements ServletContextAttributeListener{

	/**
	 * 在ServletContext作用域范围内,添加属性时会触发
	 */
	@Override
	public void attributeAdded(ServletContextAttributeEvent event) {
		event.getServletContext();
		String name = event.getName();
		Object value = event.getValue();
		System.out.println("添加属性的key-value:" + name + "-" + value);
	}

	/**
	 * 在ServletContext作用域范围内,移除属性时会触发
	 */
	@Override
	public void attributeRemoved(ServletContextAttributeEvent event) {
		event.getServletContext();
		String name = event.getName();
		Object value = event.getValue();
		System.out.println("删除属性的key-value:" + name + "-" + value);
	}

	/**
	 * 在ServletContext作用域范围内,属性值被替换时会触发
	 */
	@Override
	public void attributeReplaced(ServletContextAttributeEvent event) {
		//System.out.println("替换属性前的key-value:" + name + "-" + value);
		event.getServletContext();
		String name = event.getName();
		Object value = event.getValue();
		System.out.println("替换属性后的key-value:" + name + "-" + value);
		
	}

}

 

<body>
	<h1>首页</h1>
	<%
		application.setAttribute("username", "admin");
	%>
</body>

     

 

2、ServletRequestListener 与 ServletRequestAttributeListener

public class ServletRequestListenerImpl implements ServletRequestListener,ServletRequestAttributeListener{

	/**
	 * 在Request作用域范围内,添加属性时会触发
	 */
	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		srae.getServletRequest();
		String name = srae.getName();
		Object value = srae.getValue();
		System.out.println("添加属性的key-value:" + name + "-" + value);
	}

	/**
	 * 在Request作用域范围内,移除属性时会触发
	 */
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		System.out.println("移除属性的key-value:" + srae.getName() + "-" + srae.getValue());
	}

	/**
	 * 在Request作用域范围内,属性值被替换时会触发
	 */
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		System.out.println("替换属性后的key-value:" + srae.getName() + "-" + srae.getValue());
		
	}

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("新的请求结束时触发");
	}

	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("新的请求到来时触发");
	}
}

3、HttpSessionListener 与 HttpSessionAttributeListener

public class SessionListener implements HttpSessionListener,HttpSessionAttributeListener{
	//创建session对象,调用
	//当有用户来访问网站页面时,创建session来管理与用户的会话操作
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		HttpSession session = arg0.getSession();
		String sessionId = session.getId();
		System.out.println("sessionCreated----"+arg0.getSession());
	}

	//销毁session对象时,调用
	//(1)session过期(默认是30分钟可配置文件设置)(2)手动销毁,调用session.invalidate()
	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("sessionDestroyed-----"+arg0.getSession());
	}

	@Override
	public void attributeAdded(HttpSessionBindingEvent arg0) {
		System.out.println("add attribute,name is "+arg0.getName()+",value is "+arg0.getValue());
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		System.out.println("remove attribute,name is "+arg0.getName()+",value is "+arg0.getValue());
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		System.out.println("update attribute,name is "+arg0.getName());
		System.out.println("before update value is "+arg0.getValue());//修改之前的
		System.out.println("after update value is "+arg0.getSession().getAttribute(arg0.getName()));
	}

}

 web.xml 注册监听器

  <listener>
  	<listener-class>cn.jq.myservlet.listener.ServletContextListenerImpl</listener-class>
  </listener> 
  <listener>
  	<listener-class>cn.jq.myservlet.listener.ServletContextAttributeListenerImpl</listener-class>
  </listener> 
  <listener>
  	<listener-class>cn.jq.myservlet.listener.ServletRequestListenerImpl</listener-class>
  </listener> 
  <listener>
  	<listener-class>cn.jq.myservlet.listener.HttpSessionListenerImpl</listener-class>
  </listener> 
  <listener>
  	<listener-class>cn.jq.myservlet.listener.VisitListener</listener-class>
  </listener> 

 

四、小demo:访问量

public class VisitListener implements HttpSessionListener,ServletContextListener {

	//当有用户来访问时,创建一个session对象来管理与该用户的交互操作(两个监听结合使用)
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		ServletContext application = arg0.getSession().getServletContext();//获取全局作用域
		synchronized (application) {
			int visit = (Integer) application.getAttribute("visit");
			visit++;
			application.setAttribute("visit", visit);
		}
	}

	//创建application对象时,调用
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("服务器关闭时触发contextDestroyed");
		
		final ServletContext application = arg0.getServletContext();
		application.setAttribute("visit", 0);
		
		//每隔24小时统计网站的访问量
		Calendar date = Calendar.getInstance();
		//date.add(Calendar.DATE, 1);
		date.add(Calendar.MINUTE, 1);
		//定时器java.util.Timer
		new Timer().schedule(new TimerTask() {//匿名内部类 局部内部类
			
			@Override
			public void run() {
				int visit = (Integer) application.getAttribute("visit");
				System.out.println("当天总的访问量:"+visit);
				application.setAttribute("visit", 0);//开始统计下一天的访问量
			}
			
		}, date.getTime(), 24*60*60*1000);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}
}
<body>
	<h1>首页</h1>
	    当前网站的访问量有:${applicationScope.visit }
</body>

不同浏览器访问:

 

参考文章:https://blog.youkuaiyun.com/csdn_huzeliang/article/details/79029496

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值