likes
comments
collection
share

深入了解过滤器、监听器(下)

作者站长头像
站长
· 阅读数 64

第八章 监听器概述

8.1 作用:

监听作用域(请求域,会话域,上下文域)中发生的各种事件,并且对事件做出响应。

1)域对象的创建和销毁
2)域对象中属性添加、删除和修改

8.2 监听器的接口分类

事件源监听器接口时机
ServletContextServletContextListener上下文域创建和销毁
ServletContextServletContextAttributeListener上下文域属性增删改的操作
HttpSessionHttpSessionListener会话域创建和销毁
HttpSessionHttpSessionAttributeListener会话域属性增删改的操作
HttpServletRequestServletRequestListener请求域创建和销毁
HttpServletRequestServletRequestAttributeListener请求域属性增删改的操作

说明:

1.我们只演示最经常使用的监听器ServletContextListener,其余监听器不经常使用,如果使用,使用方式都一样。

第九章 ServletContextListener

9.1概述

【1】作用:

用于监听上下文域ServletContext的创建和销毁

【2】ServletContext运行时机:

a)创建:Web服务器启动,加载项目的时候
b)销毁:Web项目关闭的时候

【3】接口中的方法:

接口中的方法功能
void contextDestroyed(ServletContextEvent sce)上下文域销毁的时候执行1次
void contextInitialized(ServletContextEvent sce)上下文域初始化的时候执行1次

说明:上述方法参数都有一个ServletContextEvent 事件类,可以调用该类中的方法获取域对象ServletContext

ServletContextEvent中的方法
ServletContextEvent中的方法功能
ServletContext getServletContext()得到上下文对象

9.2 监听器开发步骤:

1)编写一个类,实现ServletContextListener监听器的接口
2)重写接口中所有的方法
3)在web.xml中配置listener,或者使用注解@WebListener

【代码实现】

监听器:

public class ContextDemoListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("监听器:ServletContext对象创建了。。。。。");
        /*
            ServletContext对象创建完成:表示tomcat启动完成。
            我们可以加载配置文件(连接池)
         */
        ServletContext servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute("dataSource","连接池");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("监听器:ServletContext对象销毁了。。。。。");
    }
}

说明:对于监听器使用描述:

ServletContext对象创建完成:表示tomcat启动完成。在实际开发中我们可以在监听器的初始化方法contextInitialized中书写加载配置文件,获取连接池。然后存储到ServletContext域对象中,当前项目其他的servlet就可以使用了。

web.xml注册监听器:

告知tomcat服务器具有监听器。

 <!--注册监听器-->
    <listener>
        <listener-class>com.ita.listener.demo02.ContextDemoListener</listener-class>
    </listener>

使用注解注册监听器:

直接在监听器上面添加注解@WebListener即可。

@WebListener
public class ContextDemoListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("监听器:ServletContext对象创建了。。。。。");
        /*
            ServletContext对象创建完成:表示tomcat启动完成。
            我们可以加载配置文件(连接池)
         */
        ServletContext servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute("dataSource","连接池");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("监听器:ServletContext对象销毁了。。。。。");

    }
}

第十章 ServletContextListener的应用

案例:模拟spring框架

需求:可以在项目启动时读取配置文件。

web.xml

<?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_3_1.xsd"
         version="3.1">
    
    <!--全局配置参数-->
    <context-param>
        <param-name>configLocation</param-name>
        <param-value>words.properties</param-value>
    </context-param>
</web-app>

监听器代码:

@WebListener
public class MyListener implements ServletContextListener {

    // 监听ServletContext创建
    /*
        ServletContextEvent 上下文事件对象,获取ServletContext
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext已经创建了...");

        // 通过servletContextEvent获取上下文对象
        ServletContext servletContext = servletContextEvent.getServletContext();
        // 我可以去加载公司定义配置文件的名称....
        String configLocation = servletContext.getInitParameter("configLocation");
        System.out.println("动态获取配置文件名称:" + configLocation);
    }

    // 监听ServletContext销毁
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext已经销毁了....");
    }
}
转载自:https://juejin.cn/post/7243060470864134200
评论
请登录