一、监听

  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>

 

 

 

 

posted on 2021-08-09 09:56  格物致知_Tony  阅读(289)  评论(0编辑  收藏  举报