A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余大麻 中级黑马   /  2018-11-15 08:36  /  659 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

概述
  • 使用监听器实现定时发送生日祝福
  • 这些都是框架底层的代码,以后很少会用到,我们很少自己写框架
listener监听器Listener
  • javaEE包括13门规范,在课程中主要学习servlet技术和jsp技术
  • 其中servlet规范包括三个技术点:servlet ,listener ,filter
什么是监听器
  • 监听器就是监听某个对象的的状态变化的组件
  • 监听器的相关概念
    • 事件源:被监听的对象-----三个域对象request,session,servletContext
    • 监听器:监听事件源对象,事件源对象的状态的变化都会触发监听器
      • 6+2 = 8个监听器
    • 注册监听器:将监听器与事件源进行绑定
    • 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码----程序员编写代码

监听器有哪些
  • 监听器有8个(6+2),尽量都记住,不用记住api,用的时候通过ide点出来就好
  • 第一维度:按照被监听的对象划分:ServletRequest域HttpSession域,ServletContext域
  • 第二维度:监听的内容分:监听域对象的创建与销毁的,监听域对象的属性变化的
  • 每个域对象的创建与销毁以及属性变化3 * 2 = 6
    • ServletContextListener(用的比较多)
    • ServletContextAttributeListener
    • HttpSessionListener
    • HttpSessionAttributeListener
    • ServletRequestListener
    • ServletRequestAttributeListener

监听三大域对象的创建与销毁的监听器
  • 监听ServletContext域的创建与销毁的监听器:ServletContextListener
    • ServletContext域的生命周期
      • 何时创建:服务器启动创建
      • 何时销毁:服务器关闭销毁
    • 监听器的编写步骤(重点)
      • 编写一个监听器类去实现监听器接口
      • 覆盖监听器的方法
      • 需要在web.xml中进行配置---注册监听
    • ServletContextListener监听器的主要作用
      • 初始化的工作:初始化对象,初始化数据--加载数据库驱动,连接池的初始化
        • j2EE开发中,能不用静态代码块就不用静态代码块
      • 加载一些初始化的配置文件 --- 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的钝化与活化
  • 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>







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马