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());
}
}
上一篇: 监听器ServletRequestListener的使用
下一篇: Activiti监听器的使用