深入了解过滤器、监听器(下)
第八章 监听器概述
8.1 作用:
监听作用域(请求域,会话域,上下文域)中发生的各种事件,并且对事件做出响应。
1)域对象的创建和销毁
2)域对象中属性添加、删除和修改
8.2 监听器的接口分类
事件源 | 监听器接口 | 时机 |
---|---|---|
ServletContext | ServletContextListener | 上下文域创建和销毁 |
ServletContext | ServletContextAttributeListener | 上下文域属性增删改的操作 |
HttpSession | HttpSessionListener | 会话域创建和销毁 |
HttpSession | HttpSessionAttributeListener | 会话域属性增删改的操作 |
HttpServletRequest | ServletRequestListener | 请求域创建和销毁 |
HttpServletRequest | ServletRequestAttributeListener | 请求域属性增删改的操作 |
说明:
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