【java】Listener --- 监听器

1. 什么是Listener

监听器就是监听某个对象的的状态变化的组件

  • 监听器的相关概念:

    • 事件源:被监听的对象
    • 包括三个域对象 request session servletContext
    • 监听器:监听事件源对象,事件源对象的状态的变化都会触发监听器
    • 注册监听器:将监听器与事件源进行绑定(就是在web.xml文件配置监视器,部分监听不需要配置)
    • 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码
  • 事件监听机制

    • 事件 :一件事情
    • 事件源 :事件发生的地方
    • 监听器 :一个对象
    • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

2. 监听器的种类

  • 按照被监听的对象划分:ServletRequest域 HttpSession域 ​ServletContext域
  • 监听的内容分:监听域对象的创建与销毁的 监听域对象的属性变​化的
ServletContext域 HttpSession域 ServletRequest域
域对象的创建于销毁 servletContextListener HttpSessionListener ServletRequestListener
域对象内的属性的变化 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener

3. 监听ServletContext对象的创建和销毁

  • 方法:
* void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
* void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
  • 步骤:
    1. 定义一个类,实现ServletContextListener接口
    2. 复写方法
    3. 配置
web.xml
* 指定初始化参数<context-param>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 配置监听器 -->
    <listener>
        <listener-class>cn.siyi.web.listener.ContextLoaderListener</listener-class>
    </listener>
    <!-- 指定初始化参数 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
    </context-param>
</web-app>
  • 当然不使用web.xml配置也行,可以直接使用注解
@WebListener

4. 例子

package cn.siyi.web.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

@WebListener
public class ContextLoaderListener implements ServletContextListener {
    /**
     * 监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建
     *
     * 在服务器启动后自动调用
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //加载资源文件
        //1.获取ServletContext对象
        ServletContext servletContext = servletContextEvent.getServletContext();
        //2.加载资源文件
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        //3.获取真实路径
        String realPath = servletContext.getRealPath(contextConfigLocation);
        //4.加载进内存
        try {
            FileInputStream fis = new FileInputStream(realPath);
            System.out.println(fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("ServletContext对象被创建了。。。");
    }

    /**
     * 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用
     * @param servletContextEvent
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServleyContext对象被销毁了。。。");
    }
}
发布了361 篇原创文章 · 获赞 127 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41879343/article/details/104025092