【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对象创建后会调用该方法
- 步骤:
- 定义一个类,实现ServletContextListener接口
- 复写方法
- 配置
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对象被销毁了。。。");
}
}