Servlet监听器listener
监听器的定义
用于在监听对象事件的发生前、发生后等情况时进行操作处理。
监听器类型
在Java Web中,监听的事件源为ServletContext、HttpSession、ServletRequest 3大对象。其中ServletContext和HttpSession对象在应用启动时创建,只有一个实例;ServletRequest,每次有请求过来时创建,请求结束后销毁。
按照监听对象分类:
- ServletContextListener 监听应用启动和关闭
- HttpSessionListener 监听会话产生和销毁
- ServletRequestListener 监听每个请求初始化&结束
按照监听事件分类
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
用于监听对象中属性的增加、删除等事件,当调用相应对象的setAttribute()、removeAttribute()方法设置属性时,监听器可进行捕获。
当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由 ServletContextListener 来处理。
代码示例
创建web工程
在src下添加类
package com.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Created by chenxin on 16/5/31.
*/
public class TestListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("此处完成一些初始化工作");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("此处完成一些销毁结束工作");
}
}
在web.xml中注册监听器
<listener>
<listener-class>com.listener.TestListener</listener-class>
</listener>
部署在Tomcat下,启动后再stop,可以看到控制台输出如下:
如图,打印出了在启动和关闭事件时的处理内容。
使用Spring时,在web.xml中注册ContextLoaderListener,作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
listener、filter、servlet的加载顺序
顺序依次为:
ServletContext(ContextParam) -> listener -> filter -> servlet
对于servlet,2节点不存在情况下,servlet被请求时才被初始化.
所以, context-param 配置节点并不是一定要写在 listener 配置节前。
当然,对于某一类节点来说,加载顺序与它们在 web.xml 文件中的先后顺序有关。
以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。
servlet 同 filter 类似,此处不再赘述。
所以,同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。