概念:
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方法,產生空指針異常;