监听器

监听器的概述

  监听器就是一个实现了特定接口的类,这个java类用于监听另一个java类的方法电泳或者属性的改变。当被监听对象发生上述时间后,监听器的某个方法将会立即被执行。

监听器的分类

  1. 监听三个与对象的创建和销毁(3个)
    • ServletContextListener
      • ServletContextListener会对ServletContext的初始化和解析做出响应
      • 该接口含有两个方法
      •  ServletContext的创建和销毁

        • 创建
          • 当tomcat服务器启动时,服务器就会为每个web工程创建一个ServletContext对象
        • 销毁
          • 当服务器关闭时,就会将ServletContext对象进行销毁
      • 案例实践
        • package weblistenner;
          
          import javax.servlet.ServletContextEvent;
          import javax.servlet.ServletContextListener;
          
          /**
           * @author ztr
           * @version 创建时间:2021年4月20日 下午7:18:21
           * 类说明
           */
          /**
           * ServletContextListenner的企业用途
           * 1加载框架的配置文件:
           *     spring框架提供了一个核心监听器ContextLoadListener
           * 2定时任务调度
           *     
           * 
          *   
          * 项目名称:web05  
          * 类名称:ServletContextlistenner  
          * 类描述:  
          * 创建人:ztr  
          * 创建时间:2021年4月20日 下午7:23:33  
          * @version
           */
          public class ServletContextlistenner implements ServletContextListener{
          
              @Override
              public void contextDestroyed(ServletContextEvent arg0) {
                  System.out.println("ServletContext对象被销毁了");
              }
          
              @Override
              public void contextInitialized(ServletContextEvent arg0) {
                  
                  System.out.println("ServletContext对象被创建了");
              }
          
          }

          在web.xml中配置监听器

        • <listener>
                <listener-class>
                    weblistenner.ServletContextlistenner
                </listener-class>
            </listener>
        • 当启动tomcat服务器时,将会在控制台上输出:ServletContext对象被创建了
        • 当关闭服务器时,将会在控制台上输出:ServletContext对象被销毁了
    • HttpSessionListener
      • 该接口含有两个方法
        • session对象的创建和销毁
          • 创建
            • 调用getSession()方法是创建
          • 销毁
            • session调用了 session.invalidate()方法
            • session过期
        • 案例
        • package weblistenner;
          
          import javax.servlet.http.HttpSessionEvent;
          import javax.servlet.http.HttpSessionListener;
          
          /**
           * @author ztr
           * @version 创建时间:2021年4月20日 下午7:25:40
           * 类说明
           */
          /**
           * 
           * 
           * 项目名称:web05 类名称:HttpSessionListenner 类描述: 创建人:ztr 创建时间:2021年4月20日 下午7:25:43
           * 
           * @version 访问html不会创建Session 
           * 访问jsp会创建Session 因为jsp会被翻译成servlet且通过起源码可以得知
           *          javax.servlet.http.HttpSession session = null; 
           *          session = pageContext.getSession(); 
           *  访问Servlet也不会创建Session因为其默认没有调用getSession方法
           */
          public class HttpSessionListenner implements HttpSessionListener {
          
              @Override
              public void sessionCreated(HttpSessionEvent sec) {
                  System.out.println("Httpsession被创建");
              }
          
              @Override
              public void sessionDestroyed(HttpSessionEvent sec) {
                  System.out.println("Httpsession被销毁");
              }
          
          }
        • 在web.xml中配置监听器
          • <listener>
              
                  <listener-class>
                      weblistenner.HttpSessionListenner
                  </listener-class>
            </listener>
            <--
              配置session的过期时间
            -->
            <session-config>
                <session-timeout>1</session-timeout>
              </session-config>
          • 再创建demo1.jsp(其可以不包含任意代码)
        • 启动服务器,并访问demo1,.jsp
        • 此时控制台会输出:Httpsession被创建
        • 当浏览器不进行任何操作时,在一分钟后session将会过期,控制台会输出:Httpsession被销毁
    • ServletRequsetListener监听器
      • 该接口含有两个方法
      • Request的创建和销毁

        • 创建
          • 当浏览器向客服端发送请求时

        • 销毁
          • 当服务器响应了浏览器发出的请求之后,便会进行销毁
      • 案例

      • package weblistenner;
        
        import javax.servlet.ServletRequestEvent;
        import javax.servlet.ServletRequestListener;
        
        /**
         * @author ztr
         * @version 创建时间:2021年4月20日 下午7:44:00
         * 类说明
         * 访问HTML,JSP,Servlet都会创建Request对象
         * 因为这些都是客户端向服务器发出的请求
         */
        public class MySErvletRequestListeber implements ServletRequestListener {
        
            @Override
            public void requestDestroyed(ServletRequestEvent arg0) {
                System.out.println("servletrequest被销毁");
            }
        
            @Override
            public void requestInitialized(ServletRequestEvent arg0) {
                System.out.println("servletrequest被创建");
            }
        
        }
      • 在web.xml中进行监听器的配置
      • <listener>
              <listener-class>
                  weblistenner.MySErvletRequestListeber
              </listener-class>
          </listener>
      • demo1.jsp
      • 启动tomcat服务器,并访问demo1.jsp
      • 控制器会输出:servletrequest被创建,servletrequest被销毁
  • 监听三个域对象的属性变更(属性的更改和移除,替换)(3个)
    • ServletContextAttrubuteListener
      • 该接口含有以下方法

        • 案例
        • MyHttpsessionAttributeListener
        • package weblistenner;
          
          import javax.servlet.http.HttpSessionAttributeListener;
          import javax.servlet.http.HttpSessionBindingEvent;
          
          /**
           * @author ztr
           * @version 创建时间:2021年4月21日 下午8:09:44
           * 类说明
           */
          public class MyHttpsessionAttributeListener implements HttpSessionAttributeListener{
          
              @Override
              public void attributeAdded(HttpSessionBindingEvent arg0) {
                  System.out.println("向session添加了属性");
              }
          
              @Override
              public void attributeRemoved(HttpSessionBindingEvent arg0) {
                  System.out.println("向session移除了属性");
                  
              }
          
              @Override
              public void attributeReplaced(HttpSessionBindingEvent arg0) {
                  System.out.println("向session替换了属性");
                  
              }
          
          }
        • 在web.xml中配置监听器
        • <listener>
            
                <listener-class>
                weblistenner.MyHttpsessionAttributeListener
                </listener-class>
                
            </listener>
        • demo2.jsp
        • <%@ page language="java" contentType="text/html; charset=UTF-8"
              pageEncoding="UTF-8"%>
          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>Insert title here</title>
          </head>
          <body>
          <%
              //向session中添加属性
              session.setAttribute("name", "梨花");
              //属性的替换
              session.setAttribute("name","张三");
              //移除属性
              session.removeAttribute("name");
          %>    
          </body>
          </html>
        • 启动tomcat服务器,并在浏览访问demo2.jsp
        • 控制台输出:
          • 向session添加了属性
            向session替换了属性
            向session移除了属性
    • servletRequestAttribute和ServletSessionAttribute和上述的方法一致。

