[TOC]
# 什么是监听器?
监听器就是监听某个对象的的状态变化的组件
监听器的相关概念:
事件源:被监听的对象 ----- 三个域对象 request session servletContext
监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 ---- 6+2
注册监听器:将监听器与事件源进行绑定
响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 程序员编写代码
# 监听器有哪些?
第一维度:按照被监听的对象划分:ServletRequest域 HttpSession域 ServletContext域
第二维度:监听的内容分:监听域对象的创建与销毁的 监听域对象的属性变化的
![](https://box.kancloud.cn/94b499211db950c1af7080b77b69f063_1840x236.png)
# 监听三大域对象的创建与销毁的监听器
## 监听ServletContext域的创建与销毁的监听器ServletContextListener
1)Servlet域的生命周期
何时创建:服务器启动创建
何时销毁:服务器关闭销毁
2)监听器的编写步骤:
a、编写一个监听器类去实现监听器接口
b、覆盖监听器的方法
c、需要在web.xml中进行配置---注册
3)监听的方法
写个自定义的MyServletContextListener类实现ServletContextListener就可以
~~~
package mytest;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
//获取被监听的对象
ServletContext servletContext = arg0.getServletContext();
//和上面一样,不过类型是Object,是通用的方法
Object source = arg0.getSource();
System.out.println("ServletContext销毁了");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("ServletContext创建了");
}
}
~~~
4)配置文件:
~~~
<!-- 注册监听器 -->
<listener>
<listener-class>mytest.MyServletContextListener</listener-class>
</listener>
~~~
5)ServletContextListener监听器的主要作用
a、初始化的工作:初始化对象 初始化数据 ---- 加载数据库驱动 连接池的初始 化
b、加载一些初始化的配置文件 --- spring的配置文件
c、任务调度----定时器----Timer/TimerTask
~~~
// 开启一个任务调度器 util包下的
Timer timer = new Timer();
// task任务 firstTimer:第一次执行时间 period:间隔执行时间
// timer.schedule(task, firstTime, period);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("定时任务---");
}
}, new Date(), 5000);// 5秒钟
~~~
## 监听Httpsession域的创建于销毁的监听器HttpSessionListener
1)HttpSession对象的生命周期
何时创建:第一次调用request.getSession时创建
何时销毁:服务器关闭销毁 session过期 手动销毁
2)HttpSessionListener的方法
![](https://box.kancloud.cn/d5add14542fcd1bb7445804fb32b7e2e_441x203.png)
## 监听ServletRequest域创建与销毁的监听器ServletRequestListener
1)ServletRequest的生命周期
创建:每一次请求都会创建request
销毁:请求结束
2)ServletRequestListener的方法
![](https://box.kancloud.cn/da95c049de5d631b8c19593a2c7f0772_462x183.png)
# 监听三大域对象的属性变化的
(1)域对象的通用的方法:
setAttribute(name,value)
--- 触发添加属性的监听器的方法
--- 触发修改属性的监听器的方法
getAttribute(name)
removeAttribute(name)
--- 触发删除属性的监听器的方法
(2)ServletContextAttibuteListener监听器
![](https://box.kancloud.cn/a76bf0d103a4b2ec3ce3a3ff42c543bf_529x250.png)
(3) HttpSessionAttributeListener监听器(同上)
(4) ServletRequestAriibuteListenr监听器(同上)
# session中的绑定的对象相关的监听器(对象感知监听器)
一个对象要钝化,要实现序列化接口,
那个对象放到session中需要某个功能就需要实现下面的监听器的接口
(1)即将要被绑定到session中的对象有几种状态
绑定状态:就一个对象被放到session域中
解绑状态:就是这个对象从session域中移除了
钝化状态:是将session内存中的对象持久化(序列化)到磁盘
活化状态:就是将磁盘上的对象再次恢复到session内存中
(2)绑定与解绑的监听器HttpSessionBindingListener
![](https://box.kancloud.cn/e1e2b36e7e80a67743eb1c051c3ca6e9_456x227.png)
(3)钝化与活化的监听器HttpSessionActivationListener
可以通过配置文件 指定对象钝化时间 --- 对象多长时间不用被钝化
在META-INF下创建一个context.xml
![](https://box.kancloud.cn/5bbb07ba04cfcb207ced09c9cd389654_204x97.png)
~~~
<Context>
<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="study" />
</Manager>
</Context>
~~~
![](https://box.kancloud.cn/200bdf7f64ef8558491a4882091b9125_463x172.png)
- 基础
- 编译和安装
- scanner类(键盘录入)
- Random类(随机数)
- 数组
- 方法
- 类
- ArrayList集合
- char与int
- eclipse
- IDEA
- 变量与常量
- 常用API
- String,StringBuffer,StringBuilder
- 正则,Date,DateFormat,Calendar
- 包装类,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增强for,泛型
- List,set,判断集合唯一
- map,Entry,HashMap,Collections
- 异常
- IO
- File
- 递归
- 字节流
- 字符流
- IO流分类
- 转换流
- 缓冲流
- 流的操作规律
- properties
- 序列化流与反序列化流
- 打印流
- commons-IO
- IO流总结
- 多线程
- 线程池
- 线程安全
- 线程同步
- 死锁
- lock接口
- ThreadLoad
- 等待唤醒机制
- 线程状态
- jdbc
- DBUtils
- 连接池DBCP
- c3p0连接池
- 网络编程
- 多线程socket上传图片
- 反射
- xml
- 设计模式
- 装饰器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事务
- 监听器Listener
- 过滤器Filter
- json
- linux安装软件
- 反射详解
- 类加载器和注解
- 动态代理
- jedis
- Hibernate
- 简介
- 创建映射文件
- Hibernate核心配置文件
- 事务和增删改查
- HibernateUtils
- 持久化对象的三种状态
- 检索方式
- query
- Criteria
- SQLQuery
- 持久化类
- 主键生成策略
- 缓存
- 事务管理
- 关系映射
- 注解
- 优化
- struts2
- 搭建
- 配置详解
- Action
- 结果跳转方式
- 访问ServletAPI方式
- 如何获得参数
- OGNL表达式
- valueStack 值栈
- Interceptor拦截器
- spring
- 导包
- IOC和DI
- Bean获取与实例化
- Bean属性注入
- spring注解
- 注解分层
- junit整合
- aop
- 动态代理实现
- cglib代理实现
- aop名词
- spring的aop
- aop-xml详解
- aop-注解详解
- 代理方式选择
- jdbcTemplate
- spring事务管理
- 回滚注意
- 事务传播属性
- MyBatis
- MyBatis简介
- 入门程序
- 与jdbc hibernate不同
- 原始Dao开发
- Mapper动态代理方式
- SqlMapConfig.xml配置文件
- 输入参数pojo包装类
- resultMap
- 动态sql
- 一对一关联
- 一对多
- 整合spring
- 逆向工程
- maven
- maven简介
- 仓库
- maven目录结构
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入门程序
- 整合struct
- 依赖范围
- 添加插件
- idea配置
- jar包冲突
- 分模块开发
- 构建可执行的jar包(包含依赖jar包)
- springMVC
- 处理流程
- java面试
- java版本升级
- java1-8版本变更
- java9新特性
- 锁
- java资料
- idea
- jdk版本切换
- log4j
- 入门实例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代码优化