Servlet API提供了基本的應用程式事件監聽器介面。編程者可以通過實現這些介面來使用管理事件的功能。Servlet2.4以後提供了對以下對象的事件監聽:ServletContext,HttpSession,ServletRequest。監聽ServletContext可以使Web程式得知整個應用程式載入和卸載等運行情況。監聽HttpSession可以Web程式瞭解應用程式會期間的狀況並作出響應。監聽ServletRequest可以使Web程式控制Web請求的生命週期。
下面結合JavaServetAPI官方文檔對各個事件監聽器接中進行說明。
一、ServletContextListener
所在包:javax.servlet
介面聲明:public interface ServletContextListener extends java.util.EventListener
方法:
1.void contextDestroyed(ServletContextEvent sce)
當應用被卸載後觸發執行該方法中的代碼。
2.void contextInitialized(ServletContextEvent sce)
當應用在初始化時觸發執行該方法中的代碼。
這裡需要對ServletContentEvent說明一下,它是一個ServletContext對象的事件,其類的聲明如下:
public class ServletContentEvent extends java.util.EventObject
包含方法:ServletContext getServletContext(),返回事件的Servlet上下文,即產生事件的當前應用程式。
二、ServletContextAttributeListener
所在包:javax.servlet
介面聲明:public interface ServletContextAttributeListener
extends java.util.EventListener
方法:
1. void attributeAdded(ServletContextAttributeEvent scab)
當一個新的屬性加入到Servlet的上下文中後觸發該方法中的代碼。
2.void attributeRemoved(ServletContextAttributeEvent scab)
當一個屬性被從servlet的上下文中移走後觸發該方法中的代碼。
3.void attributeReplaced(ServletContextAttributeEvent scab)
當servlet上下文中的一個屬性的值被替換後觸發該方法中的代碼。
ServletContextAttributeEvent是servlet上下文裡的屬性的事件,其類聲明如下:
public class ServletContextAttributeEvent
extends ServletContextEvent
包含方法:String GetName(),返回產生事件的屬性名稱;Object GetValue(),返回產生事件的屬性的值。
三、HttpSessionListener
所在包:javax.servlet
介面聲明:public interface HttpSessionListener
extends java.util.EventListener
方法:
1.void sessionCreated(HttpSessionEvent se)
當一個會話被建立後觸發執行該方法中的代碼。
2.void sessionDestroyed(HttpSessionEvent se)
當一個會話被釋放後觸發執行該方法中的代碼。
HttpSessionEvent是會話事件類別,其聲明如下:
public class HttpSessionEvent
extends java.util.EventObject
包含方法:HttpSession getSession(),返回產生事件的session對象。
四、HttpSessionActivationListener
所在包:javax.servlet
介面聲明:public interface HttpSessionActivationListener
extends java.util.EventListener
方法:
1.void SessionDidActivate(HttpSessionEvent se)
2.void SessionWillPassivate(HttpSessionEvent se)
Activate與Passivate是用於置換對象的動作,當session對象為了資源利用或Server Load Balancer等原因而必須暫時儲存至硬碟或其它儲存器時(透過對象序列化),所作的動作稱之為Passivate,而硬碟或儲存器上的session對象重新載入JVM時所採的動作稱之為Activate。
五、HttpSessionAttributeListener
所在包:javax.servlet
介面聲明:public interface HttpSessionAttributeListener
extends java.util.EventListener
方法:
1.void attributeAdded(HttpSessionBindingEvent se)
2.void attributeReplaced(HttpSessionBindingEvent se)
3.void attributeRemoved(HttpSessionBindingEvent se)
以上三個方法分別在會話屬性被加入、會話屬性值被修改和會話屬性被移除時觸發執行。
HttpSessionBindingEvent是一個會話事件對象類,其聲明如下:
public interface HttpSessionBindingListener
extends java.util.EventListener
包含方法:String getName(),返回產生當前事件的會話的屬性名稱。Object getValue(),返回產生當前事件的會話的屬性值。HttpSession getSession(),返回產生當前事件的會話對象。
六、HttpSessionBindingListener
所在包:javax.servlet
介面聲明:public interface HttpSessionBindingListener
extends java.util.EventListener
方法:
1.void valueBound(HttpSessionBindingEvent event)
當實現HttpSessionBindingListener介面的對象被綁定到Session Attribute中,該對象的此方法被執行。
2.void valueUnbound(HttpSessionBindingEvent event)
當實現HttpSessionBindingListener介面的對象被從Session Attribute解除綁定,該對象的此方法被執行。
請注意HttpSessionAttributeListener與HttpSessionBindingListener的區別:
1.前者是需要在web.xml中進行描述的,後者不需要。
2.前者是在任何session的屬生變化時都會觸發執行其方法中的代碼,而後者只是在實現它的對象被綁定到會話屬性或被從會話屬生中解除綁定時,才會觸發執行那個對象的valueBound和valueUnboundy這兩個方法的代碼。比如說有兩個對象A和B都實現了HttpSessionBindingListener介面,當A被綁定到會話屬性中時,只是A的valueBound()方法被觸發執行。
七、ServletRequestListener
所在包:javax.servlet
介面聲明:public interface ServletRequestListener
extends java.util.EventListener
方法:
1.void RequestDestroyed(ServletRequestEvent evt)
2.void RequestInitialized(ServletRequestEvent evt)
以上兩個方法分別在ServetRequest對象初始化和清除時觸發執行。
ServletRequestEvent表示ServletReuest事件類別,其聲明如下:
public class ServletRequestEvent
extends java.util.EventObject
包含方法:ServletContext getServletContext(),獲得當前Web應用程式的內容物件。ServletRequest getServletRequest(),獲得當前事件的主體,ServletRequest對象。
八、ServletRequestAttributeListener
所在包:javax.servlet
介面聲明:public interface ServletRequestAttributeListener
extends java.util.EventListener
方法:
1.void attributeAdded(ServletRequestAttributeEvent e)
當向ServlvetRequest對象屬性中添加屬性後觸發執行該方法。
2.void attributeRemoved(ServletRequestAttributeEvent e)
當向ServlvetRequest對象屬性中移除屬性後觸發執行該方法。
3.void attributeReplaced(ServletRequestAttributeEvent e)
當修改ServlvetRequest對象屬性的屬生值後觸發執行該方法。
ServletRequestAttributeEvent是ServletRequest屬性事件類別,其聲明如下:
public class ServletRequestAttributeEvent
extends ServletRequestEvent
包含方法:String getName(),獲得觸發事件的屬性的名稱。Object getValue(),獲得觸發事件的屬生的值。
下面說明如何在web.xml中布署事件監聽器以實現對事件的處理,格式如下:
<listener>
<listener-class>
fey.servlet.listener.CustomServletContextListener
</listener-class >
</listener>
其中fey.servlet.listener.CustomServletContextListener是實現上述各事件監聽器介面的類名。當然,你需要將這些類放入Web容器的Web應用的classes或lib目錄下以讓Web容器可以找到。
另外說明一點,一個類可以一個或多個監聽器介面。