概述- 使用监听器实现定时发送生日祝福
- 这些都是框架底层的代码,以后很少会用到,我们很少自己写框架
listener监听器Listener- javaEE包括13门规范,在课程中主要学习servlet技术和jsp技术
- 其中servlet规范包括三个技术点:servlet ,listener ,filter
什么是监听器- 监听器就是监听某个对象的的状态变化的组件
- 监听器的相关概念
- 事件源:被监听的对象-----三个域对象request,session,servletContext
- 监听器:监听事件源对象,事件源对象的状态的变化都会触发监听器
- 注册监听器:将监听器与事件源进行绑定
- 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码----程序员编写代码
监听器有哪些- 监听器有8个(6+2),尽量都记住,不用记住api,用的时候通过ide点出来就好
- 第一维度:按照被监听的对象划分:ServletRequest域HttpSession域,ServletContext域
- 第二维度:监听的内容分:监听域对象的创建与销毁的,监听域对象的属性变化的
- 每个域对象的创建与销毁以及属性变化3 * 2 = 6
- ServletContextListener(用的比较多)
- ServletContextAttributeListener
- HttpSessionListener
- HttpSessionAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
监听三大域对象的创建与销毁的监听器- 监听ServletContext域的创建与销毁的监听器:ServletContextListener
- ServletContext域的生命周期
- 监听器的编写步骤(重点)
- 编写一个监听器类去实现监听器接口
- 覆盖监听器的方法
- 需要在web.xml中进行配置---注册监听
- ServletContextListener监听器的主要作用
- 初始化的工作:初始化对象,初始化数据--加载数据库驱动,连接池的初始化
- 加载一些初始化的配置文件 --- spring的配置文件
- 任务调度----定时器----Timer/TimerTask
- 监听器中可以获得被监听的对象
- web工程一启动就去加载监听中的配置
- Timer & TimerTask:
- 这是java原生的api,后面需要学习一个小框架做任务调度
[XML] 纯文本查看 复制代码 <!--web.xml 注册监听器-->
<listener>
<listener-class>com.itcast.listener.MyListener</listener-class>
</listener>
[XML] 纯文本查看 复制代码 //重写接口的方法
public void contextDestroyed(ServletContextEvent sce) {
//就是被监听的对象---ServletContext
ServletContext servletContext = sce.getServletContext();
//getSource就是被监听的对象,是通用的方法
ServletContext source = (ServletContext) sce.getSource();
}
public void contextInitialized(ServletContextEvent sce) {}
[Java] 纯文本查看 复制代码 public void contextInitialized(ServletContextEvent sce) {
SimpleDateFormat dateFormart = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat timeParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
StringBuilder sb = new StringBuilder();
String currentDate = dateFormart.format(new Date());//获取当前年月日
String startTimeStr = sb.append(currentDate).append(" 23:59:59").toString();
Date startTime = null;
try {
startTime = timeParser.parse(startTimeStr);
} catch (ParseException e) {
e.printStackTrace();
}
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("开始计算利息了");
}
}, startTime, 24*60*60*1000);
}
- 监听Httpsession域的创建于销毁的监听器HttpSessionListener
- HttpSession对象的生命周期
- 何时创建:第一次调用request.getSession时创建
- 何时销毁:服务器关闭销毁,session过期,手动销毁
- session的生命周期比监听器重要
- HttpSessionListener的方法
- sessionCreated
- sessionDestroyed
- jsp的page指令默认创建session
- 作用: (现在基本不用)记录网站有多少人次访问过
- 监听ServletRequest域创建与销毁的监听器ServletRequestListener
- 这个监听器没用,request生命周期太短
- ServletRequest的生命周期
- 创建:每一次请求都会创建request
- 销毁:请求结束
- ServletRequestListener的方法:
监听三大域对象的属性变化的(需要注册)- 域对象的通用的方法
- setAttribute(name,value)
- 触发添加属性的监听器的方法
- 触发修改属性的监听器的方法
- getAttribute(name)
- removeAttribute(name)
- ServletContextAttibuteListener监听器
[Java] 纯文本查看 复制代码 @Override
public void attributeAdded(ServletContextAttributeEvent scab) {
//放到域中的属性
System.out.println(scab.getName());//放到域中的name
System.out.println(scab.getValue());//放到域中的value
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scab) {
System.out.println(scab.getName());//删除的域中的name
System.out.println(scab.getValue());//删除的域中的value
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scab) {
System.out.println(scab.getName());//获得修改前的name
System.out.println(scab.getValue());//获得修改前的value
}
- HttpSessionAttributeListener监听器(同上)
- ServletRequestAriibuteListenr监听器(同上)
与session中的绑定的对象相关的监听器(对象感知监听器)- 即将要被绑定到session中的对象有几种状态
- 绑定状态:就一个对象被放到session域中
- 解绑状态:就是这个对象从session域中移除了
- 钝化状态:是将session内存中的对象持久化(序列化)到磁盘
- 活化状态:就是将磁盘上的对象再次恢复到session内存中
- 绑定与解绑的监听器HttpSessionBindingListener
- 面试题:当用户很多时,怎样对服务器进行优化
- session的钝化与活化(对象同时需要实现Serializable接口)
- 钝化:服务器关闭
- 活化:服务器再启动
- 或者通过配置文件设置session多久不用就钝化到磁盘中
- 钝化与活化的监听器HttpSessionActivationListener
- 可以通过配置文件指定对象钝化时间,对象多长时间不用被钝化在META-INF下创建一个context.xml
[XML] 纯文本查看 复制代码 <Context>
<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"><!--时间1分钟-->
<Store className="org.apache.catalina.session.FileStore" directory="itcast205" /><!--写到哪个目录里(文件夹名,在work目录下)-->
</Manager>
</Context>
|