java监听器的使用

对象监听器

ServletContextListener、HttpSessionListener、ServletRequestListener分别监听tomcat上下文、httpsession、servletrequest对象的创建与销毁,当这些对象创建时会执行创建方法,销毁时会执行销毁方法。
例如:实现ServletContextListener的类,并在web.xml配置后,会监听servlet上下文对象的创建与销毁,而该对象是随tomcat启动时创建,关闭时销毁。即该对象的生命周期和tomcat一致。常用于读取配置,将配置贯穿于整个项目启动的生命周期中。
实现HttpSessionListener的类,并在web.xml配置后,会监听httpSession对象的创建与销毁,而session是作为用户与服务器之间的会话,当会话创建时,就有一个用户访问,当会话销毁时,则有一个用户结束访问,因此可用于统计在线人数,访问总人数等。
实现ServletRequestListener的类,并在web.xml配置后,会监听servletrequest对象的创建与销毁,该对象是随一次请求开始而创建,一次请求结束而销毁。因此可以监听请求次数等。

一、ServletContextListener监听器

1.web.xml
 <listener>
  	<display-name>TestContextListener</display-name>
  	<listener-class>com.ykq.listener.TestContextListener</listener-class>
  </listener>
2.conf.properties配置文件

在这里插入图片描述

3.SystemParamUtil系统参数类
package com.ykq.util;

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

/**
 * 系统参数工具类.
 * @author YKQ
 *
 */
public class SystemParamUtil {
	/**
	 * 私有化构造方法.
	 */
	private SystemParamUtil(){
	}

	/**
	 * 存储.
	 */
	private static Map<String, String> MAP = new HashMap<String, String>();

	/**
	 * 设置系统参数.
	 * @param key key值
	 * @param value value值
	 */
	public static void setSystemParam(String key, String value){
		MAP.put(key, value);
	}

	/**
	 * 获取系统参数.
	 * @param key key值
	 */
	public static void getSystemParam(String key){
		MAP.get(key);
	}
}
4.ServletContextListener监听器的使用
package com.ykq.listener;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.ykq.util.SystemParamUtil;

/**
 * 上下文监听器.
 * 生命周期和整个tomcat生命周期一样.
 * 所以加载初始化参数,例如读取配置文件中的内容,可以在这个类中使用。
 * @author YKQ
 *
 */
public class TestContextListener implements ServletContextListener{
	/**
	 * tomcat启动执行该方法.
	 */
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("进入ServletContextListener!");
		InputStream iStream = TestContextListener.class
				.getClassLoader().getResourceAsStream("conf.properties");
		Properties pro = new Properties();
		try {
			pro.load(iStream);
			Set<Entry<Object, Object>> entrySet = pro.entrySet();
			Iterator<Entry<Object, Object>> entryIterator = entrySet.iterator();
			Entry<Object, Object> entry;
			String key = null;
			String value = null;
			// 遍历配置文件属性,放置到系统参数类缓存中
			while(entryIterator.hasNext()) {
				entry = entryIterator.next();
				key = (String)entry.getKey();
				value = (String)entry.getValue();
				if(key != null && !"".equals(key.trim())
				&& value != null && !"".equals(value.trim())){
					SystemParamUtil.setSystemParam(key, value);	
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}

	/**
	 * tomcat关闭执行该方法.
	 */
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("销毁ServletContextListener!");
	}
}

二、HttpSessionListener监听器

1.web.xml
  <listener>
  	<display-name>TestSessionListener</display-name>
  	<listener-class>com.ykq.listener.TestSessionListener</listener-class>
  </listener>
2.HttpSessionListener监听器的使用
package com.ykq.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.ykq.util.SystemParamUtil;

/**
 * httpSessionListener
 * 生命周期等同于一个session
 * 根据该特性可以获取在线人数,以及总访问人次。
 * @author YKQ
 */
public class TestSessionListener implements HttpSessionListener{
	// 统计在线人次.
	private static int onlineSum = 0;
	// 统计总访问人次.
	private static int interviewSum = 0;
	/**
	 * 一次会话开始执行该方法.
	 */
	public void sessionCreated(HttpSessionEvent arg0) {
		// 设置最大不与服务器交互时间,就释放session
		arg0.getSession().setMaxInactiveInterval(1);
		System.out.println("监听一个session!");
		this.onlineSum++;
		this.interviewSum++;
		// 将在线人数存放在系统缓存中.
		SystemParamUtil.setSystemParam("onlineSum", String.valueOf(onlineSum));
		// 将总访问人次存放在系统缓存中.
		SystemParamUtil.setSystemParam("interviewSum", String.valueOf(interviewSum));
	}

	/**
	 * 一次会话结束执行该方法.
	 */
	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("销毁一个session!");
		this.onlineSum--;
		SystemParamUtil.setSystemParam("onlineSum", String.valueOf(onlineSum));
	}

}

