目录
概述
监听器就是监听某个对象的状态变化的组件
- 监听的事件源 -->三个域对象 request session servletContext
- 监听器监听事件源--> 事件源对象的属性变化都会出发监听器
- 注册监听器--> 将将监听器与事件源绑定起来
- 相应行为--> 监听到事件源状态变化时做出的功能代码
- 监听器按照被监听的对象分为 三个域 request session servletContext
- 监听器按照被监听的内容分为 监听域对象的创建和销毁 监听域对象的属性的变化
监听三大域对象创建与销毁的监听器
servletContext域的创建与销毁监听器 ServletContextListener
- Servlet的生命周期 服务启动时创建,服务关闭时销毁
- 监听器的编写步骤
- 编写一个监听器类去实现监听器接口
- 覆盖监听器的方法
- 需要在web.xml中配置-->注册
- 监听器作用
- 初始化工作:初始化对象,初始化数据
- 加载一下初始化的配置文件 -- spring的配置文件
- 任务调度 定时器
项目结构:
监听器位置
web.xml位置
监听器实现类代码
package cn.bufanli.CreateContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @author BuShuangLi
* @date 2019/1/2
* context域创建与销毁监听器
*/
public class MyServletContextListener implements ServletContextListener {
/**
* 监听context的创建方法
* @param servletContextEvent 事件源相关对象
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//被监听的对象 -- ServletContext
ServletContext servletContext = servletContextEvent.getServletContext();
//被监听的对象 通用方法
Object source = servletContextEvent.getSource();
System.out.println("context创建了");
}
/**
* 监听context销毁方法
* @param servletContextEvent
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("context销毁了");
}
}
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_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--注册监听器-->
<listener>
<listener-class>cn.bufanli.CreateContext.MyServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>cn.bufanli.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/servletDemo</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletImages</servlet-name>
<servlet-class>cn.bufanli.ServletImages</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletImages</servlet-name>
<url-pattern>/servletImages</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CheckServlet</servlet-name>
<servlet-class>cn.bufanli.CheckServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CheckServlet</servlet-name>
<url-pattern>/checkServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>cn.bufanli.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/downloadServlet</url-pattern>
</servlet-mapping>
</web-app>
httpSession域的创建与销毁....套路是一个样子
监听三大域对象的属性变化
package cn.bufanli.attribute;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
* @author BuShuangLi
* @date 2019/1/2
*/
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
/**
* 监听添加的
*
* @param servletContextAttributeEvent
*/
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
//获得添加到Context域中的name
String name = servletContextAttributeEvent.getName();
//获得添加到Context域中的value
Object value = servletContextAttributeEvent.getValue();
}
/**
* 删除
*
* @param servletContextAttributeEvent
*/
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
//获得删除Context域中的name
String name = servletContextAttributeEvent.getName();
//获得删除Context域中的value
Object value = servletContextAttributeEvent.getValue();
}
/**
* 修改前的
*
* @param servletContextAttributeEvent
*/
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
//获得修改前Context域中的name
String name = servletContextAttributeEvent.getName();
//获得修改前Context域中的value
Object value = servletContextAttributeEvent.getValue();
}
}
web.xml 同上,需要配置
<listener>
<listener-class>cn.bufanli.CreateContext.MyServletContextAttributeListener </listener-class>
</listener>
与session中绑定的对象相关的监听器(对象感知监听器)
即将要被session绑定的几种状态:
绑定状态: 对象被放到session域当中
解绑状态: 对象从session域中移除
钝化状态: 将session中的对象序列化到磁盘
活化状态: 将磁盘的对象再恢复到session 内存中
绑定和解绑的监听器(直接绑定到要监听的类当中而且不用在web.xml中配置)
package cn.bufanli.attribute;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* @author BuShuangLi
* @date 2019/1/2
* 注册到要即将绑定到session域中的类
*/
public class Person implements HttpSessionBindingListener {
private String userName;
private String age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Person(String userName, String age) {
this.userName = userName;
this.age = age;
}
/**
* 感知对象被绑定到session域中
* @param httpSessionBindingEvent
*/
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
}
/**
* 感知对象从session域中解绑
* @param httpSessionBindingEvent
*/
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
}
}
钝化与活化监听器
钝化与活化的监听器HttpSessionActivationListener
可以通过配置文件 指定对象钝化时间 --- 对象多长时间不用被钝化
在META-INF下创建一个context.xml
<Context>
<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="ceshi" />
</Manager>
</Context>