监听HttpSession中javaBean的状态改变(钝化,活化,绑定,解除绑定)

    • 钝化:session持久化到一个存储设备中

    • 活化:随session对象从一个存储设备中恢复

    • 绑定:将java类绑定到session中

    • 解绑:从session中解绑

  • Servlet规范中定义了两个特殊的监听的接口来帮助java类了解自己session域中的状态

    • HttpSessionBindingListener
    • HttpSessionActiveListener
    • 实现这两个接口的类不需要在web.xml中进行配置
  • 配置session的序列化和饭序列化
    • 在context.xml中配置
    • <?xml version="1.0" encoding="UTF-8"?>
           <Context>  
              <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">  
                  <Store className="org.apache.catalina.session.FileStore" directory="mysession"/>  
              </Manager>  
          </Context>  

      对高配置文件的说明:

      • 当浏览器超过一分钟未与服务器进行交互时,将session序列化到存储设备中,一减轻服务器的的内存压力,当浏览器再次访问时,在将session进行反序列化
    • context.xml可以配置在以下位置
      • Toamcat/conf/context.xml
      • Tomcat.conf/Catalina/localhost/context.xml
      • 配置在工程目录下的/META-INF/cintext.xml
      • 案例java类的绑定与解除绑定
      • javaBean的详解

        • 就是实现了固定的规范,通过get和set方法来设置属性
        • package bean;
          
          import javax.servlet.http.HttpSessionBindingEvent;
          import javax.servlet.http.HttpSessionBindingListener;
          
          /**
           * @author ztr
           * @version 创建时间:2021年4月21日 下午8:25:07
           * 类说明
           * java类的绑定和解除绑定的测试
           */
          public class Bean1 implements HttpSessionBindingListener{
              private String name;
          
              public String getName() {
                  return name;
              }
          
              public void setName(String name) {
                  this.name = name;
              }
          
              @Override
              public void valueBound(HttpSessionBindingEvent arg0) {
                  System.out.println("绑定");
                  
              }
          
              @Override
              public void valueUnbound(HttpSessionBindingEvent arg0) {
                  System.out.println("解除绑定");
              }
              
          }
          • demo3.jsp
          • <%@page import="bean.Bean1"%>
            <%@ page language="java" contentType="text/html; charset=UTF-8"
                pageEncoding="UTF-8"%>
            <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
            <html>
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Insert title here</title>
            </head>
            <body>
            <%
                Bean1 bean = new Bean1();
            //将java类绑定到session中
            //需要注意的是setArrtibute中的参数是java类
                session.setAttribute("bean", bean);
            //将java类从session中移除
                session.removeAttribute("bean");
            %>
            </body>
            </html>
          • 启动tomcat服务器,并在浏览器中访问demo3.jsp
          • 控制台输出
            • 绑定
              解除绑定 
          • 案例-java类的钝化和活化
            • Bean2.java
            • package bean;
              
              import java.io.Serializable;
              
              import javax.servlet.http.HttpSessionActivationListener;
              import javax.servlet.http.HttpSessionEvent;
              
              /**
               * @author ztr
               * @version 创建时间:2021年4月21日 下午8:53:26
               * 类说明
               */
              public class Bean2 implements HttpSessionActivationListener,Serializable{
                  /**
                   * 
                   */
                  private static final long serialVersionUID = 1L;
                  private String name;
                  @Override
                  public void sessionDidActivate(HttpSessionEvent arg0) {
                      System.out.println("别活化");
                      
                  }
              
                  @Override
                  public void sessionWillPassivate(HttpSessionEvent arg0) {
                      System.out.println("别钝化");
                      
                  }
              
                  public String getName() {
                      return name;
                  }
              
                  public void setName(String name) {
                      this.name = name;
                  }
                  
              
              }
             
            • demo4.jsp
            • <%@page import="bean.Bean2"%>
              <%@ page language="java" contentType="text/html; charset=UTF-8"
                  pageEncoding="UTF-8"%>
              <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
              <html>
              <head>
              <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
              <title>Insert title here</title>
              </head>
              <body>
              <%
                  Bean2 bean2 = new Bean2();
                  bean2.setName("fds");
                  session.setAttribute("bean2",bean2);
              
              %>
              </body>
              </html>
            • demo5.jsp
            • <%@ page language="java" contentType="text/html; charset=UTF-8"
                  pageEncoding="UTF-8"%>
              <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
              <html>
              <head>
              <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
              <title>Insert title here</title>
              </head>
              <body>
              ${bean2.name }
              </body>
              </html>
            • 启动tomcat服务器,并在浏览器中访问demo4.jsp

 




 

      

  

笨鸟先飞
原文地址:https://www.cnblogs.com/zoutingrong/p/14687124.html