day25-Listener监听器
Listener监听器
1.Listener监听器介绍
- Listener监听器是JavaWeb三大组件之一。JavaWeb三大组件分别是:Servlet程序,Listener监听器,Filter过滤器。
- Listener是JavaEE的规范,即接口。
- 监听器的作用是,监听某种变化(一般就是对象的创建/销毁,属性变化),触发对象方法完成相应的任务。
- JavaWeb中的监听器共八个,目前最常用的是ServletContextListener,ServletContextAttributeListener,HttpSessionListener和ServletRequestListener。
2.JavaWeb的监听器
2.1ServletContextListener监听器
- 作用:监听ServletContext创建或者销毁(当我们web应用启动时,Tomcat就会创建ServletContext对象),即生命周期监听
- 应用场景:
- 加载初始化的配置文件;比如spring的配置文件
- 任务调度(配合定时器Timer/TimerTask)
- 相关方法:
- void contextInitialized(ServletContextEvent sce):创建ServletContext对象时触发
- void contextDestroyed(ServletContextEven sce):销毁ServletContext对象时触发
应用实例
首先创建一个项目,添加web支持,因为listener监听器是Servlet规范,要使用就要引入Servlet.jar包
创建一个普通类,如果该类实现了某个监听接口,那么此类就是一个监听器。该类可以监听的事件由该类实现的监听接口决定:
package com.listener; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; /**
* 1.当一个类实现了 ServletContextListener 接口时
* 2.该类就是一个监听器
* 3.该类可以监听的事件由该类实现的监听接口决定 ,比如实现ServletContextListener接口,
* 那么该类就可以监听ServletContext对象的创建和销毁,以此类推
* 4.下面的MyServletContextListener就是一个监听者
* 5.当web应用启动时,就会产生ServletContextEvent事件,会调用监听器的对应事件处理方法
* 如:contextInitialized(),同时会传递 事件对象
* 6.程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息,然后再进行业务处理
* 7.Tomcat怎么知道这个监听器存在呢? 因为我们需要在web.xml文件中进行配置,
* 一旦配置后,tomcat启动后就会反射实例化该监听器,放到容器里面去管理
*/
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println("MyServletContextListener监听到=" +
servletContext + "被创建...");
//如果我们获取到ServletContext对象..可以进行业务处理
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println("MyServletContextListener监听到=" +
servletContext + "被销毁...");
//比如可以对ServletContext 数据进行处理,或者日志的管理...
System.out.println("进行处理工作...");
}
}
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置监听器-->
<listener>
<listener-class>com.listener.MyServletContextListener</listener-class>
</listener>
</web-app>
配置Tomcat
点击启动tomcat时,我们可以看到监听器被触发了:
点击停止tomcat时,可以看到监听器再一次被触发:
2.2ServletContextAttributeListener监听器
- 作用:监听ServletContext属性的变化
- 相关方法:
- void attributeAdded(ServletContextAttributeEvent event):添加属性时调用
- void attributeReplaced(ServletContextAttributeEvent event):替换属性时调用
- void attributeRemoved(ServletContextAttributeEvent event):移除属性时调用
应用实例
- 创建监听器:MyServletContextAttributeListener
package com.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 监听到添加属性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 监听到删除属性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("MyServletContextAttributeListener 监听到修改属性.." +
servletContextAttributeEvent.getName() + "=" +
servletContextAttributeEvent.getValue());
}
}
- 创建servlet:HiServlet
package com.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给ServletContext对象操作属性
ServletContext servletContext = getServletContext();
//添加属性
servletContext.setAttribute("name", "杰克");
//修改属性
servletContext.setAttribute("name", "托马斯");
//删除属性
servletContext.removeAttribute("name");
System.out.println("HiServlet 处理完毕...");
}
}
- web.xml:配置监听器和servlet
<!--配置监听器-->
<listener>
<listener-class>com.listener.MyServletContextAttributeListener</listener-class>
</listener>
<!--配置HiServlet-->
<servlet>
<servlet-name>HiServlet</servlet-name>
<servlet-class>com.HiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HiServlet</servlet-name>
<url-pattern>/hiServlet</url-pattern>
</servlet-mapping>
重新发布tomcat,在浏览器中访问servlet,后台输出如下:
2.3HttpSessionListener监听器
- 作用:监听Session创建或销毁,即生命周期监听
- 相关方法:
- void sessionCreated(HttpSessionEvent se):创建session时调用
- void sessionDestroyed(HttpSessionEvent se):销毁session时调用
- 使用方法和前面一样,可以用于监听用户上线,离线
应用实例
- 创建监听器:MyHttpSessionListener
package com.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
//当session被创建时,设置一个生命周期10s
session.setMaxInactiveInterval(10);
System.out.println("MyHttpSessionListener 监听到session创建= " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("MyHttpSessionListener 监听到session销毁= " + session.getId());
}
}
- 修改HiServlet代码:
package com.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
request.getSession();
System.out.println("HiServlet 处理完毕...");
}
}
- 配置监听器:
<listener>
<listener-class>com.listener.MyHttpSessionListener</listener-class>
</listener>
现在我们重启Tomcat,可以看到还没有访问HiServlet,就已经创建了两个session。这是因为启动Tomcat时,会默认访问项目首页面,tomcat会自动创建两个session,这里忽略即可。
在浏览器访问HiServlet,可以看到后台首先创建了一个session,在设置的生命周期内不访问该session,显示该session被销毁。
HttpSessionListener监听器可以用于监听用户上线离线
注意:这里的session不是浏览器一关闭就销毁,session的销毁是服务器端去轮询决定的,因此如果想要用户浏览器一关闭就销毁session,可以通过前端在用户浏览器关闭之前,向服务器发送一个通知,服务器收到通知后销毁该session即可。
2.4HttpSessionAttributeListener监听器
- 作用:监听Session属性的变化
- 相关方法:
- void attributeAdded(ServletRequestAttributeEvent event):添加属性时调用
- void attributeReplaced(ServletRequestAttributeEvent event):替换属性时调用
- void attributeRemoved(ServletRequestAttributeEvent event):移除属性时调用
- 使用少,使用方法和前面一样。
应用实例
- 创建监听器:MyHttpSessionAttributeListener
package com.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("MyHttpSessionAttributeListener 监听到 session添加属性= "
+ httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("MyHttpSessionAttributeListener 监听到 session删除属性= "
+ httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("MyHttpSessionAttributeListener 监听到 session修改属性= "
+ httpSessionBindingEvent.getName() + "=" + httpSessionBindingEvent.getValue());
}
}
- 修改HiServlet
package com.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class HiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
HttpSession session = request.getSession();
//添加属性
session.setAttribute("age", 888);
//修改属性
session.setAttribute("age", 999);
//删除属性
session.removeAttribute("age");
System.out.println("HiServlet 处理完毕...");
}
}
- 配置监听器
<listener>
<listener-class>com.listener.MyHttpSessionAttributeListener</listener-class>
</listener>
redeployTomcat,在浏览器访问hiServlet,后台输出如下:
2.5ServletRequestListener监听器
- 作用:监听Request创建或者销毁,即Request对象的生命周期监听
- 相关方法:
- void requestInitialized(ServletRequestEvent sre):创建request对象时触发
- void requestDestroyed(ServletRequestEvent sre):销毁request对象时触发
- 可以用来监控某个IP访问我们网站的频率,做日志记录,或者访问资源的情况等。
应用实例
- 创建监听器:MyServletRequestListener
package com.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("MyServletRequestListener 监听到request对象被创建 ");
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
System.out.println("记录访问日志...");
System.out.println("访问IP= " + servletRequest.getRemoteAddr());
System.out.println("访问的资源= " + ((HttpServletRequest) servletRequest).getRequestURL());
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("MyServletRequestListener 监听到request对象被销毁...");
}
}
hiServlet不做修改
配置监听器:
<listener>
<listener-class>com.listener.MyServletRequestListener</listener-class>
</listener>
redeployTomcat,在浏览器访问hiServlet,后台输出如下:
(中间的session监听可忽略)
访问项目首页面,后台输出如下:
2.6ServletRequestAttributeListener监听器
- 作用:监听Request属性变化
- 相关方法
- void attributeAdded(ServletRequestAttributeEvent srae):添加属性时调用
- void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时调用
- void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时调用
- 使用方法和前面类似
2.7HttpSessionBindingListener感知监听器
该监听器是用来绑定数据的。如果一个对象实现了HttpSessionBindingListener接口,当这个对象被绑定到Session中或者从session中被删除时,Servlet容器会通知这个对象,而这个对象在接收到通知后,可以做一些初始化或清除状态的操作。
2.8HttpSessionActivationListener感知监听器
HttpSessionActivationListener用于监控实现类本身,当实现类对象被添加到session属性中后,session对象序列化(钝化)前和反序列化(活化)后都会被执行
相应的方法:
- sessionWillPassivate(HttpSessionEvent se): session钝化前执行(session从内存到硬盘)
- sessionDidActivate(HttpSessionEvent se):session活化后执行(session从硬盘到内存)
day25-Listener监听器的更多相关文章
- [Java] JSP笔记 - Listener 监听器
Java Web 开发时,可以使用 Listener 来监听来监听一些事件,从而实现一些功能.实际上这个监听器,原理就是 Delphi 中大家常用的各种事件. 1. 那么,监听器的主要用途用哪些呢: ...
- Java ---Listener监听器
在我们的web容器中,一直不断的触发着各种事件,例如:web应用启动和关闭,request请求到达和结束等.但是这些事件通常对于开发者来说是透明的,我们可以根据这些接口开发符合我们自身需求的功能.在w ...
- Listener监听器和Filter过滤器
Listener监听器 WEB中的监听器 WEB 中的 Listener 和 Filter 是属于 Servlet 规范中的高级的技术.WEB中的监听器共有三类八种(监听三个域对象)* 事件源:Ser ...
- 转-JavaWeb三大组件之Listener监听器
JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...
- Servlet3.0的注解自定义原生Listener监听器实战
简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战 自定义Listener(常用的监听器 servletContextListener.httpSessionListen ...
- 【Servlet】Java Serlvet Listener 监听器
Listener监听器 Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理 容器产生的事件分类 - 生命周期相关的事件 - 设置和删除Attribute数据 ...
- 15 Filter过滤器和Listener监听器
1.Filter:过滤器 (1) 概念:生活中的过滤器:净水器,空气净化器,土匪.web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能.过滤器的作用:一般用于完成通用的 ...
- .jsp文件的使用和理解以及一些小练习和Listener监听器
什么是 jsp,它有什么用? jsp 的全换是 java server pages.Java 的服务器页面.jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据.因为 Servle ...
- 什么是Listener监听器
什么是Listener监听器 1,Listener 监听器它是JavaWeb的三大组件之一.JavaWeb的三大组件:Servlet程序,Filter过滤器,Listener监听器. 2,Listen ...
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
随机推荐
- 《Win10——如何进入高级启动选项》
Win10--如何进入高级启动选项 第一种方法: 管理员命令提示符输入如下代码,自动重启并进入高级启动选项. shutdown /r /o /f /t 00 第二种方法: 1. 管 ...
- Redis 的大 Key 对持久化有什么影响?
作者:小林coding 图解计算机基础(操作系统.计算机网络.计算机组成.数据库等)网站:https://xiaolincoding.com 大家好,我是小林. 上周有位读者字节一二面时,被问到:Re ...
- 24 个 Docker 常见问题处理技巧
转载自:https://mp.weixin.qq.com/s/PoyXyZUVQEiJfNac2qShkw
- Kubernetes 中部署 MySQL 集群
文章转载自:https://www.cnblogs.com/ludongguoa/p/15319861.html 一般情况下 Kubernetes 可以通过 ReplicaSet 以一个 Pod 模板 ...
- PAT (Basic Level) Practice 1024 科学计数法 分数 20
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指 ...
- PHP全栈开发(五):PHP学习(2. echo 和 print 输出、数组、foreach循环、字符串)
在PHP中有两个基本的输出语句,就是echo 和 print 这两个东东有什么不同呢. echo 可以一次输出一个或者多个字符: echo "这是一个", "字符串,&q ...
- P1099 [NOIP2007 提高组] 树网的核 (树的直径)
题目的意思就是在直径上找一段距离不超过s的路径,使该路径的偏心距最小. 求出直径之后,显然我们可以用双指针扫描一段合法路径.设u1,u2...ut是直径上的点,d[ui]表示从ui出发能到达的最远距离 ...
- NOI2014 洛谷P2114 起床困难综合征(位运算)
呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...
- 开源数字基础设施 项目 -- Speckle
[Speckle](https://speckle.systems/)是用于 3D 设计的任何东西的开源数字基础设施.处理软件孤岛.实时协作.数据管理.版本控制和自动化之间的互操作性.致力于构建一个开 ...
- UVA10763
菜鸡退役人来水黄了-- \(\sf{Solution}\) 搞不懂为什么要排序,这不是两个数组直接模拟的数数题吗. 读入后,对于每个学生,令他要去的学校以及他现在所在学校人数对应加一,再 check ...