作为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 "-//W3C//DTD HTML 4