天天看點

javax.servlet.ServletContextListener 的應用

javax.servlet.ServletContextListener 的應用

JSP/Servlet 中的事件處理寫過AWT或Swing程式的人一定對桌面程式的事件處理機制印象深刻:通過實作Listener接口的類可以在特定事件(Event)發生時,呼叫特定的方法來對事件進行響應。

其實我們在編寫JSP/Servle程式時,也有類似的事件處理機制,所不同的是在JSP/Servlet中是在web.xml中注冊Listener,由Container在特定事件發生時呼叫特定的實作Listener的類。

1. Servlet中的Listener和Event:

在JSP 2.0/Servlet 2.4中,共有八個Listener接口,六個Event類别。

ServletContextListener接口

[接口方法] contextInitialized()與 contextDestroyed()

[接收事件] ServletContextEvent

[觸發場景] 在Container加載Web應用程式時(例如啟動 Container之後),會呼叫contextInitialized(),而當容器移除Web應用程式時,會呼叫contextDestroyed ()方法。

ServletContextAttributeListener

[接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved()

[接收事件] ServletContextAttributeEvent

[觸發場景] 若有對象加入為application(ServletContext)對象的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分别呼叫attributeReplaced()、attributeRemoved()。

HttpSessionListener

[接口方法] sessionCreated()與sessionDestroyed ()

[接收事件] HttpSessionEvent

[觸發場景] 在session (HttpSession)對象建立或被消滅時,會分别呼叫這兩個方法。

HttpSessionAttributeListener

[接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved()

[接收事件] HttpSessionBindingEvent

[觸發場景] 若有對象加入為session(HttpSession)對象的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分别呼叫attributeReplaced()、 attributeRemoved()。

HttpSessionActivationListener

[接口方法] sessionDidActivate()與 sessionWillPassivate()

[接收事件] HttpSessionEvent

[觸 發場景] Activate與Passivate是用于置換對象的動作,當session對象為了資源利用或負載平衡等原因而必須暫時儲存至硬碟或其它儲存器時(透 過對象序列化),所作的動作稱之為Passivate,而硬碟或儲存器上的session對象重新加載JVM時所采的動作稱之為Activate,是以容 易了解的,sessionDidActivate()與 sessionWillPassivate()分别于Activeate後與将Passivate前呼叫。

ServletRequestListener

[接口方法] requestInitialized()與 requestDestroyed()

[接收事件] RequestEvent

[觸發場景] 在request(HttpServletRequest)對象建立或被消滅時,會分别呼叫這兩個方法。

ServletRequestAttributeListener

[接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved()

[接收事件] HttpSessionBindingEvent

[觸發場景] 若有對象加入為request(HttpServletRequest)對象的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分别呼叫attributeReplaced()、 attributeRemoved()。

HttpSessionBindingListener

[接口方法] valueBound()與valueUnbound()

[接收事件] HttpSessionBindingEvent

[觸 發場景] 實作HttpSessionBindingListener接口的類别,其執行個體如果被加入至session(HttpSession)對象的屬性中,則會 呼叫 valueBound(),如果被從session(HttpSession)對象的屬性中移除,則會呼叫valueUnbound(),實作 HttpSessionBindingListener接口的類别不需在web.xml中設定。

2. 如何注冊Servlet中的事件

實作上面這幾個接口的類别,除了HttpSessionBindingListener外,必須在web.xml中向容器注冊,容器才會在對應的事件發生時呼叫對應的類别,如:

 < listener > 

 < listener-class > demo.servlet.listener.CustomServletContextListener </ listener-class > 

 </ listener >

3.Java類執行個體

==========

//偵聽啟動和關閉

import javax.servlet.ServletContextListener;

import javax.servlet.*;

public class TigerListen implements ServletContextListener {

 public void contextInitialized(ServletContextEvent sce)

 {

  System.out.print("Init") ;

 }

 public void contextDestroyed(ServletContextEvent sce)

 {

  System.out.print("Destroved") ;

 }

}

對應的web.xml是

============

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

 xmlns="http://java.sun.com/xml/ns/j2ee"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <listener>

  <listener-class>TigerListen</listener-class>

 </listener>

</web-app>