zoukankan      html  css  js  c++  java
  • Java中的监听器

      servlet的技术规范包括三个:servlet,listener,filter,今天记录一下listener的学习。

      监听器就是监听某个对象的状态变化的技术。监听器包括事件源,监听器,注册监听器以及响应行为四个部分。

      事件源即被监听的对象。

      监听器是监听事件源对象的状态变化。

      注册监听器即将监听器与事件源关联起来。

      响应行为即监听到事件源所触发的动作。

      监听器按照不同的划分方式可以分为多种

        1,按照监听的对象不同可分为HttpRequest域,HttpSession域和ServletContext域。

        2,按照监听的状态可分为监听域对象的创建与销毁,属性状态的变化。(这两点可归纳为监听三大域对象的创建与销毁及其属性的状态变化)

        3,其它监听器

      ServletContext域 HttpSession域 ServletRequest域
    域对象的创建与销毁 ServletContextListener HttpSessionListener ServletRequestListener
    域对象属性状态的变化 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener

      一,三大域对象的监听器

        此三大域对象的监听器的使用方法:

        • 创建类实现监听器接口
        • 实现接口中监听的方法
        • 注册监听器即在配置文件中把监听器也事件源关联起来      

        1,ServletContext域对象的监听器

          A,ServletContextListener监听器

      此监听器主要用来监听ServletContextListener的创建与销毁即服务器的创建与销毁,它的主要作用是初始化对象例如加载数据库驱动,连接池的初始化等;加载一些初始化的配置文件如spring的一些内容等;任务调度,如定时器等

    下面演示一下此监听器的用法:

     1 package com.zw.listener;
     2 
     3 import javax.servlet.ServletContextEvent;
     4 import javax.servlet.ServletContextListener;
     5 
     6 public class MyServletContextListener implements ServletContextListener {
     7 
     8     @Override
     9     public void contextDestroyed(ServletContextEvent sce) {
    10         System.out.println("ServletContext被创建了");
    11     }
    12 
    13     @Override
    14     public void contextInitialized(ServletContextEvent sce) {
    15         System.out.println("ServletContext被销毁了");
    16     }
    17 
    18 }
    创建监听器
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://java.sun.com/xml/ns/javaee"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     5     id="WebApp_ID" version="2.5">
     6     <display-name>ListenerDemo</display-name>
     7     <welcome-file-list>
     8         <welcome-file>index.html</welcome-file>
     9         <welcome-file>index.htm</welcome-file>
    10         <welcome-file>index.jsp</welcome-file>
    11         <welcome-file>default.html</welcome-file>
    12         <welcome-file>default.htm</welcome-file>
    13         <welcome-file>default.jsp</welcome-file>
    14     </welcome-file-list>
    15     <listener>
    16         <listener-class>com.zw.listener.MyServletContextListener</listener-class>
    17     </listener>
    18 </web-app>
    注册监听器

          B,ServletContextAttributeListener监听器

        

     1 package com.zw.listener;
     2 
     3 import javax.servlet.ServletContextAttributeEvent;
     4 import javax.servlet.ServletContextAttributeListener;
     5 
     6 public class MyServletContextAttributeListener implements ServletContextAttributeListener {
     7 
     8     @Override
     9     public void attributeAdded(ServletContextAttributeEvent scae) {
    10         System.out.println(scae.getServletContext().getServletContextName() + "被添加了属性");
    11     }
    12 
    13     @Override
    14     public void attributeRemoved(ServletContextAttributeEvent scae) {
    15         System.out.println(scae.getServletContext().getServletContextName() + "被移除了属性");
    16     }
    17 
    18     @Override
    19     public void attributeReplaced(ServletContextAttributeEvent scae) {
    20         System.out.println(scae.getServletContext().getServletContextName() + "被修改了属性");
    21     }
    22 
    23 }
    创建监听器
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://java.sun.com/xml/ns/javaee"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     5     id="WebApp_ID" version="2.5">
     6     <display-name>ListenerDemo</display-name>
     7     <welcome-file-list>
     8         <welcome-file>index.html</welcome-file>
     9         <welcome-file>index.htm</welcome-file>
    10         <welcome-file>index.jsp</welcome-file>
    11         <welcome-file>default.html</welcome-file>
    12         <welcome-file>default.htm</welcome-file>
    13         <welcome-file>default.jsp</welcome-file>
    14     </welcome-file-list>
    15     <listener>
    16         <listener-class>com.zw.listener.MyServletContextListener</listener-class>
    17     </listener>
    18     <listener>
    19         <listener-class>com.zw.listener.MyServletContextAttributeListener</listener-class>
    20     </listener>
    21     <servlet>
    22         <servlet-name>servletDemo1</servlet-name>
    23         <servlet-class>com.zw.servlet.ServletDemo</servlet-class>
    24     </servlet>
    25     <servlet-mapping>
    26         <servlet-name>servletDemo1</servlet-name>
    27         <url-pattern>/servlet1</url-pattern>
    28     </servlet-mapping>
    29 </web-app>
    注册监听器
     1 package com.zw.servlet;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletContext;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 public class ServletDemo extends HttpServlet {
    12 
    13     @Override
    14     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15         ServletContext servletContext = req.getServletContext();
    16         servletContext.setAttribute("name", "张三");
    17         servletContext.setAttribute("name", "李四");
    18         servletContext.removeAttribute("name");
    19     }
    20 
    21     @Override
    22     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    23 
    24         doGet(req, resp);
    25     }
    26 
    27 }
    为ServletContext改变属性状态

           另外两个监听对象属性状态的监听器的实现方式与此相同,以下不再演示

        2,HttpSession域对象的监听器

      HttpSessioinListener监听器用来监听Session的创建与销毁,其操作方法是实现此接口然后实现其中的方法,注册监听器当访问一个JSP页面时有Session被创建,此监听器内创建Session的方法被调用;当Session过期或被销毁则此监听器Sessioni销毁的方法被调用。

      3,ServletRequest域对象的监听器

        ServletRequestListener监听器用来监听每一次请求调用请求创建时的方法,当请求结束时,调用销毁的方法;操作方法也是实现此接口,实现其中的方法,然后注册监听器。

    二,其它监听器

      与Session中绑定的对象相关的监听器(对象感知监听器),该监听器分为两大类,四种状态

        A:HttpSessionBindingLinstener此监听器监听将对象绑定到Session中与将对象从Session中解顷的事件

        B:HttpSessionActivationLinstener此监听器可将Session中的对象钝化到硬盘上以及从硬盘上读取Session中的对象

      这两种监听器不需要注册,直接用一个类实现这两个接口,实现其中的方法即可。

      HttpSessionBindingLinstener监听器演示如下:

     1 package com.zw.listener;
     2 
     3 import javax.servlet.http.HttpSessionBindingEvent;
     4 import javax.servlet.http.HttpSessionBindingListener;
     5 
     6 public class Student implements HttpSessionBindingListener {
     7 
     8     @Override
     9     public void valueBound(HttpSessionBindingEvent event) {
    10 
    11         System.out.println("Student被绑定到Session中了");
    12     }
    13 
    14     @Override
    15     public void valueUnbound(HttpSessionBindingEvent event) {
    16         System.out.println("Student从Session中解绑了");
    17     }
    18 
    19 }
    HttpSessionBindingLinstener

     此时,把Student这个对象添加到Session中便全触被绑定的方法,当remove时便全触发解绑的方法

         HttpSessionActivationListener监听器演示如下:

     1 package com.zw.listener;
     2 
     3 import java.io.Serializable;
     4 
     5 import javax.servlet.http.HttpSessionActivationListener;
     6 import javax.servlet.http.HttpSessionBindingEvent;
     7 import javax.servlet.http.HttpSessionBindingListener;
     8 import javax.servlet.http.HttpSessionEvent;
     9 
    10 public class Student implements HttpSessionActivationListener, Serializable {
    11 
    12     @Override
    13     public void sessionDidActivate(HttpSessionEvent se) {
    14         System.out.println("Student被活化了");
    15     }
    16 
    17     @Override
    18     public void sessionWillPassivate(HttpSessionEvent se) {
    19         System.out.println("Student被钝化了");
    20     }
    21 
    22 }
    HttpSessionActivationListener

    此监听器监听的对象需要实现序列化接口,因为需要被存储到硬盘上,以上操作当Student被放入Sessioni中,服务器停止时便把Student对象存储到了硬盘上,当重新启动服务器时,Session中的Student便被活化了

    但是钝化与活化Session里的对象,不能总停止与启动服务器,可通过配置文件指定Session多久没有操作便钝化,当用户再次使用程序时活化Session,具体操作如下:

    1,在META-INF文件下创建context.xml文件,此文件名固定,此文件中的内容如下

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <Context>
    3     <!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
    4     <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 -->
    5     <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
    6         <Store className="org.apache.catalina.session.FileStore"
    7             directory="zw205" />
    8     </Manager>
    9 </Context>
    context.xml

    此时经过一分钟不操作,Session中的对象便被钝化到指定的目录下了,再次操作时是从此文件内拿Session中的对象的

  • 相关阅读:
    基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
    基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则
    基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则
    基于ABP落地领域驱动设计-01.全景图
    Es6-find&map&filter&reduce
    vue之监听事件
    list map互相转换
    springcloud 返回实体类忽略属性
    Apache NetBeans IDE 12.3 双击无反应怪事
    前端--- 前端调试经验总结
  • 原文地址:https://www.cnblogs.com/zw971084570/p/10471263.html
Copyright © 2011-2022 走看看