Listener是基於觀察者模式設計的,Listener為Servlet應用程式提供一種控製程序和資料的手段。 Listener的註冊
Java Web的listener註冊比較簡單,因為其監聽的對象及事件都是Servlet容器建立的,如果需要它們的監聽器的話,只需要在web.xml中配置即可:
[java] view plain copy <!-- web.xml--> <listener> <listener-class>... ...實現特定介面的自訂監聽器1</listener-class> <listener-class>... ...實現特定介面的自訂監聽器2</listener-class> ... ... </listener>
對於多個實現相同介面的listener,在執行時按照在web.xml中註冊的順序來決定。
listener也可以在應用程式中動態添加。
Listener相關介面
Servlet規範中定義了多種類型的listener,它們用於監聽的事件來源分別為ServletContext,HttpSession和ServletRequest這三個域對象。
Servlet規範針對這三個對象上的操作,又把這寫監聽器分為三種類型:
監聽三個域對象的建立和銷毀的事件監聽器
Listener類 |
含有的介面 |
介面說明 |
ServletContextListener |
contextInitialized(ServletContextEvent sce); contextDestroyed(ServletContextEvent sce); |
Context容器初始化時觸發,在所有的Filter和Servlet的init方法調用之前contextInitialized介面先被調用; Context容器銷毀,在所有的Filter和Servlet的destroy方法調用之後contextDestroyed介面被調用; |
HttpSessionListener |
SessionCreated(HttpSessionEvent se); SessionDestroyed(HtppSessionEvent se); |
當一個session對象被建立時觸發; 當一個session對象被失效時觸發; |
ServletRequestListener |
requestInitialized(ServletRequestEvent sre); requestDestroyed(ServletRequestEvent sre); |
當HttpServletRequest對象被傳遞到使用者的Servlet的service方法之前該方法被觸發;
當HttpServletRequest對象在調用完使用者的Servlet的service方法之後該方法被觸發; |
注意:ServletContextListener在容器啟動之後就不能再添加新的了,因為它所監聽的事件已經不會再出現了。
監聽三個域對象中屬性的增,刪,改的事件監聽器
Listener類 |
含有的介面 |
介面說明 |
ServletContextAttributeListener |
AttributeAdded(ServletContextAttributeEvent scab); AttributeRemoved(ServletContextAttributeEvent scab); AttributeReplaced(ServletContextAttributeEvent scab); |
當調用servletContext.setAttribute方法時觸發這個方法; 當調用servletContext.removeAttribute方法時觸發這個方法; 如果在調用servletContext.setAttribute之前該attribute已經存在,則替換這個attribute時,這個方法被觸發 |
HttpSessionAttributeListener |
attributeAdded(HttpSessionBindingEvent se); attributeRemoved(HttpSessionBindingEvent se); attributeReplaced(HttpSessionBindingEvent se); |
session.setAttribute方法被調用時該方法被觸發; session.removeAttribute方法被調用時該方法被觸發; 如果在調用session.setAttribute之前該attribute已經存在,則替換這個attribute時這個方法被觸發; |
ServletRequestAttributeListener |
AttributeAdded(ServletRequestAttributeEvent srae); AttributeRemoved(ServletRequestAttributeEvent srae); AttributeReplaced(ServletRequestAttributeEvent srae); |
當調用request.setAttribute方法時觸發這個方法; 當調用request.removeAttribute方法時觸發這個方法; 如果在調用request.setAttribute之前該attribute已經存在,則替換attribute時這個方法被觸發; |
感知型監聽器
這種監聽器不需要註冊。
某個java bean實現這個介面後就可以監聽何時被綁定,解除綁定或被啟用或鈍化。
HttpSessionBindingListener:實現該介面的類,能檢測自己何時被HttpSession綁定,解除綁定;
HttpSessionActivationListener:實現該介面的類,能檢測自己何時隨著HttpSession一起啟用和鈍化;
Listener的應用樣本
比如:
應用的初始化工作 —— 在自訂繼承的ServletContextListener監聽器的contextInitialized方法中,進行應用級的資源初始化以便提高效率,在contextDestroyed方法中對應用級的資源進行釋放;