zoukankan      html  css  js  c++  java
  • 监听器

    监听器的概述

      监听器就是一个实现了特定接口的类,这个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

     




     

          

      

    笨鸟先飞
  • 相关阅读:
    png 图片的缩放
    数据结构>图的最短路径
    2007年7月25日在博客园的排名上升到前400名
    C# 汉字转拼音(全拼)
    修改 Linux 主机名
    C# 事件的继承
    一个实现了 IDisposable 接口的基类
    Windows 防火墙上也有端口映射功能
    网上邻居不能访问的问题
    令网站提速的7大秘方
  • 原文地址:https://www.cnblogs.com/zoutingrong/p/14687124.html
Copyright © 2011-2022 走看看