一、Listener(监听器)
监听某一个事件发生、状态改变
监听器内部机制:接口回调
接口回调
- 需求:
A在执行循环,当循环到5的时候,通知B。
事先先把一个对象传递给A—当A执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。(所以叫接口回调)
就相当于我现在有个A类,但是具体循环之后怎么走的类我现在没有,保不准以后会有,所以我需要写一个接口传给a类一个对象,然后有B类的时候就可以实现接口,然后传递接口实例对象。
test类调用a,a去找b(继承接口):
二、8个Web监听器(JSP四个作用域)#
其中三个作用域(JSP共四个)
request ---httpServletRequest
session ---httpSession
aapplication ---ServletContext
监听器三种类型
1 | 1. 监听三个作用域创建和销毁(3个) |
使用步骤
1. 定义类,实现对应接口(自动给两个方法)
2. 注册 | 配置监听器
三、 监听三个作用域创建和销毁
1. ServletContextListener
servletcontext创建:
1. 启动服务器的时候
servletContext销毁:
2. 关闭服务器. 从服务器移除项目
- 1. 定义一个类,实现ServletContextListener接口(自动给两个方法)
1 | public class MyServletContextListener implements ServletContextListener { |
- 2. Web.xml文件中注册 | 配置监听器
1 | <listener> |
点击控制栏Servers中红框
控制台输出结果:
2. ServletRequestListener
request创建:
访问服务器上的任意资源都会有请求出现。
访问 html: 会
访问 jsp: 会
访问 servlet : 会
request销毁:
服务器已经对这次请求作出了响应。(打开页面并且刷新一次)
- 1. 定义类,实现对应接口(自动给两个方法)
1 | public class MyRequestListener implements ServletRequestListener { |
- 2. web.xml文件内注册 | 配置监听器
1 | <listener> |
- 3.分别建立jsp、h5、servlet文件打开浏览器刷新
1 | 之后就会在控制台输出初始化和销毁的提示! |
3. HttpSessionListener
session的创建:
只要调用getSession
html: 不会
jsp: 会 getSession();
servlet: 会
session的销毁:
1.超时 30分钟(默认时间)
2.非正常关闭 销毁
3.正常关闭服务器(序列化)
- 1. 定义类,实现对应接口(自动给两个方法)
1 | public class MySessionListener implements HttpSessionListener { |
- 2. web.xml文件内注册 | 配置监听器
1 | <listener> |
##4. 三个监听器作用 ##
1.ServletContextListener
利用它来,在servletcontext创建的时候,
1. 完成自己想要的初始化工作
2. 执行自定义任务调度。 执行某一个任务。 Timer
2.HttpSessionListener
统计在线人数(一个回合就是session)
四、 监听三个作用域属性状态变更
可以监听在作用域中值—添加|替换|移除动作。
1. ServletContextAttributeListener
2. ServletRequestAttributeListener
3. HttpSessionAttributeListener
4. 以HttpSessionAttributeListener为例#
- 1. 建立类实现对应接口(自动三个方法)
1 | public class MyHttpSession implements HttpSessionAttributeListener { |
- 2. web.xml文件配置
1 | <listener> |
- 3. 新建jsp页面
1 | <% |
运行jsp页面 然后刷新:
五、 监听httpSession里面存值的状态变更
这一类监听器不用注册。(直接继承即可)
1. HttpSessionBindingListener
- 1.让javaBean 实现该接口即可
1 | public class Bean01 implements HttpSessionBindingListener{ |
2. HttpSessionActivationListener(激活)
用于监听session的值
- 1.钝化 (序列化)
把内存中的数据 存储 到硬盘
- 2.活化 (反序列化)
把硬盘中的数据 读取 到内存
- 1.让javaBean 实现该接口即可
1 | public class Bean01 implements HttpSessionActivationListener{ |
3. 钝化活化作用
session中的值可能会很多,并且我们有很长一段时间不使用这个内存中的值,那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】
4. 设置钝化时间(配置)
1.在tomcat里面 conf/context.xml 里面配置
对所有的运行在这个服务器的项目生效
2.在conf/Catalina/localhost/context.xml 配置
对 localhost生效。 localhost:8080
3.在自己的web工程项目中的 META-INF/context.xml
只对当前的工程生效。(一般在这设置,因为项目的目录不同)
配置代码:
1 | <Context> |
**maxIdleSwap** : 1分钟不用就钝化
**directory**: 钝化后的那个文件存放的目录位置。
例如:F:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\项目名\文件名