厚积薄发系列之listener

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了厚积薄发系列之listener相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

厚积薄发系列之JavaWeb的Filter

厚积薄发之XML相关技术

解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……(代码片段

Android 调用组件 w/listener 或让 viewmodel 调用组件与片段通信

Zabbix系列之五——监控TCP端口

厚积薄发Lua全局变量代码规范