1. 程式人生 > >javaweb基礎第二十二課:Listener

javaweb基礎第二十二課:Listener

寫在前面:

監聽器用的不多,瞭解下就行,畢竟萬一用到了呢。

這課不錄視訊。教程內容我直接複製其他人的,畢竟不是很重要,我也不怎麼用,而且也太簡單了。

 

教程:

Listener(監聽器)

簡介

  • Listener用於監聽JavaWeb程式中的事件。
  • 例如:ServletContext、HttpSession、ServletRequest的建立、修改和刪除。
  • Listener和我們之前學習的JS中的事件處理機制類似。在JS中,當我們觸發某個事件後(例如:點選一個按鈕)程式會呼叫一個響應函式來處理事件。同樣的,在JavaWeb中,我們可以為某些事件來設定監聽器,當事件被觸發時,監聽器中的指定方法將會被呼叫。

觀察者模式

  • Listener的原理是基於觀察者模式的,所謂觀察者模式簡單來說,就是當被觀察者的特定事件被觸發(一般這某些方法被呼叫)後,會通知觀察者(呼叫觀察者的方法),觀察者可以在自己的方法中來對事件做一些處理。
  • 在我們的JavaWeb中,觀察者就是Listener,而被觀察者可能有三個ServletContext、HttpSession、ServletRequest。而事件指的就是這些物件的建立、修改和刪除等。

監聽器的分類

  1. 監聽物件的建立與銷燬
  • ServletContextListener
    1. 作用:監聽ServletContext物件的建立與銷燬
    2. 方法:
      1. public void contextInitialized ( ServletContextEvent sce );
        1. ServletContext建立時呼叫
      2. public void contextDestroyed ( ServletContextEvent sce );
        1. ServletContext銷燬時呼叫
    3. ServletContextEvent物件
      1. 作用:public ServletContext getServletContext ()
        1. 獲取ServletContext物件

 

  • HttpSessionListener
    1. 作用:監聽HttpSession物件的建立與銷燬
    2. 方法:
      1. public void sessionCreated ( HttpSessionEvent se );
        1. HttpSession物件建立時呼叫
      2. public void sessionDestroyed ( HttpSessionEvent se );
        1. HttpSession物件銷燬時呼叫
      3. HttpSessionEvent物件
        1. 作用:public HttpSession getSession ()
          1. 獲取當前HttpSession物件
  • ServletRequestListener
    1. 作用:監聽ServletRequest物件的建立與銷燬
    2. 方法:
      1. public void requestInitialized ( ServletRequestEvent sre );
        1. ServletRequest物件建立時呼叫
      2. public void requestDestroyed ( ServletRequestEvent sre );
        1. ServletRequest物件銷燬時呼叫
      3. ServletRequestEvent物件
        1. 作用:
          1. public ServletRequest getServletRequest ();
            1. 獲取當前的ServletRequest物件。
          2. public ServletContext getServletContext ();
            1. 獲取當前專案的ServletContext物件。

建立與銷燬監聽器的使用:

  • 三種建立與銷燬的監聽器使用起來基本一致。
  • 下邊來編寫一個ServletContext的監聽器:
    1. 步驟:
      1. 建立一個類實現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,我要死了");  

   }

}

      1. 在web.xml檔案中註冊監聽器

<listener>

<listener-class>com.atguigu.web.listener.MyServletContextListener</listener-class>

</listener>

  1. 由於ServletContext物件在伺服器啟動時建立,停止時銷燬。所以啟動伺服器時我們會發現contextInitialized()方法被呼叫,伺服器停止時contextDestroyed()方法被呼叫。
  2. 其他兩個監聽器和該監聽器使用方法一樣,不再多說。

