欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java监听器的使用

程序员文章站 2022-07-08 13:22:28
...

对象监听器

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配置文件

java监听器的使用

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());		
	}
}