zoukankan      html  css  js  c++  java
  • JavaWeb 之 Listener:监听器

    一、监听

      1、事件监听机制

        •  事件:        一件事情
        •  事件源:    事件发生的地方
        •  监听器:    一个对象
        •  注册监听: 将事件、事件源、监听器绑定在一起。

      2、监听器概念

         当事件源上发生某个事件后,执行监听器代码。

         监听器的作用是,监听某种事物的变化。 然后通过回调函数, 反馈给客户(程序) 去做一些相应的处理 

    二、Listener 

      1、概述

        Listener 用于监听 JavaWeb 程序中的事件。(如:ServletContext、HttpSession、ServletRequest的创建、修改和删除)

        Listener 它是 JavaEE 的规范,就是接口。

        监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

        在 JavaWeb 中,可以为某些事件来设置监听器,当事件被触发时,监听器中的指定方法会被调用。

          扩展:Servlet程序、Filter 过滤器 和 Listener 监听器 并称 WEB 的三大组件。

      2、观察者模式

        Listener 的原理是基于观察者模式的,所谓的观察者模式简单来说,就是当被观察者的特定事件被触发(一般在某些方法被调用后),会通知观察者(调用观察者的方法),观察者可以在自己的的方法中来对事件做一些处理。

        在 JavaWeb 中,观察者就是 Listener,而被观察者可能有三个 ServletContext、HTTPSession、ServletRequest,而事件指的就是这些对象的创建、修改和删除等。

        JavaWeb 中一共三类11个监听器。

    二、ServletContextListener 监听器

      1、概述

        ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。

        ServletContext 对象在 web 工程启动的时候创建, 在 web 工程停止的时候销毁。

        监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。

      1、常用方法:

    public interface ServletContextListener extends EventListener {
      
    /**   * 在 ServletContext 对象创建之后马上调用,做初始化   */   public void contextInitialized(ServletContextEvent sce);
      
    /**   * 在 ServletContext 对象销毁之前调用   */   public void contextDestroyed(ServletContextEvent sce);   }

      2、使用ServletContextListener 监听器监听 ServletContext 对象。

          使用步骤:

        (1)定义一个类,实现 ServletContextListener接口

        (2)实现两个回调方法

        (3)配置

          ① web.xml方式:配置类的全类名即可。

    <!-- 配置监听器 -->
    <listener> <listener-class>cn.ks.web.listener.ContextLoaderListener</listener-class> </listener>

          ② 注解方式:在类上添加 @WebListener 即可。

      3、 监听器实现

        (1)监听器实现类

     1 public class MyServletContextListenerImpl implements ServletContextListener {
     2 
     3     @Override
     4     public void contextInitialized(ServletContextEvent sce) {
     5         System.out.println("ServletContext对象被创建了");
     6     }
     7 
     8     @Override
     9     public void contextDestroyed(ServletContextEvent sce) {
    10         System.out.println("ServletContext对象被销毁了");
    11     }
    12 }

        (2)web.xml 中的配置

    1 <!--配置监听器-->
    2 <listener>
    3 <listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
    4 </listener>

    三、从指定文件找那个加载数据案例

      创建一个类实现 ServletContextListener 接口

     1 import javax.servlet.ServletContext;
     2 import javax.servlet.ServletContextEvent;
     3 import javax.servlet.ServletContextListener;
     4 import javax.servlet.annotation.WebListener;
     5 import java.io.FileInputStream;
     6 
     7 
     8 @WebListener
     9 public class ContextLoaderListener implements ServletContextListener {
    10 
    11     /**
    12      * 监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建。
    13      *
    14      * 在服务器启动后自动调用
    15      * @param servletContextEvent
    16      */
    17     @Override
    18     public void contextInitialized(ServletContextEvent servletContextEvent) {
    19         //加载资源文件
    20         //1.获取ServletContext对象
    21         ServletContext servletContext = servletContextEvent.getServletContext();
    22 
    23         //2.加载资源文件:从下面的 web.xml中根据键获取对应的值(获取配置文件的位置)
    24         String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation"); 
    25 
    26         //3.获取真实路径
    27         String realPath = servletContext.getRealPath(contextConfigLocation);
    28 
    29         //4.加载进内存
    30         try{
    31             FileInputStream fis = new FileInputStream(realPath);
    32             System.out.println(fis);
    33         }catch (Exception e){
    34             e.printStackTrace();
    35         }
    36         System.out.println("ServletContext对象被创建了。。。");
    37     }
    38 
    39     /**
    40      * 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用
    41      * @param servletContextEvent
    42      */
    43     @Override
    44     public void contextDestroyed(ServletContextEvent servletContextEvent) {
    45         System.out.println("ServletContext对象被销毁了。。。");
    46     }
    47 }

      在 web.xml 中指定初始化参数位置:

    1  <!-- 指定初始化参数 -->
    2    <context-param>
    3       <param-name>contextConfigLocation</param-name>
    4       <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
    5    </context-param>

     

  • 相关阅读:
    洛谷P1023 税收与补贴问题
    洛谷P2680 运输计划
    2014-11-3 NOIP模拟赛3
    一行Python代码就可以玩一些童年小游戏
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象
    Electron中打开和关闭子窗口以及子窗口向父窗口传值
    Electron中实现通过webview实现内嵌网页并嵌入css样式和js脚本等
    Electron中实现拖拽文件进div中通过File对象获取文件的路径和内容
    Electron中通过process进程对象的api获取CPU、系统位数、环境变量等相关信息
  • 原文地址:https://www.cnblogs.com/niujifei/p/15117335.html
Copyright © 2011-2022 走看看