1. 程式人生 > >厚積薄發系列之listener

厚積薄發系列之listener

servlet void eve getname 時間 port 寫入 磁盤 none

1.listener的重要概念

  • 作用: 監聽web中的域對象 ServletContext ServletRequest HttpSession
  • 監聽內容
    • 監聽三個對象的創建和銷毀
      • ServletContextListener 監聽ServletContext的創建和銷毀

      • ServletRequestListener 監聽ServletRequest的創建和銷毀
      • HttpSessionListener 監聽HttpSession的創建和銷毀
    • 監聽三個對象的屬性的變化
      • ServletContextAttributeListener 監聽ServeltContext域對象中 添加 刪除 替換 的操作
      • ServletContextAttributeListener 監聽ServletContext域對象中 添加 刪除 替換 的操作
      • HttpSessionAttributeListener 監聽HttpSession域對象中 添加 刪除 替換 的操作
    • 監聽session中javabean的狀態
      • HttpSessionActivationListener(鈍化和活化) 監聽是否將javaBean寫入磁盤中(鈍化)或者將javaBean從磁盤中活化到Session中
      • HttpSessionBindingListener(綁定和解綁) 監聽javaBean是否綁定到Session域中

2.使用步驟

  • 監聽三個web域對象的創建和銷毀 && 監聽三個對象的屬性的變化
    • 編寫一個java類
    • 實現ServletContextListener || ServletRequestListener || HttpSessionListener || ServletContextAttributeListener || ServletContextAttributeListener ||HttpSessionAttributeListener接口的其中一個,在web.xml中配置listener
      1 <?xml version="1.0" encoding="UTF-8"?>
      2
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <listener> 4 <listener-class>listener.ApplicationInitListener</listener-class> 5 </listener> 6 </web-app>

    • 下面以ServletContextListener接口演示
    •  1 package listener;
       2 
       3 import javax.servlet.ServletContextEvent;
       4 import javax.servlet.ServletContextListener;
       5 
       6 public class ContextListener implements ServletContextListener {
       7 
       8     @Override
       9     public void contextDestroyed(ServletContextEvent arg0) {
      10         // TODO Auto-generated method stub
      11         System.out.println("ServletContext域對象銷毀了");
      12     }
      13 
      14     @Override
      15     public void contextInitialized(ServletContextEvent arg0) {
      16         // TODO Auto-generated method stub
      17         System.out.println("ServletContext域對像創建了");
      18     }
      19 
      20 }

  • 監聽session中javabean的狀態
    • HttpSessionActivationListener(鈍化和活化)
      • 解釋:在javaBean上實現HttpSessionActivationListener接口可以監聽到javaBean的鈍化或者活化操作
      • 鈍化:Session中的實現了HttpSessionActivationListener接口的JavaBean在指定時間沒有活動就會被寫入磁盤中;
      • 活化:當用戶在Session沒有過期的時間內再次響應操作,那麽就會從已經鈍化的磁盤中將此javaBean活化到內存中;
      • 使用步驟
        • 在javaBean中實現HttpSessionActivationListener接口
        • 技術分享
           1 package domain;
           2 
           3 import javax.servlet.http.HttpSessionActivationListener;
           4 import javax.servlet.http.HttpSessionBindingEvent;
           5 import javax.servlet.http.HttpSessionEvent;
           6 
           7 public class User implements HttpSessionActivationListener {
           8     private String username;
           9     private String password;
          10 
          11     public String getUsername() {
          12         return username;
          13     }
          14 
          15     public void setUsername(String username) {
          16         this.username = username;
          17     }
          18 
          19     public String getPassword() {
          20         return password;
          21     }
          22 
          23     public void setPassword(String password) {
          24         this.password = password;
          25     }
          26 
          27     public static void main(String[] args) {
          28         System.out.println(User.class.getName());
          29     }
          30 
          31     @Override
          32     public void sessionDidActivate(HttpSessionEvent arg0) {
          33         // TODO Auto-generated method stub
          34         System.out.println("很久沒有使用了,寫入磁盤了");
          35     }
          36 
          37     @Override
          38     public void sessionWillPassivate(HttpSessionEvent arg0) {
          39         // TODO Auto-generated method stub
          40         System.out.println("用戶使用了,我又回到內存了");
          41     }
          42 
          43 }
          View Code
        • 在項目的META-INF目錄下新建Context.xml
        • 文件內容如下
        • <?xml version="1.0" encoding="UTF-8"?>
          <Context>
              <!-- maxIdleSwap :1分鐘 如果session不使用就會序列化到硬盤. directory :itheima 序列化到硬盤的文件存放的位置. -->
              <Manager className="org.apache.catalina.session.PersistentManager"
                  maxIdleSwap="1">
                  <Store className="org.apache.catalina.session.FileStore"
                      directory="itheima" />
              </Manager>
          </Context>

    • HttpSessionBindingListener(綁定和解綁)
      • 解釋:在javaBean上使其實現HttpSessionBindingListener接口,當此javaBean被添加到HttpSession域對象中的時候或者從HttpSession域中移除的時候都會觸發javaBean接口實現的方法,不需要配置web.xml
      •  1 package domain;
         2 
         3 import javax.servlet.http.HttpSessionBindingEvent;
         4 import javax.servlet.http.HttpSessionBindingListener;
         5 
         6 public class User implements HttpSessionBindingListener {
         7     private String username;
         8     private String password;
         9 
        10     public String getUsername() {
        11         return username;
        12     }
        13 
        14     public void setUsername(String username) {
        15         this.username = username;
        16     }
        17 
        18     public String getPassword() {
        19         return password;
        20     }
        21 
        22     public void setPassword(String password) {
        23         this.password = password;
        24     }
        25 
        26     public static void main(String[] args) {
        27         System.out.println(User.class.getName());
        28     }
        29 
        30     @Override
        31     public void valueBound(HttpSessionBindingEvent arg0) {
        32         // TODO Auto-generated method stub
        33         System.out.println("我被添加到Session中啦~~~~~~~");
        34     }
        35 
        36     @Override
        37     public void valueUnbound(HttpSessionBindingEvent arg0) {
        38         // TODO Auto-generated method stub
        39         System.out.println("我從Session中被移除了~~~~~~~");
        40     }
        41 
        42 }

厚積薄發系列之listener