Listener監聽器


  前言:之前寫了一篇關於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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM