前言:之前寫了一篇關於Filter的文章:http://www.cnblogs.com/vanl/p/5742501.html,現在再來一篇Listener的文章,Filter和Listener在項目中經常用到,巧妙的使用可以達到事半功倍的效果。
一: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配置:

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都慢。

5.Spring監聽器ContextLoaderListener的作用
在開始使用Spring讀取配置文件ApplicationContext.xml的時候,沒有配置監聽器,在web.xml中配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
但是在Tomcat啟動的時候日志中顯示如下:
信息:NO Spring WebApplicationInitializer types detected on classpath
也就是Spring沒有配置文件,導致后面的訪問發生錯誤。
后來查找之下是發現沒有在web.xml中使用ContextLoaderListener監聽器。設置監聽器:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Spring提供ServletContextListener接口的一個實現類ContextLoaderListener監聽器,該類可以作為Listener使用,在啟動Tomcat容器的時候,該類的作用就是自動裝載ApplicationContext的配置信息,如果沒有設置contextConfigLocation的初始參數則會使用默認參數WEB-INF路徑下的application.xml文件。如果需要自定義讀取多個配置文件或者修改默認路徑,則可以在web.xml中設置:

ContextLoaderListener會讀取這些XML文件並產生WebApplicationContext對象,然后將這個對象放置在ServletContext的屬性里,這樣只要我們得到Servlet就可以得到WebApplicationContext對象,並利用這個對象訪問spring容器管理的bean。
