監聽器(Listener)

概念:

java編寫的web組件;

對session和application內置對象的狀態(創建、銷燬)和屬性(增加、刪除、替換)的變化做監聽;

其他內置對象週期較短,沒必要做監聽;

 

application監聽

語法

包聲明

包導入

import java.util.* ;

import javax.servlet.* ;

import javax.servlet.http.* ;

狀態做監聽:實現ServletContextListener接口,實現contextInitialized方法和contextDestroyed方法,注入事件對象,可以通過事件對象取得application內置對象;

public void contextInitialized(ServletContextEvent sce)

{
        this.application = sce.getServletContext() ; //可以獲取application對象
}

public void contextDestroyed(ServletContextEvent sce)

 

屬性做監聽:實現ServletContextAttributeListener接口,實現三個方法,注入事件;

public void attributeAdded(ServletContextAttributeEvent scab)

        

public void attributeRemoved(ServletContextAttributeEvent scab)

        

public void attributeReplaced(ServletContextAttributeEvent scab)

        

部署:打包編譯

配置:

與用戶的請求沒有關係,不需要配置<listener-mapping>

<listener>
        <listener-class>cn.mldn.lxh.listener.ServletContextDemo</listener-class>
</listener>

監聽器是tomcat啓動後創建最早的對象---->然後是兩個config---->application---->filter---->若配置了<load-on-startup>,就是servlet

filter.java

 

demo.jsp

getServletContext().setAttribute("name","LiXingHua") ;

第一次執行

 

第二次執行

 

在原有的屬性值上替換一個新的屬性值,被監聽器監聽到就獲取被改變的屬性名和屬性值:getName()、getValue(),然後輸出;

全局初始化參數 <context-param> :不屬於任何一個組件,封裝在application裏,任何組件都可以通過application取得全局初始化參數;

局部初始化參數:封裝在Config、filterConfig或者servletConfig裏,只能由配置初始化信息的組件使用;

 

Application真正的作用:

1.tomcat一啓動,就創建監聽器對象,並對application對象的創建做監聽;

2.application創建後立即把全局初始化參數封裝進來;

3.監聽器監聽到application對象被創建就調用contextInitialized方法,並獲取application對象;

4.通過application獲取全局初始化參數,getInitparameter(),通過配置信息就可以創建bean工廠;

5.最後再把bean工廠設到application裏。

 

Session監聽

概念

對session的創建、銷燬、屬性操作做監聽

用戶第一次訪問服務器或是靜態組件,都沒有創建session,監聽器不會監聽

只有用戶第一次訪問服務器的動態組件,session纔會創建,監聽器纔會監聽到,且一個用戶只會創建一個session;

語法

包聲明

包導入

類名與文件名相同

實現接口和方法

實現HttpSessionListener接口:對session的整體狀況監聽

public void sessionDestroyed(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 Object getValue():取得屬性的值

public HttpSession getSession():取得當前的session

問題

session(屬性)被移除

session.removeAttribute("name") ;
<h1>name:${name}</h1>

session裏屬性名爲name的屬性已經被移除,再調用session.getAttribute方法就會得到NULL,但el表達式會把NULL轉換成空串輸出;

session被銷燬

session.invalidate() ;
<h1>name:${name}</h1>

session已經被銷燬,再用el表達式輸出屬性,就會報500錯誤,因爲會調用session.getAttribute方法,產生空指針異常

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章