18,ServletContext事件,監聽器
ServletContext相關監聽器,ServletContextListener與ServletContextAttributeListener
(1)ServletContextListener
ServletContextListener是"生命週期監聽器",如果想要知道何時Web應用程序已經初始化或即將結束銷燬,可以實現ServletContextListener:
package javax.servlet;
import java.util.EventListener;
public interface ServletContextListener extends EventListener{
public void contextInitialized(ServletContextEvent sce);
public void contextDestoryed(ServletContextEvent sce);
}
在Web應用程序初始化後或即將結束銷燬前,會調用ServletContextListener實現類對應的contextInitialized或contextDestoryed。可以在contextInitialized()中實現應用
程序資源的準備動作,在contextDestroyed()實現釋放應用程序資源的動作。
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener //使用WebListener標註
public class ContextParameterReader implements ServletContextListener{//實現ServletContextListener
public void contextInitialized(ServletContextEvent sce){
ServletContext context=sce.getServletContext();//取得ServletContext
String avatars=context.getInitParameter("AVATAR");//取得初始參數
context.setAttribute("avatars", avatars);//設置ServletContext屬性
}
public void contextDestroyed(ServletContextEvent sce){
}
}
ServletContextListener可以直接使用@WebListener標註,而且必須實現ServletContextListener接口,這樣容器會在啓動時加載並運行對應的方法。當
Web容器調用contextInitialized()或contextDestoryed()時,會傳入ServletContext-Event,其封裝了ServletContext,可以通過ServletContextEvent的getServletContext()方法取得
ServletContext,通過ServletContext的getInitParameter()方法來讀取初始參數,因此Web應用程序初始參數常被成爲ServletContext初始參數。
在整個Web應用程序生命週期,Servlet需共享的資料可以設置爲ServletContext屬性。由於ServletContext在Web應用程序存活期間會一直存在,所以設置爲ServletContext屬性
的數據,除非主動移除,否則也是一直存活於Web應用程序中。
可以通過ServletContext的setAttribute()方法設置對象爲ServletCOntext屬性,之後可通過ServletContext的getAttribute()方法取出該屬性。若要移除屬性,則通過ServletContext的removeAttribute()方法。
因爲@WebListener沒有設置初始參數的屬性,所以僅適用於無須設置初始參數的情況。如果需要設置初始參數,可以在web.xml中設置:
<context-param>
<param-name>AVATAR</param-name>
<param-value>/avatar</param-value>
</context-param>
(2)ServletContextAttributeListener
ServletContextAttributeLIstener是"監聽屬性改變的監聽器".
import java.util.EventListener;
public interface ServletContextAttributeListener extends EventListener{
public void attributeAdded(ServletContextAttributeEvent scab);
public void attributeRemoved(ServletContextAttributeEvent scab);
public void attributeReplaced(ServletContextAttributeEvent scab);
}
當在ServletContext中添加屬性,移除屬性或替換屬性時,相對應的attributeAdded(),attributeRemoved()與attributeReplaced()方法就會被調用。
19,HttpSession事件,監聽器
與HttpSession相關的監聽器有四個:HttpSessionListener,HttpSessionListener,HttpSessionBindingListener與HttpSessionActivationListener。
(1)HttpSessionListener
其爲生命週期監聽器,如果想要在HttpSession對象創建或結束時,做些相對應動作,可以實現HttpSessionListener。
import java.util.EventListener;
public interface HttpSessionListener extends EventListener{
public void sessionCreated(HttpSessionEvent se);
public void sessionDestroyed(HttpSessionEvent se);
}
在HttpSession對象初始化或結束前,會分別調用sessionCreated()與sessionDestroyed()方法,可以通過傳入的HttpSessionEvent,使用getSession()取得HttpSession,
以針對會話對象作出相對應的創建或結束處理操作。
(2)HttpSessionAttributeListener
HttpSessionAttributeListener是屬性改變監聽器,當在會話對象中加入屬性,移除屬性或替換屬性時,相對應的attributeAdded(),attributeRomved()與attributeReplaced()
方法就會被調用,並分別傳入HttpSessionBIndingEvent。
import java.util.EventListener;
public interface HttpSessionAttributeListener extends EventListener{
public void attributeAdded(HttpSessionBIndingEvent se);
public void attributeRemoved(HttpSessionBIndingEvent se);
public void attributeReplaced(HttpSessionBIndingEvent se);
}
HttpSessionBIndingEvent有個getName()方法,可以取得屬性設置或移除時指定的名稱,而getValue()可以取得屬性設置或移除時的對象。
(3)HttpSessionBIndingListener
HttpSessionBindingListener是對象綁定監聽器,如果有個即將加入HttpSession的屬性對象,希望在設置給HttpSession成爲屬性或從HttpSession成爲屬性或從
HttpSession中移除時,可以收到HttpSession的通知,則可以讓該對象實現HttpSessionBIndingListener接口。
import java.util.EventListener;
public interface HttpSessionBIndingListener extends EventListener{
public void valueBound(HtpSessionBIndingEvent event);
public void valueUnbound(HttpSessionBIndingEvent event);
}
這個接口是實現加入HttpSession的屬性對象,不需註釋或在web.xml中設置。當實現此接口的屬性對象被加入HttpSession或從中移除時,就會調用對應的valueBound()與valueUnbound()方法,並傳入HttpSessionBIndingEvent對象,可以通過該對象的getSession取得Httpsession對象。
(4)HttpSessionActivationListener
HttpSessionActivationLIstener是對象遷移監聽器,其定義兩個方法sessionWillPassivate()與sessionDidActivate().一般情況下幾乎不會使用到HttpSessionActivationLIstener
。在使用分佈式環境時,應用程序的對象可能分散在多個JVM中。當HttpSession要從一個JVM遷移至另一個JVM時,必須先在原本的JVM序列化所有的屬性對象,
在這之前若屬性對象有實現HttpSessionActivationListener,就會調用sessionWillPassivate()方法,而HttpSession遷移至另一個JVM後,就會對所有屬性對象作反序列化,
此時會調用sessionDidctivate()方法。
20,HttpServletRequest事件,監聽器
與請求相關的監聽器有三個:ServletRequestListener,ServletRequestAttributeListener與AsyncListener。
(1)ServletRequestListener
ServletRequestListener是生命週期監聽器,如果想要在HttpServletRequest對象生成或結束時做些相對應的操作,則可以實現ServletREquestListener。
import java.util.EventListener;
public interface ServletRequestListener extends EventListener{
public void requestDestroyed(ServletRequestEvent sre);
public void requestInitialized(ServletRequestEvent sre);
}
在ServletRequest對象初始化或結束前,會調用requestINitialized()與requestDestroyed()方法,可以通過傳入的ServletRequestEvent來取得ServletReuqest,以針對請求對象
做出相對應的初始化或結束處理動作。
(2)ServletRequestAttributeListener
ServletRequestAttributeListener是屬性改變監聽器,在請求對象中加入屬性,移除屬性或替換屬性時,相對應的attributeAdded(),attributeRemoved()與attributeReplaced()方法
就會被調用,並分別傳入ServletRequestAttributeEvent。
ServletRequestAttributeListener有個getName()方法,可以取得屬性設置或移除時指定的名稱,而getValue()則可以取得屬性設置或移除時的對象。