JAVA监听器

作为JAVA开发人员,我们应对javaweb的三个技术要点之一的Listener进行学习,楼主查阅相关资料并学习相关视频,总结如下JAVA监听器内容,供大家参考学习。完整代码内容我已放到我的github中,请自行下载:https://github.com/Mr-WangZhe/Java-Listener“>JAVA Listener学习

一.监听器Listener

1.什么是监听器
  • 监听器就是监听某个域对象的的状态变化的组件
  • 监听器的相关概念:
    • 事件源:被监听的对象(三个域对象 request、session、servletContext)
    • 监听器:监听事件源对象事件源对象的状态的变化都会触发监听器(6+2)
    • 注册监听器:将监听器与事件源进行绑定
    • 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码)
2.监听器有哪些
  • 第一维度按照被监听的对象划分:ServletRequest域、HttpSession域、ServletContext域
  • 第二维度按照监听的内容分:监听域对象的创建与销毁的、监听域对象的属性变化的

这里写图片描述

3.监听三大域对象的创建与销毁的监听器
  • 监听器的编写步骤(重点):

    • 编写一个监听器类去实现监听器接口
    • 覆盖监听器的方法
    • 需要在web.xml中进行配置—注册
  • 监听ServletContext域的创建与销毁的监听器ServletContextListener

    • Servlet域的生命周期

      • 何时创建:服务器启动创建
      • 何时销毁:服务器关闭销毁
    • ServletContextListener监听器的主要作用

      • 初始化的工作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化)
      • 加载一些初始化的配置文件(spring的配置文件)
      • 任务调度(定时器—Timer/TimerTask)
    • 实例应用:

    • 整体流程:create包下创建MyServletContextListener类实现ServletContextListener接口并覆盖方法public void contextInitialized(ServletContextEvent arg0)监听context域对象的创建;覆盖方法public void contextDestroyed(ServletContextEvent arg0)监听context域对象的销毁。并在web.xml中通过<listener>中的<listener-class>书写监听器全类名配置。

    • 实现任务调度(即定时器)的思路:使用Timer类对象的scheduleAtFixedRate(task,firstTime,period)方法第一个参数书写TimerTask()的匿名内部类重写run方法从而实现调度任务内容;firstTime是Date类型对象,我们可以设置成当前晚上12点;period是间隔执行时间(单位毫秒),我们可以设置成24小时。从而实现从当前晚上12点开始,每24小时都执行对应的调度任务。

    • 实例代码:

      //web.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <!-- 注册监听器 -->
      <listener>
          <listener-class>create.MyServletContextListener</listener-class>
      </listener>
      <display-name>WEB23_LISTENER</display-name>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      </web-app>
      
      //MyServletContextListener.java
      package create;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.Timer;
      import java.util.TimerTask;
      import javax.servlet.ServletContext;
      import javax.servlet.ServletContextEvent;
      import javax.servlet.ServletContextListener;
      public class MyServletContextListener implements ServletContextListener{
             
      //监听context域对象的创建
      @Override
      public void contextInitialized(ServletContextEvent arg0) {
            //参数可以获得被监听的对象
      //        ServletContext servletContext1 = arg0.getServletContext();//返回值是被监听的对象
      //        Object servletContext2 = arg0.getSource();//等同于arg0.getServletContext(),获得的是Object类型,但实际上也是获得被监听的对象
      //        System.out.println("context创建了...");
          //开启一个计息任务调度——每天晚上12点计息一次
          Timer timer = new Timer();
          //task任务,firstTime第一次执行的时间,period间隔执行的时间(单位毫秒)
          //timer.scheduleAtFixedRate(task, firstTime, period);
          //测试demo:从服务器启动开始每隔5秒打印“银行计息了”
      //        timer.scheduleAtFixedRate(new TimerTask() {
             
      //            @Override
      //            public void run() {
             
      //                System.out.println("银行计息了...");
      //            }
      //        }, new Date(), 5000);
          //实际银行计息业务
          //1.起始时间,定义成晚上12点
          //2.间隔时间:24小时
          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
          String currentTime = "2018-08-15 00:00:00";
          Date date = null;
          try {
              date = format.parse(currentTime);
          } catch (ParseException e) {
              e.printStackTrace();
          }
          timer.scheduleAtFixedRate(new TimerTask() {
              @Override
              public void run() {
                  System.out.println("银行计息了...");
              }
          }, date, 24*60*60*1000);
      }
      //监听context域对象的销毁
      @Override
      public void contextDestroyed(ServletContextEvent arg0) {
          System.out.println("context销毁了...");
      }
      }
  • 监听Httpsession域的创建于销毁的监听器HttpSessionListener

    • HttpSession对象的生命周期

      • 何时创建:第一次调用request.getSession时创建
      • 何时销毁:服务器关闭销毁、session过期(默认30分钟,修改默认的30分钟是在Tomcat的web.xml,修改当前项目的过期时间是在自己项目的web.xml中)、手动销毁
    • HttpSessionListener监听器的主要作用:

      • 由于每次访问网站都会默认创建session对象(jsp页面中page指令中的session属性默认为true,即被访问时创建session),可以用于计数网站访问过的人
    • 实例应用:

      • 整体流程:创建MyHttpSessionListener类实现HttpSessionListener接口并覆盖public void sessionCreated(HttpSessionEvent arg0)public void sessionDestroyed(HttpSessionEvent arg0)方法。并在web.xml中注册该listener,和index.jsp页面。每当访问一次index页面,即会调用一次sessionCreated方法。

      • 实例代码:

      //web.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <!-- 注册监听器 -->
      <listener>
          <listener-class>create.MyHttpSessionListener</listener-class>
      </listener>
      <display-name>WEB23_LISTENER</display-name>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      </web-app>
      
      //MyHttpSessionListener.java
      package create;
      import javax.servlet.http.HttpSessionEvent;
      import javax.servlet.http.HttpSessionListener;
      public class MyHttpSessionListener implements HttpSessionListener{
             
      @Override
      public void sessionCreated(HttpSessionEvent arg0) {
          //获得Session对象的方法arg0.getSession()
          String id = arg0.getSession().getId();
          System.out.println("session创建"+id);
      
      }
      @Override
      public void sessionDestroyed(HttpSessionEvent arg0) {
          System.out.println("session销毁");
      
      }
      }
      
      //index.jsp
      <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
      <!DOCTYPE html PUBLIC 
  • 25
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值