從零開始學習Java Web(七):認識8大Listener

    3個屬性監聽者:

1、ServletContextListener

        void contextInitialized(ServletContextEvent)

        void contextDestroyed(ServletContextEvent)

2、ServletRequestAttributeListener

        void attributeAdded(ServletRequestAttributeEvent)

        void attributeRemoved(ServletRequestAttributeEvent)

        void attributeReplaced(ServletRequestAttributeEvent)

3、HttpSessionAttributeListener

        void attributeAdded(HttpSessionBindingEvent)

        void attributeRemoved(HttpSessionBindingEvent)

        void attributeReplaced(HttpSessionBindingEvent)

以上三個Listener分別在ServletContext、ServletRequest、HttpSession的屬性(Attribute)發生變化時會觸發相應的方法,調用setAttribute(name, value)會觸發attributeAdded()或者attributeReplaced(),調用removeAttribute(name)會觸發attributeRemoved()。


3個生命週期監聽者:

4、ServletRequestListener

        void requestInitialized(ServletRequestEvent)

        void requestDestroyed(ServletRequestEvent)

5、ServletContextListener

        void contextInitialized(ServletContextEvent)

        void contextDestroyed(ServletContextEvent)

6、HttpSessionListener

        void sessionCreated(HttpSessionEvent)

        void sessionDestroyed(HttpSessionEvent)

以上三個Listener分別會在他們創建的時候調用contextInitialized,在消亡的時候調用sessionDestroyed。、


剩下的兩個Listener

7、HttpSessionBindingListener

        void valueBound(HttpSessionBindingEvent)

        void valueUnbound(HttpSessionBindingEvent)

8、HttpSessionActivationListener

        void sessionWillPassivate(HttpSessionEvent)

        void sessionDidActivate(HttpSessionEvent)

這裏講一下HttpSessionBindingListener,它的兩個方法的觸發條件相對比HttpSessionAttributeListener要苛刻一些,我們使用session.setAttribute(name,value)或者session.removeAttribute(name)都能觸發HttpSessionAttributeListener的方法。但是,只有setAttribute或者removeAttribute方法中的value對象實現了HttpSessionBindingListener,纔會觸發HttpSessionBindingListener中的方法。

例如,User實現了HttpSessionBindingListener

public class User implements HttpSessionBindingListener{
	@Override
	public void valueBound(HttpSessionBindingEvent event) {
		
	}
	@Override
	public void valueUnbound(HttpSessionBindingEvent event) {
		
	}
}
那麼,以下的操作就回觸發HttpSessionBindingListener中的方法。

session.setAttribute("user", new User());//會觸發valueBound的方法

session.removeAttribute("user");//會觸發valueUnbound方法


HttpSessionActivationListener是爲了讓HttpSession從一個VM轉移到另一個VM,如果你session的屬性(Attribute)是Serializable對象,或者不擔心屬性遷移問題,這個Listener幾乎不會用到,事實上,這個Listener大多數都不會使用。

sessionWillPassivate:在方法裏將非Serializable字段設置爲某種狀態。

sessionDidActivate:將在sessionWillPassivate設置爲某種狀態的字段恢復成原來的樣子。


當然,不是寫一個類 implements Linstener就能使用監聽事件,還需要在web.xml中進行配置。

<web-app ...>
    <listener>
        <listener-class>xxxxx</listener-class>
    </listener>
</web-app>









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