關於Listener監聽器的使用詳情

  
三大組件之前說了兩個,今天說說最後一個。

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接口。

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