三大組件之前說了兩個,今天說說最後一個。
1.什麼是Listener?
Listener用於監聽JavaWeb程序中的事件。
例如:ServletContext、HttpSession、ServletRequest的創建、修改和刪除。
Listener和JS中的事件處理機制類似。在JS中,當我們觸發某個事件後(例如:點擊一個按鈕)程序會調用一個響應函數來處理事件。同樣的,在JavaWeb中,我們可以爲某些事件來設置監聽器,當事件被觸發時,監聽器中的指定方法將會被調用。
2.觀察者模式
Listener的原理是基於觀察者模式的,所謂觀察者模式簡單來說,就是當被觀察者的特定事件被觸發(一般這某些方法被調用)後,會通知觀察者(調用觀察者的方法),觀察者可以在自己的方法中來對事件做一些處理。
在我們的JavaWeb中,觀察者就是Listener,而被觀察者可能有三個ServletContext、HttpSession、ServletRequest。而事件指的就是這些對象的創建、修改和刪除等。
3.Listener的分類
3.1 監聽對象的創建與銷燬
ServletContextListener
-
作用:監聽ServletContext對象的創建與銷燬
-
方法:
public void contextInitialized ( ServletContextEvent sce ):ServletContext創建時調用
public void contextDestroyed ( ServletContextEvent sce ):ServletContext銷燬時調用
-
ServletContextEvent對象
- 作用:public ServletContext getServletContext ():獲取ServletContext對象
HttpSessionListener
-
作用:監聽HttpSession對象的創建與銷燬
-
方法:
- public void sessionCreated ( HttpSessionEvent se ):HttpSession對象創建時調用
- public void sessionDestroyed ( HttpSessionEvent se ):HttpSession對象銷燬時調用
-
HttpSessionEvent對象
- 作用:public HttpSession getSession ():獲取當前HttpSession對象
ServletRequestListener
-
作用:監聽ServletRequest對象的創建與銷燬
-
方法:
- public void requestInitialized ( ServletRequestEvent sre ):ServletRequest對象創建時調用
- public void requestDestroyed ( ServletRequestEvent sre ):ServletRequest對象銷燬時調用
-
ServletRequestEvent對象
-
作用:
public ServletRequest getServletRequest ():獲取當前的ServletRequest對象。
public ServletContext getServletContext ():獲取當前項目的ServletContext對象。
-
3.1.1 創建與銷燬監聽器的使用
三種創建與銷燬的監聽器使用起來基本一致。
下邊來編寫一個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>
說明1:由於ServletContext對象在服務器啓動時創建,停止時銷燬。所以啓動服務器時我們會發現contextInitialized()方法被調用,服務器停止時contextDestroyed()方法被調用。
說明2:其他兩個監聽器和該監聽器使用方法一樣,不再多說。
3.2 監聽對象的屬性變化
ServletContextAttributeListener
-
作用:監聽ServletContext中屬性的創建、修改和銷燬
-
方法:
public void attributeAdded(ServletContextAttributeEvent scab):向ServletContext中添加屬性時調用
public void attributeRemoved(ServletContextAttributeEvent scab):從ServletContext中移除屬性時調用
public void attributeReplaced(ServletContextAttributeEvent scab):當ServletContext中的屬性被修改時調用
-
ServletContextAttributeEvent對象
-
作用:
public String getName() :獲取修改或添加的屬性名
public Object getValue():獲取被修改或添加的屬性值
public ServletContext getServletContext ():獲取當前WEB應用的ServletContext對象
-
HttpSessionAttributeListener
-
作用:監聽HttpSession中屬性的創建、修改和銷燬
-
方法:
public void attributeAdded ( HttpSessionBindingEvent se ):向HttpSession中添加屬性時調用
public void attributeRemoved(HttpSessionBindingEvent se):從HttpSession中移除屬性時調用
public void attributeReplaced(HttpSessionBindingEvent se):當HttpSession中的屬性被修改時調用
-
HttpSessionBindingEvent對象
-
作用:
public String getName() :獲取修改或添加的屬性名
public Object getValue():獲取被修改或添加的屬性值
public HttpSession getSession ():獲取當前的HttpSession對象
-
ServletRequestAttributeListener
-
作用:監聽ServletRequest中屬性的創建、修改和銷燬
-
方法:
public void attributeAdded (ServletRequestAttributeEvent srae ):向ServletRequest中添加屬性時調用
public void attributeRemoved(ServletRequestAttributeEvent srae):從ServletRequest中移除屬性時調用
public void attributeReplaced(ServletRequestAttributeEvent srae):當ServletRequest中的屬性被修改時調用
-
ServletRequestAttributeEvent對象
-
作用:
public String getName():獲取修改或添加的屬性名
public Object getValue():獲取被修改或添加的屬性值
public ServletRequest getServletRequest () :獲取當前的ServletRequest對象
-
3.2.1 對象屬性變化監聽器的使用
同樣三種對象屬性變化監聽器使用方式類似,下邊以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.3 監聽Session內的對象
HttpSessionBindingListener
-
作用:監聽某個對象在session域中的創建與移除。
-
方法:
public void valueBound(HttpSessionBindingEvent event):該類的實例被放到Session域中時調用
public void valueUnbound(HttpSessionBindingEvent event):該類的實例從Session中移除時調用
-
HttpSessionBindingEvent對象
-
作用:
public HttpSession getSession ():獲取HttpSession對象
public String getName():獲取操作的屬性名
public Object getValue():獲取操作的屬性值
-
-
使用:要監聽哪一個類,直接使該類實現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一起活化到內存時調用
-
HttpSessionEvent對象
-
作用:
public HttpSession getSession ():獲取HttpSession對象
-
-
使用:要監聽哪一個類,直接使該類實現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接口。