本文以二个Listener实例来讲述ServletContext、HttpSession对象生命周期及ServletContext、HttpSession对象中属性变化情况。
实例一:
用于监听ServletContext对象生命周期及ServletContext对象中属性的变化情况的监听器ContextListener,分别实现了ServletContextListener,ServletContextAttributeListener接口。代码如下:
package com.hc.znpb.servlet;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextListener implements ServletContextListener,
ServletContextAttributeListener {
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】应用被关闭!");
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】应用被启动!");
}
public void attributeAdded(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】ServletContext对象中新增一名为" + arg0.getName()
+ "的属性,其属性值为:" + arg0.getValue());
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】ServletContext对象中一名为" + arg0.getName()
+ "的属性被删除!");
}
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】ServletContext对象中一名为" + arg0.getName()
+ "的属性被更新!");
}
}
实例二:
用于监听HttpSession对象生命周期及HttpSession对象中属性的变化情况的监听器SessionListener,分别实现了HttpSessionListener,HttpSessionAttributeListener接口。代码如下:
package com.hc.znpb.servlet;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.hc.znpb.util.SysUtil;
public class SessionListener implements HttpSessionAttributeListener,
HttpSessionListener {
// 在线人数统计
private int userCount = 0;
public void attributeAdded(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】HttpSession对象中新增一名为" + arg0.getName()
+ "的属性,其属性值为" + arg0.getValue());
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】HttpSession对象中一名为" + arg0.getName()
+ "的属性被删除!");
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("【监听到】HttpSession对象中一名为" + arg0.getName()
+ "的属性被修改!");
}
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
// 在线人数加1
arg0.getSession().setAttribute(SysUtil.SESSION_COUNT_USERS,
new Integer(this.userCount++));
System.out.println("【监听到】新用户" + arg0.getSession().getId() + "上线!");
System.out.println("【在线用户数】" + this.userCount + "人");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
// 在线人数减1
arg0.getSession().setAttribute(SysUtil.SESSION_COUNT_USERS,
new Integer(--this.userCount));
System.out.println("【监听到】新用户" + arg0.getSession().getId() + "下线!");
System.out.println("【在线用户数】" + this.userCount + "人");
}
}
最后修改web.xml文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<listener>
<listener-class>
com.hc.znpb.servlet.ContextListener
</listener-class>
</listener>
<listener>
<listener-class>
com.hc.znpb.servlet.SessionListener
</listener-class>
</listener>
</web-app>