1.什么是监听器

监听器就是监听某个对象的状态变化的组件。
事件源:被监听的对象 ----- 三个域对象 request session servletContext
监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 ---- 6+2
注册监听器:将监听器与事件源进行绑定
响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 程序员编写代 码

ServletContext域 HttpSession域 ServletRequest域
域对象内的创建与销毁 ServletContextListener HttpSessionListener ServletRequestListener
域对象内的属性的变化 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener
ServletContextListener监听器的主要作用
a、初始化的工作:初始化对象 初始化数据 ---- 加载数据库驱动  连接池的初始化
b、加载一些初始化的配置文件 --- spring的配置文件
c、任务调度----定时器----Timer/TimerTask

实现步骤:

1,编写一个监听器类去实现监听器接口

例如创建一个类,类名为:MyServletContextListener

2,覆盖监听器的方法(说白了去实现一下ServletContextListener这个接口,并且实现该接口未实现的方法就行)

public class ServletContextListener implements ServletContextListener{//监听context域对象的创建public void contextInitialized(ServletContextEvent sce) {System.out.println("context创建了...");}//监听context域对象的销毁public void contextDestroyed(ServletContextEvent sce) {System.out.println("context销毁了...");}}

3,需要在web.xml中进行配置—注册

把该方法的全包名给配置一下即可
<listener><listener-class>beyond.create.MyServletContextListener</listener-class>
</listener>

ServletContextListener
银行计息:

package beyond.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 {//实现监听器接口ServletContext域的创建和销毁//监听context域对象的创建public void contextInitialized(ServletContextEvent sce) {//服务器启动的时候执行该方法System.out.println("context创建了...");//通过sce可以获得的被监听的对象//ServletContext servletContext = sce.getServletContext();//就是被监听的对象---ServletContext//ServletContext source = (ServletContext)sce.getSource();//getSource就是被监听的对象  是通用方法//开启一计息任务调度---每天晚上12点计息一次Timer timer = new Timer();//task:任务   firstTime:第一次执行时间  period:间隔执行时间//timer.schedule(task, firstTime, period);/*timer.schedule(new TimerTask() {//TimerTask为一个接口,可以通过匿名内部类进行newpublic void run() {System.out.println("银行计息了...");}}, new Date(), 5000);*///具体实现银行计息如下://修改成银行真实计息业务//1.起始时间:定义成晚上12点//2.间隔时间:24小时SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String currentTime = "2019-04-29 00:00:00";Date parse = null;try {parse = format.parse(currentTime);//解析字符串} catch (ParseException e) {e.printStackTrace();}timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("银行计息了...");}}, parse, 24*60*60*1000);//一天计息一次}//监听context域对象的销毁public void contextDestroyed(ServletContextEvent sce) {System.out.println("context销毁了...");}}

HttpSessionListener
创建与ServletContextListener一样,
继承接口,实现方法,web.xml进行配置
ServletRequestListener也一样

2,监听三大域对象的属性变化

1)域对象的通用方法:
setAttribute(name,value)
—触发添加属性的监听器的方法
—触发修改属性的监听器的方法
getAttribute(name)
removeAttribute(name) - - - 触发删除属性的监听器的方法

3,对象感知监听器(与session中的绑定的对象相关的监听器)

(1)即将要被绑定到session中的对象有几种状态
绑定状态:就一个对象被放到session域中
解绑状态:就是这个对象从session域中移除了
钝化状态:是将session内存中的对象持久化(序列化)到磁盘
活化状态:就是将磁盘上的对象再次恢复到session内存中

绑定与解绑

首先,HttpSessionBindingListener该监听器是绑定在对象上的,并且不需要配置web.xml,跟上面绑定监听器一样,继承接口,实现接口未实现的方法

package beyond.domain;import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;public class Person implements HttpSessionBindingListener{//该监听器是绑到对象身上的,不需要配置web.xmlprivate String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {//绑定的方法System.out.println("Person被绑定了");}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {//解绑的方法System.out.println("Person被解绑了");}
}
package beyond.domain;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class TestPersonBindingServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();//先获得session//将person对象绑定到session中Person p = new Person();p.setId("100");p.setName("beyond");session.setAttribute("person", p);//将p对象(name为person)放到session域当中,被绑定//将person对象从session中解绑session.removeAttribute("person");//跟着name来的}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

钝化与活化

钝化与活化的监听器HttpSessionActivationListener
钝化:是将session内存中的对象持久化(序列化)到磁盘
活化:就是将磁盘上的对象再次恢复到session内存中
当用户很多的时候,就需要用钝化和活化进行优化
与session有关的对象感知监听器一样,该监听器需要绑定在实体上,继承该监听器(HttpSessionActivationListener),这里特别注意要实现接口Serializable

public class Customer implements HttpSessionActivationListener,Serializable

例如:创建一个实体Customer,需要继承HttpSessionActivationListener这个监听器,并且实现该接口Serializable

package beyond.domain;import java.io.Serializable;import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;public class Customer implements HttpSessionActivationListener,Serializable{//实现这个接口private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Override//服务器正常关闭时钝化public void sessionWillPassivate(HttpSessionEvent se) {//钝化---把session存到磁盘System.out.println("customer被钝化了");}@Override//服务器再次启动时活化public void sessionDidActivate(HttpSessionEvent se) {//活化---把磁盘恢复到session内存区域中System.out.println("customer被活化了");}}
钝化代码:
package beyond.domain;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class TestCustomerActiveServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();//获得session对象Customer customer = new Customer();customer.setId("1014");customer.setName("wsq");session.setAttribute("customer", customer);//将customer放到session当中System.out.println("customer被放到session域中了");//钝化,已存到本地磁盘中去了}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
活化代码:
package beyond.domain;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class TestCustomerActiveServlet2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//从session域当中获得customerHttpSession session = request.getSession();//先获得sessionCustomer customer = (Customer) session.getAttribute("customer");//强转System.out.println(customer.getName());//活化后输出customer里面的customer对象的Name值}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
这里需要注意一下:可以通过配置文件 指定对象钝化时间—对象多长时间不适用被钝化


context.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context><!-- maxIdleSwap:session中的对象多长时间不使用就钝化 --><!-- directory:钝化后的对象的文件写到磁盘的哪个目录下  配置钝化的对象文件在    work/catalina/localhost/钝化文件 --><Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <!-- 1分钟不用session被钝化到磁盘中 --><Store className="org.apache.catalina.session.FileStore" directory="itcast205" />  <!-- 将钝化后的session存放当itcast205该目录下,目录可以自定义 --></Manager>
</Context>
当再次运行Servlet的时候,钝化后的session会存到相关指定文件夹下

该文件夹下面的内容就是session里面的内容

Javaweb---监听器相关推荐

  1. JavaWeb监听器

    三大组件 Servlet Listener Filter Listener:监听器 初次相见:AWT 二次相见:SAX 监听器: 它是一个接口,内容由我们来实现: 它需要注册,例如注册在按钮上! 监听 ...

  2. Java-Web 监听器和过滤器

    目录 一.监听器 1.监听器概述 2.创建与销毁监听器 3.操作域对象属性的监听器 4.HttpSession的监听器 二.过滤器 1.过滤器简介 2.过滤器的生命周期 3.过滤器方法中的参数 4.多 ...

  3. JavaWeb监听器简单介绍及一个登陆监听案例

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/qq_38720976/article/details/84474950 监听器基本概念 JavaWeb ...

  4. JavaWeb—监听器—Eclipse版动力节点学习笔记

    JavaWeb学习笔记 监听器 Listener 哔哩哔哩蛙课网[动力节点]JavaWeb-Eclipse版学习视频网址 解释 归属 备注 ServletRequestListener Request ...

  5. Java-Web监听器

    在WEB端实现监听实质: 实现一系列的监听接口(实现相应的接口,覆写各接口中相应的方法,在相应的事件触发的时候会执行自己的监听器中的覆写的方法,在各个方法中完成自己想要的操作,从而实现了监听) 监听- ...

  6. Javaweb监听器(2)

    属性监听器:ServletRequestAtttributeListener/HttpSeessionAttributeListener/ServletContextAttributeListener ...

  7. javaweb监听器(统计在线人数:统计session)

    1.创建监听器,重写里面的方法 package com.xiaocong.listener;import javax.servlet.ServletContext; import javax.serv ...

  8. JAVAWEB——监听器(Listener),监听器编写步骤,八大监听器的介绍

    一.关于监听器那些? 监听器:监听某个对象的的状态变化的组件 事件源:被监听的对象 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 注册监听器:将监听器与事件源进行绑定 响应行为:监听器 ...

  9. Javaweb——监听器

    文章目录 一.监听器的概述 1. 监听器是什么 2. 监听器用途 3. 监听器的术语 二.监听器的入门 三.Servlet 中的监听器 1. Servlet 中监听器简介 2. Servlet 中监听 ...

  10. JavaWEB过滤器和监听器技术

    过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之 ...

最新文章

  1. Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用
  2. Win10无法修改编辑hosts文件
  3. 使用RoundedBitmapDrawable快速生成圆角和圆形图片
  4. js怎么实现对html代码加密解密,javascript脚本加密解密及HTML转JS
  5. 技术系列课|从0到1 构建实时音视频引擎
  6. 使用 Sealos + Longhorn 部署 KubeSphere v3.0.0
  7. 上传 录音_老罗推荐的是最好吗?AI旗舰录音笔对比评测
  8. PLSQL中的RECORD小例子
  9. 游戏计算机重要参数,这真的很重要吗 游戏鼠标三大参数之谜
  10. LoadRunner教程(16)-LoadRunner SLA分析
  11. 计算机二级论文题,计算机二级考试真题-Word-小许-质量管理的论文
  12. 茴香豆的茴字的几种写法——BOJ1302小结
  13. 速腾聚创16线雷达离线和实时跑Lego-loam
  14. Learn to say “fuck you” to the world every once in a while
  15. 喝豆浆对身体都有哪些好处?
  16. 决策树在机器学习的理论学习与实践
  17. Linux快捷键大全(参考)
  18. Linux 运维必备的 13 款实用工具,拿好了
  19. TCP/IP协议,HTTP协议,get和post请求的关联与区别
  20. Java 后端开发面试总结:25 个技术专题(最全面试攻略)

热门文章

  1. [Python][小知识][NO.3] Python 使用系统默认浏览器打开指定URL的网址
  2. 关于setTimeout和setInterval的函数参数问题
  3. 解决IE8下body{ overflow:hidden;}无效的解决办法
  4. bootstrap的栅格系统和响应式工具
  5. 字符数组和字符串的小细节
  6. bzoj1588 [HNOI2002]营业额统计
  7. 程序员需要谨记的九大安全编码规则
  8. 64位CentOS6.2安装erlang及rabbitmqServer
  9. PHP 性能分析: Xhprof Xhgui
  10. 优化算法的意义,之二。