JSP&Servlet 學習筆記(六)

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()則可以取得屬性設置或移除時的對象。


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