三、ServletRequestListener监听器

1.web.xml
  <listener>
  	<display-name>TestRequestListener</display-name>
  	<listener-class>com.ykq.listener.TestRequestListener</listener-class>
  </listener>
2.ServletRequestListener监听器的使用
package com.ykq.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
 * request请求监听器.
 * 生命周期等同一次request请求.
 * @author YKQ
 */
public class TestRequestListener implements ServletRequestListener{
	/**
	 * 一次请求开始执行该方法.
	 */
	public void requestInitialized(ServletRequestEvent arg0) {
		System.out.println("监听一次请求!");
	}

	/**
	 * 一次请求结束执行该方法.
	 */
	public void requestDestroyed(ServletRequestEvent arg0) {
		System.out.println("销毁一次请求!");
	}
}

对象属性监听器

ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener分别监听tomcat上下文、httpsession、servletrequest对象中的属性的添加,替换以及删除,当这些对象中的属性的添加,替换以及删除时执行对应的方法。

一、ServletContextAttributeListener监听器

1.web.xml
 <listener>
  	<display-name>ContextAttributeListener</display-name>
  	<listener-class>com.ykq.attribute.listener.ContextAttributeListener</listener-class>
  </listener>
2.jsp中对属性添加替换删除
<%
application.setAttribute("name", "wangwu");
application.setAttribute("name", "zhaoliu");
application.removeAttribute("name");
%>
3.ServletContextAttributeListener监听器的使用
package com.ykq.attribute.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

/**
 * @author YKQ
 * 监听application对象的属性添加,删除,替换.
 */
public class ContextAttributeListener implements ServletContextAttributeListener{
	/**
	 * 属性添加.
	 */
	public void attributeAdded(ServletContextAttributeEvent arg0) {
		System.out.println("application添加属性~"+arg0.getName()+":"+arg0.getValue());				
	}

	/**
	 * 属性移除.
	 */
	public void attributeRemoved(ServletContextAttributeEvent arg0) {
		System.out.println("application移除属性~"+arg0.getName());				
	}

	/**
	 * 属性替换.
	 */
	public void attributeReplaced(ServletContextAttributeEvent arg0) {
		System.out.println("application替换属性~"+arg0.getName()+":"+arg0.getValue());		
	}
}

二、HttpSessionAttributeListener监听器

1.web.xml
  <listener>
  	<display-name>SessionAttributeListener</display-name>
  	<listener-class>com.ykq.attribute.listener.SessionAttributeListener</listener-class>
  </listener>
2.jsp中对属性添加替换删除
<%
session.setAttribute("name", "xuqi");
session.setAttribute("name", "tuba");
session.removeAttribute("name");
%>
3.HttpSessionAttributeListener监听器的使用
package com.ykq.attribute.listener;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
 * @author YKQ
 * 监听session对象的属性添加删除替换.
 */
public class SessionAttributeListener implements HttpSessionAttributeListener{
	/**
	 * 属性添加.
	 */
	public void attributeAdded(HttpSessionBindingEvent arg0) {
		System.out.println("session添加属性~"+arg0.getName()+":"+arg0.getValue());
	}

	/**
	 * 属性移除.
	 */
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		System.out.println("session移除属性~"+arg0.getName());
	}

	/**
	 * 属性替换.注意这里的value值是被替换的值,而不是替换后的值.
	 */
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		System.out.println("session替换属性~"+arg0.getName()+":"+arg0.getValue());
	}
}

三、ServletRequestAttributeListener监听器

1.web.xml
  <listener>
  	<display-name>RequestAttributeListener</display-name>
  	<listener-class>com.ykq.attribute.listener.RequestAttributeListener</listener-class>	
  </listener>
2.jsp中对属性添加替换删除
<%
request.setAttribute("name", "zhangsan");
request.setAttribute("name", "lisi");
request.removeAttribute("name");
%>
3.ServletContextAttributeListener监听器的使用
package com.ykq.attribute.listener;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

/**
 * @author YKQ
 * 监听request对象的属性添加删除替换.
 */
public class RequestAttributeListener implements ServletRequestAttributeListener{
	/**
	 * 属性添加.
	 */
	public void attributeAdded(ServletRequestAttributeEvent arg0) {
		System.out.println("request添加属性~"+arg0.getName()+":"+arg0.getValue());		
	}

	/**
	 * 属性移除.
	 */
	public void attributeRemoved(ServletRequestAttributeEvent arg0) {
		System.out.println("request移除属性~"+arg0.getName());		
	}

	/**
	 * 属性替换
	 */
	public void attributeReplaced(ServletRequestAttributeEvent arg0) {
		System.out.println("request替换属性~"+arg0.getName()+":"+arg0.getValue());		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值