一:Listener的定义与作用

监听器Listener就是在application,session,request三个对象创建,销毁,或者往其中添加修改删除属性时自动执行代码的功能组件。Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

二:Listener的分类与使用

1.ServletContext监听

ServletContextListener接口:用于对Servlett整个上下文进行监听(创建,销毁)。
public void contextInitialized(ServletContextEvent sce) //上下文初始化
public void contextDestoryed(ServletContextEvent sce) //上下文销毁
public ServletContext getServletContext(); //ServletContextEvent事件:取得一个ServletContext(application)对象

ServletContextAttributeListener接口:对Servlet上下文属性的监听(增删改属性)。
public void attributeAdded(ServletContextAttributeEvent scab);//增加属性
public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除
public void attributeRepalced(ServletContextAttributeEvent scab);属性替换
//ServletContextAttributeEvent事件:能取得设置属性的名称与内容
public string getName();//取得属性名
public Object getValue();//取得属性值

2.Session监听

Session属于Http协议下的内容,接口位于javax.servlet.http.*包下。
HttpSessionListener接口:对session的整体状态的监听。
public void sessionCreated(HttpSessionEvent se); //session创建
public void sessionDestoryed(HttpSessionEvent se); //session销毁
//HttpSessionEvent事件:
public HttpSession getSession(); //取得当前操作的session
HttpSessionAttributeListener接口:对session的属性监听。
public void attributeAdded(HttpSessionBindingEvent se); //增加属性
public void attributeRemoved(HttpSessionBindingEvent se);//删除属性
public void attributeReplaced(HttpSessionBindingEvent se);//替换属性
//HttpSessionBindingEvent事件
public String getName();//取得属性的名称
public String getValue();//取得属性的值
public HttpSession getSession();取得当前的session
session销毁有两种情况:
1.session超时,web.xml配置:
Listener监听器 - 图1
2.手工使session失效
public void invalidate();//使session失效方法。session.invalidate();

3.Request监听

ServletRequestListener:用于对Request请求进行监听(创建,销毁)
public void requestInitialized(ServletRequestEvent sre);//request初始化
public void requesyDestoryed(ServletRequestEvent sre);//request销毁
//ServletRequestEvent事件:
public ServletRequest getServletRequest();//取得一个ServletRequest对象
public ServletRequest getServletContext();//取得一个ServletContext对象
ServletRequestAttributeListener:对Request属性的监听(增删改属性)。
public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除
public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换
//ServletRequestAttributeEvent事件:
public String getName();//取得属性名称
public Object getValue();//取得属性的值

4.在web.xml中配置

Listener的配置信息必须在Filter和Servlet的配置之前,Listener的初始化(ServletContextListener初始化)比Servlet和Filetr都优先,而销毁比Servlet和Filter都慢。
Listener监听器 - 图2

5.Spring监听器ContextLoaderListener的作用

在开始使用Spring读取配置文件ApplicationContext.xml的时候,没有配置监听器,在web.xml中配置如下:

contextConfigLocation
classpath:applicationContext.xml

但是在Tomcat启动的时候日志中显示如下:
信息:NO Spring WebApplicationInitializer types detected on classpath
也就是Spring没有配置文件,导致后面的访问发生错误。
后来查找之下是发现没有在web.xml中使用ContextLoaderListener监听器。设置监听器:

org.springframework.web.context.ContextLoaderListener

Spring提供ServletContextListener接口的一个实现类ContextLoaderListener监听器,该类可以作为Listener使用,在启动Tomcat容器的时候,该类的作用就是自动装载ApplicationContext的配置信息,如果没有设置contextConfigLocation的初始参数则会使用默认参数WEB-INF路径下的application.xml文件。如果需要自定义读取多个配置文件或者修改默认路径,则可以在web.xml中设置:
Listener监听器 - 图3
ContextLoaderListener会读取这些XML文件并产生WebApplicationContext对象,然后将这个对象放置在ServletContext的属性里,这样只要我们得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。