三個域對象的屬性監聽器

Servlet規範定義了監聽ServletContext,HttpSession,HttpServletRequest這三個對象中屬性變動信息事件監聽器。web

這三個監聽器接口分別:apache

public interface HttpSessionAttributeListener extends EventListener
public interface ServletContextAttributeListener extends EventListener
public interface ServletRequestAttributeListener extends EventListener

三個接口中都定義了三個方法來處理被監聽對象中屬性的增長,刪除和替換的事件,同一個事件在這三個接口中對應的方法名稱徹底相同,只是接受的參數類型不一樣。服務器

當向監聽器對象中增長一個屬性時,web容器就調用事件監聽器的attributeAdded方法進行響應,這個方法接受一個事件類型的參數,監聽器能夠經過這個參數來獲取正在增長屬性的域對象和被保存到域對象中的屬性對象。session

當刪除被監聽對象中的一個屬性時,web容器調用事件監聽器的attributeRemoved方法。spa

當監聽器的域對象中的某個屬性被替換時,web容器調用事件監聽器的attributeReplaced方法。code

各個域屬性監聽器中的完整語法定義:xml

public void attributeAdded(ServletRequestAttributeEvent srae);
public void attributeRemoved(ServletRequestAttributeEvent srae);
public void attributeReplaced(ServletRequestAttributeEvent srae);
public void attributeAdded(ServletContextAttributeEvent event);
public void attributeRemoved(ServletContextAttributeEvent event);
public void attributeReplaced(ServletContextAttributeEvent event) ;
public void attributeAdded(HttpSessionBindingEvent event);
public void attributeRemoved(HttpSessionBindingEvent event);
public void attributeReplaced(HttpSessionBindingEvent event);

感知Session綁定的事件監聽器對象

保存在Session域中的對象能夠有多種狀態:blog

  • 綁定到Session中
  • 從Session中解除綁定
  • 隨Session對象持久化到存儲設備中
  • 隨Session對象從一個存儲設備中恢復

Servlet規範中定義了兩個特殊的監聽器接口來幫助JavaBean對象瞭解自已在Session域中的這些狀態:接口

public interface HttpSessionActivationListener extends EventListener
public interface HttpSessionBindingListener extends EventListener

實現這兩個接口的類不須要web.xml文件中進行註冊,既是監聽器又是事件源,實現的僞代碼可能以下:

class Session{
    void setAttribute(String key, Object value){
        if(value instanceof HttpSessionBindingListener){
             HttpSessionBindingListener listener = (HttpSessionBindingListener)value;
             value.valueBound();
        }
        set(key, value);
    }
}

實現了HttpSessionBindingListener接口的JavaBean對象能夠感知本身被綁定到Session中和從Session中刪除的事件

當對象被綁定到HttpSession對象中時,web服務器調用該對象以下方法

 void valueBound(HttpSessionBindingEvent event) 

當對象從HttpSession對象中解除綁定時,web服務器調用該對象以下方法

 void valueUnbound(HttpSessionBindingEvent event) 

實現了HttpSessionActivationListener接口的JavaBean對象能夠感知本身被活化和鈍化的事件。

當綁定到HttpSession對象中的對象將要隨HttpSession對象被鈍化以前,web服務器調用以下方法 sessionWillPassivate(HttpSessionEvent se) 

當綁定到HttpSession對象中的對象將要隨HttpSession對象被活化以後,web服務器調用以下方法 sessionDidActivate(HttpSessionEvent se) 

配置Session一分鐘沒人用到硬盤裏去(META-INF下新建context.xml):

<context>
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
        <Store className="org.apache.catalina.session.FileStore" directory="./session"/>
    </Manager>
</context>
相關文章
相關標籤/搜索