2. 監聽物件的屬性變化

  • ServletContextAttributeListener
    1. 作用:監聽ServletContext中屬性的建立、修改和銷燬
    2. 方法:
      1. public void attributeAdded(ServletContextAttributeEvent scab);
        1. 向ServletContext中新增屬性時呼叫
      2. public void attributeRemoved(ServletContextAttributeEvent scab);
        1. 從ServletContext中移除屬性時呼叫
      3. public void attributeReplaced(ServletContextAttributeEvent scab);
        1. 當ServletContext中的屬性被修改時呼叫
    3. ServletContextAttributeEvent物件
      1. 作用:
        1. public String getName()
          1. 獲取修改或新增的屬性名
        2. public Object getValue()
          1. 獲取被修改或新增的屬性值
        3. public ServletContext getServletContext ()
          1. 獲取當前WEB應用的ServletContext物件
  • HttpSessionAttributeListener
    1. 作用:監聽HttpSession中屬性的建立、修改和銷燬
    2. 方法:
      1. public void attributeAdded ( HttpSessionBindingEvent se );
        1. 向HttpSession中新增屬性時呼叫
      2. public void attributeRemoved(HttpSessionBindingEvent se);
        1. 從HttpSession中移除屬性時呼叫
      3. public void attributeReplaced(HttpSessionBindingEvent se);
        1. 當HttpSession中的屬性被修改時呼叫
    3. HttpSessionBindingEvent物件
      1. 作用:
        1. public String getName()
          1. 獲取修改或新增的屬性名
        2. public Object getValue()
          1. 獲取被修改或新增的屬性值
        3. public HttpSession getSession ()
          1. 獲取當前的HttpSession物件
  • ServletRequestAttributeListener
    1. 作用:監聽ServletRequest中屬性的建立、修改和銷燬
    2. 方法:
      1. public void attributeAdded (ServletRequestAttributeEvent srae );
        1. 向ServletRequest中新增屬性時呼叫
      2. public void attributeRemoved(ServletRequestAttributeEvent srae);
        1. 從ServletRequest中移除屬性時呼叫
      3. public void attributeReplaced(ServletRequestAttributeEvent srae);
        1. 當ServletRequest中的屬性被修改時呼叫
    3. ServletRequestAttributeEvent物件
      1. 作用:
        1. public String getName()
          1. 獲取修改或新增的屬性名
        2. public Object getValue()
          1. 獲取被修改或新增的屬性值
        3. public ServletRequest getServletRequest ()
          1. 獲取當前的ServletRequest物件

物件屬性變化監聽器的使用:

  • 同樣三種物件屬性變化監聽器使用方式類似,下邊以request屬性監聽器為例。
    1. 建立一個類實現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());

   }

 

}

    1. 在web.xml檔案中註冊監聽器

   <listener>

      <listener-class>com.atguigu.web.listener.ReqAttrListener</listener-class>

   </listener>

    1. 如此當我們操作request域中的屬性時,對應方法將會被呼叫。

3. 監聽Session內的物件

  • HttpSessionBindingListener
    1. 作用:監聽某個物件在session域中的建立與移除。
    2. 方法:
      1. public void valueBound(HttpSessionBindingEvent event)
        1. 該類的例項被放到Session域中時呼叫
      2. public void valueUnbound(HttpSessionBindingEvent event)
        1. 該類的例項從Session中移除時呼叫
    3. HttpSessionBindingEvent物件
      1. 作用:
        1. public HttpSession getSession ()
          1. 獲取HttpSession物件
        2. public String getName()
          1. 獲取操作的屬性名
        3. public Object getValue()
          1. 獲取操作的屬性值
  • 使用:要監聽哪一個類,直接使該類實現HttpSessionBindingListener介面即可。

public class Student implements HttpSessionBindingListener {

   @Override

   public void valueBound(HttpSessionBindingEvent event) {

      //doSomeThing

   }

   @Override

   public void valueUnbound(HttpSessionBindingEvent event) {

      //doSomeThing

   }

}

 

  • HttpSessionActivationListener
    1. 作用:監聽某個物件在session中的序列化與反序列化。
    2. 方法:
      1. public void sessionWillPassivate(HttpSessionEvent se)
        1. 該類例項和Session一起鈍化到硬碟時呼叫
      2. public void sessionDidActivate(HttpSessionEvent se)
        1. 該類例項和Session一起活化到記憶體時呼叫
    3. HttpSessionEvent物件
      1. 作用:
        1. public HttpSession getSession ()
          1. 獲取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介面