1、监听器的使用时机
当某个事件发生时候,监听器里的方法会被调用。例如Tomcat容器启动时、销毁时,session创建时、销毁时。也就是说发生某个事件时,监听器会起作用。
2、常用的监听器
开发中比较常用的监听器有ServletContextListener上下文监听和HttpSessionListener会话监听。
2.1、ServletContextListener
这个监听器是监听ServletContext对象的生命周期,也就是监听Web应用的生命周期,当Web应用启动和终止时,都会触发这个监听器,执行监听器里面的方法。
javax.servlet.ServletContextListener接口源码:
这个接口继承自EventListener接口。
只有上下文初始化和上下文销毁这两个方法,接受的参数为ServletContextEvent类型。
使用上下文监听时,只需要实现ServletContextListener接口,覆写里面的两个方法就行了,如下:
/*
* 这个监听器监听上下文的路径
*/
public class StartupListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听器初始化!");
// 获取上下文对象
ServletContext servletContext = sce.getServletContext();
// 获取应用的路径
String path = servletContext.getContextPath();
// 存到上下文作用域中
servletContext.setAttribute("APP_PATH", path);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听器摧毁!");
}
}
然后在web.xml中配置该监听器:
启动应用:
实际上,web应用启动时会执行contextInitialized方法,应用关闭时,会执行contextDestroyed方法。
2.2、HttpSessionListener
这个监听器是监听Session对象的,每当有Session对象创建或销毁时,都会触发这个监听器,执行里面的方法,这个监听器常用来统计web应用的在线人数。
javax.servlet.http.HttpSessionListener接口的源码:
接口中两个方法,Session对象的创建和销毁,使用这个监听器,只需要实现HttpSessionListener接口,覆写接口的方法就行了。如下:
/*
* session对象的监听器
* 用于统计在线人数
*/
public class HttpSessionListenerImpl implements HttpSessionListener{
// 创建session时
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建新的Session对象!");
// 用户进入时,获取session对象
HttpSession session = se.getSession();
// 获取上下文对象
ServletContext context = session.getServletContext();
Object obj = context.getAttribute("onlineNumber");
// 为空则是第一个用户
if(obj==null){
context.setAttribute("onlineNumber", new Integer(1));
} else { // 不为空,往上累加
context.setAttribute("onlineNumber", new Integer(obj.toString()) + 1);
}
}
// 销毁session对象时
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁Session对象!");
// 用户退出时
HttpSession session = se.getSession();
ServletContext context = session.getServletContext();
Object obj = context.getAttribute("onlineNumber");
// 用户退出,人数减1
context.setAttribute("onlineNumber", new Integer(obj.toString()) - 1);
}
}
然后在web.xml里配置该监听器:
比如用户登录时:
用户退出时:
当应用中有新的session对象创建时,会执行sessionCreated方法,当有session对象销毁时,会执行sessionDestroyed方法。