javaweb基礎第二十二課:Listener
寫在前面:
監聽器用的不多,瞭解下就行,畢竟萬一用到了呢。
這課不錄視訊。教程內容我直接複製其他人的,畢竟不是很重要,我也不怎麼用,而且也太簡單了。
教程:
Listener(監聽器)
簡介
- Listener用於監聽JavaWeb程式中的事件。
- 例如:ServletContext、HttpSession、ServletRequest的建立、修改和刪除。
- Listener和我們之前學習的JS中的事件處理機制類似。在JS中,當我們觸發某個事件後(例如:點選一個按鈕)程式會呼叫一個響應函式來處理事件。同樣的,在JavaWeb中,我們可以為某些事件來設定監聽器,當事件被觸發時,監聽器中的指定方法將會被呼叫。
觀察者模式
- Listener的原理是基於觀察者模式的,所謂觀察者模式簡單來說,就是當被觀察者的特定事件被觸發(一般這某些方法被呼叫)後,會通知觀察者(呼叫觀察者的方法),觀察者可以在自己的方法中來對事件做一些處理。
- 在我們的JavaWeb中,觀察者就是Listener,而被觀察者可能有三個ServletContext、HttpSession、ServletRequest。而事件指的就是這些物件的建立、修改和刪除等。
監聽器的分類
- 監聽物件的建立與銷燬
- ServletContextListener
- 作用:監聽ServletContext物件的建立與銷燬
- 方法:
- public void contextInitialized ( ServletContextEvent sce );
- ServletContext建立時呼叫
- public void contextDestroyed ( ServletContextEvent sce );
- ServletContext銷燬時呼叫
- public void contextInitialized ( ServletContextEvent sce );
- ServletContextEvent物件
- 作用:public ServletContext getServletContext ()
- 獲取ServletContext物件
- 作用:public ServletContext getServletContext ()
- HttpSessionListener
- 作用:監聽HttpSession物件的建立與銷燬
- 方法:
- public void sessionCreated ( HttpSessionEvent se );
- HttpSession物件建立時呼叫
- public void sessionDestroyed ( HttpSessionEvent se );
- HttpSession物件銷燬時呼叫
- HttpSessionEvent物件
- 作用:public HttpSession getSession ()
- 獲取當前HttpSession物件
- 作用:public HttpSession getSession ()
- public void sessionCreated ( HttpSessionEvent se );
- ServletRequestListener
- 作用:監聽ServletRequest物件的建立與銷燬
- 方法:
- public void requestInitialized ( ServletRequestEvent sre );
- ServletRequest物件建立時呼叫
- public void requestDestroyed ( ServletRequestEvent sre );
- ServletRequest物件銷燬時呼叫
- ServletRequestEvent物件
- 作用:
- public ServletRequest getServletRequest ();
- 獲取當前的ServletRequest物件。
- public ServletContext getServletContext ();
- 獲取當前專案的ServletContext物件。
- public ServletRequest getServletRequest ();
- 作用:
- public void requestInitialized ( ServletRequestEvent sre );
建立與銷燬監聽器的使用:
- 三種建立與銷燬的監聽器使用起來基本一致。
- 下邊來編寫一個ServletContext的監聽器:
- 步驟:
- 建立一個類實現ServletContextListener
- 步驟:
public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("哈哈,我是ServletContext,我出生了"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("~~~~(>_<)~~~~,我是ServletContext,我要死了"); } } |
-
-
- 在web.xml檔案中註冊監聽器
-
<listener> <listener-class>com.atguigu.web.listener.MyServletContextListener</listener-class> </listener> |
- 由於ServletContext物件在伺服器啟動時建立,停止時銷燬。所以啟動伺服器時我們會發現contextInitialized()方法被呼叫,伺服器停止時contextDestroyed()方法被呼叫。
- 其他兩個監聽器和該監聽器使用方法一樣,不再多說。
2. 監聽物件的屬性變化
- ServletContextAttributeListener
- 作用:監聽ServletContext中屬性的建立、修改和銷燬
- 方法:
- public void attributeAdded(ServletContextAttributeEvent scab);
- 向ServletContext中新增屬性時呼叫
- public void attributeRemoved(ServletContextAttributeEvent scab);
- 從ServletContext中移除屬性時呼叫
- public void attributeReplaced(ServletContextAttributeEvent scab);
- 當ServletContext中的屬性被修改時呼叫
- public void attributeAdded(ServletContextAttributeEvent scab);
- ServletContextAttributeEvent物件
- 作用:
- public String getName()
- 獲取修改或新增的屬性名
- public Object getValue()
- 獲取被修改或新增的屬性值
- public ServletContext getServletContext ()
- 獲取當前WEB應用的ServletContext物件
- public String getName()
- 作用:
- HttpSessionAttributeListener
- 作用:監聽HttpSession中屬性的建立、修改和銷燬
- 方法:
- public void attributeAdded ( HttpSessionBindingEvent se );
- 向HttpSession中新增屬性時呼叫
- public void attributeRemoved(HttpSessionBindingEvent se);
- 從HttpSession中移除屬性時呼叫
- public void attributeReplaced(HttpSessionBindingEvent se);
- 當HttpSession中的屬性被修改時呼叫
- public void attributeAdded ( HttpSessionBindingEvent se );
- HttpSessionBindingEvent物件
- 作用:
- public String getName()
- 獲取修改或新增的屬性名
- public Object getValue()
- 獲取被修改或新增的屬性值
- public HttpSession getSession ()
- 獲取當前的HttpSession物件
- public String getName()
- 作用:
- ServletRequestAttributeListener
- 作用:監聽ServletRequest中屬性的建立、修改和銷燬
- 方法:
- public void attributeAdded (ServletRequestAttributeEvent srae );
- 向ServletRequest中新增屬性時呼叫
- public void attributeRemoved(ServletRequestAttributeEvent srae);
- 從ServletRequest中移除屬性時呼叫
- public void attributeReplaced(ServletRequestAttributeEvent srae);
- 當ServletRequest中的屬性被修改時呼叫
- public void attributeAdded (ServletRequestAttributeEvent srae );
- ServletRequestAttributeEvent物件
- 作用:
- public String getName()
- 獲取修改或新增的屬性名
- public Object getValue()
- 獲取被修改或新增的屬性值
- public ServletRequest getServletRequest ()
- 獲取當前的ServletRequest物件
- public String getName()
- 作用:
物件屬性變化監聽器的使用:
- 同樣三種物件屬性變化監聽器使用方式類似,下邊以request屬性監聽器為例。
- 建立一個類實現ServletRequestAttributeListener介面
public class ReqAttrListener implements ServletRequestAttributeListener { @Override public void attributeAdded(ServletRequestAttributeEvent srae) { System.out.println("request域中新增一個屬性"+srae.getName()+"="+srae.getValue()); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { System.out.println("request域中移除一個屬性"+srae.getName()+"="+srae.getValue()); } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { System.out.println("request域中一個屬性被修改了"+srae.getName()+"="+srae.getValue()); }
} |
-
- 在web.xml檔案中註冊監聽器
<listener> <listener-class>com.atguigu.web.listener.ReqAttrListener</listener-class> </listener> |
-
- 如此當我們操作request域中的屬性時,對應方法將會被呼叫。
3. 監聽Session內的物件
- HttpSessionBindingListener
- 作用:監聽某個物件在session域中的建立與移除。
- 方法:
- public void valueBound(HttpSessionBindingEvent event)
- 該類的例項被放到Session域中時呼叫
- public void valueUnbound(HttpSessionBindingEvent event)
- 該類的例項從Session中移除時呼叫
- public void valueBound(HttpSessionBindingEvent event)
- HttpSessionBindingEvent物件
- 作用:
- public HttpSession getSession ()
- 獲取HttpSession物件
- public String getName()
- 獲取操作的屬性名
- public Object getValue()
- 獲取操作的屬性值
- public HttpSession getSession ()
- 作用:
- 使用:要監聽哪一個類,直接使該類實現HttpSessionBindingListener介面即可。
public class Student implements HttpSessionBindingListener { @Override public void valueBound(HttpSessionBindingEvent event) { //doSomeThing } @Override public void valueUnbound(HttpSessionBindingEvent event) { //doSomeThing } } |
- HttpSessionActivationListener
- 作用:監聽某個物件在session中的序列化與反序列化。
- 方法:
- public void sessionWillPassivate(HttpSessionEvent se)
- 該類例項和Session一起鈍化到硬碟時呼叫
- public void sessionDidActivate(HttpSessionEvent se)
- 該類例項和Session一起活化到記憶體時呼叫
- public void sessionWillPassivate(HttpSessionEvent se)
- HttpSessionEvent物件
- 作用:
- public HttpSession getSession ()
- 獲取HttpSession物件
- public HttpSession getSession ()
- 作用:
- 使用:要監聽哪一個類,直接使該類實現HttpSessionActivationListener介面即可。
public class Student implements HttpSessionActivationListener , Serializable { private static final long serialVersionUID = 1L; @Override public void sessionWillPassivate(HttpSessionEvent se) { // TODO Auto-generated method stub } @Override public void sessionDidActivate(HttpSessionEvent se) { // TODO Auto-generated method stub } } |
注意:這裡為了是Student物件可以正常序列化到硬碟上,還需要讓類實現java.io.Serializable介面