监听器是指专门用于在其他对象身上发生的事件或者状态改变进行监听和相应处理的对象,当被监听的对象发生变化时立即采取相应的行动。
例如我们要实现统计一个网站的在线人数,就可以在Web应用应用程序服务器上设置监听器用来监听session对象——设置一个全局变量,session创建的时候该变量加1,session销毁的时候该变量减1.(这个变量其实就是用户在线人数)。
Web监听器是Servlet规范定义的特殊类,可以监听客户端的请求和服务端的操作。监听的对象有:ServletContext、HttpSession、ServletRequest分别对应JSP9大内置对象中的application、session和request。用于监听ServletContext、HttpSession、ServletRequest等域对象的创建和销毁事件,监听域对象属性发生修改的事件。监听器对象可以在事件发生前、发生后做一些必要的处理。
监听器的主要用途
- 统计在线人数和在线用户;
- 系统启动时加载初始化信息;
- 统计网站访问量;
- 和Spring结合。
监听器的实现
- 创建一个类实现监听器接口(ServletRequestListener、ServletContextListener、HttpSessionListener);
- 在web.xml中注册该监听器(配置非常简单只需要在web.xml中指定监听器所在的类名即可)。见如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <display-name></display-name> 8 <welcome-file-list> 9 <welcome-file>index.jsp</welcome-file> 10 </welcome-file-list> 11 12 <!-- 配置监听器 --> 13 <listener> 14 <listener-class>listener.FirstListener</listener-class> 15 </listener> 16 17 </web-app>
监听器的启动顺序:
在一个web.xml中可以注册多个Servlet监听器,监听器的加载顺序是按照web.xml文件中的顺序加载的。
如果我们在web.xml文件中同时配置了监听器、过滤器和Servlet,那么它们的优先级是:
监听器的分类
按照监听的对象,可以将监听器划分为如下:
按照监听的事件可以划分为以下3种:
一、域对象自身的创建和销毁的监听器
1.ServletContextListener
该监听器中有2个方法(两个方法中都有ServletContextEvent参数。可以通过它获得当前应用的上下文对象ServletContext):
1 public void contextInitialized(ServletContextEvent sce) // ServletContext创建时调用 2 public void contextDestroyed(ServletContextEvent sce) // ServletContext销毁时调用
这个监听器的主要用途是做一些定时器、加载一些全局属性对象、创建全局的数据库连接、加载一些缓存信息。
1 package listener; 2 3 import javax.servlet.ServletContextEvent; 4 import javax.servlet.ServletContextListener; 5 6 public class FirstListener implements ServletContextListener { 7 8 public void contextInitialized(ServletContextEvent servletContextEvent) { 9 10 String initParam = servletContextEvent.getServletContext().getInitParameter("initParam"); 11 // 可以在这里通过Servlet的setAttribute()方法设置全局的属性对象,从其他地方可以获取到这个属性对象 12 servletContextEvent.getServletContext().setAttribute("name", "object"); 13 System.out.println("===========contextInitialized,initParam = " + initParam); 14 15 } 16 17 public void contextDestroyed(ServletContextEvent servletContextEvent) { 18 System.out.println("=================contextDestroyed================"); 19 // 可以在这里关闭数据库连接 20 } 21 22 }