Java Web学习总结(13)Listener监听器
一,监听器介绍
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
监听器的相关概念:
|
事件源 |
被监听的对象 |
|
监听器 |
监听事件源对象,事件源对象的状态的变化都会触发监听器 |
|
注册监听器 |
将监听器与事件源进行绑定。 |
|
响应行为 |
监听器监听到事件源的状态变化时 所涉及的功能代码。 |
二,监听器的分类
分类1:按照被监听的对象划分
ServletRequest域
HttpSession域
ServletContext域
分类2:监听的内容分
监听域对象的创建与销毁的
监听域对象的属性变化的

三,监听三大域对象的创建与销毁的监听器
监听器的编写步骤:
1、编写一个监听器类去实现监听器接口
2、覆盖监听器的方法
3、需要在web.xml中进行配置
1,监听ServletContext域的创建与销毁的监听器ServletContextListener
当ServletContext对象被创建时,触发contextInitialized (ServletContextEvent arg0)方法。
当ServletContext对象被销毁时,触发contextDestroyed(ServletContextEvent arg0)方法。
ServletContext域对象创建和销毁时机:
创建:服务器启动针对每一个Web应用创建ServletContext。
销毁:服务器关闭前先关闭代表每一个web应用的ServletContext。
例如:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ServletContext对象销毁了!");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("ServletContext对象创建了!");
}
}
在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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Listener</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 注册针对ServletContext对象的监听器 -->
<listener>
<listener-class>com.zender.MyServletContextListener</listener-class>
</listener>
</web-app>
web服务器启动:

web服务器关闭:

2,监听Httpsession域的创建于销毁的监听器HttpSessionListener
当创建一个Session时,触发sessionCreated (HttpSessionEvent arg0) 方法
当销毁一个Session时,触发sessionDestroyed (HttpSessionEvent arg0) 方法。
Httpsession域对象创建和销毁时机:
创建:第一次调用request.getSession时创建。
销毁:服务器关闭销毁 session过期 手动销毁。
例如:
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("session创建:" + arg0.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session销毁了!");
}
}
在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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Listener</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 注册针对HttpSession对象的监听器 -->
<listener>
<listener-class>com.zender.MyHttpSessionListener</listener-class>
</listener>
</web-app>
访问页面时:

3,监听ServletRequest域创建与销毁的监听器ServletRequestListener
当Request对象被创建时,触发requestInitialized(ServletRequestEvent arg0)方法。
当Request对象被销毁时,触发requestDestroyed(ServletRequestEvent arg0)方法。
ServletRequest域对象创建和销毁时机:
创建:用户每一次访问都会创建request对象
销毁:当前访问结束,request对象就会销毁
例如:
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("request对象销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("request对象创建了");
}
}
在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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Listener</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 注册针对Request对象的监听器 -->
<listener>
<listener-class>com.zender.MyServletRequestListener</listener-class>
</listener>
</web-app>
访问页面时:

可以看出用户每一次访问都会创建request对象,当访问结束后,request对象就会销毁。
四.监听三大域对象的属性变化的监听器
1,监听ServletContext域的属性变化的监听器ServletContextAttributeListener
当ServletContext对象添加属性时,触发attributeAdded(ServletContextAttributeEvent arg0)方法。
当ServletContext对象修改属性时,触发attributeReplaced(ServletContextAttributeEvent arg0)方法。
当ServletContext对象删除属性时,触发attributeRemoved(ServletContextAttributeEvent arg0)方法。
例如:
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("属性被添加,name:" + arg0.getName() + "value:" + arg0.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("属性被删除,name:" + arg0.getName() + "value:" + arg0.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
//获得是修改前的数据
System.out.println("属性被修改,name:" + arg0.getName() + "value:" + arg0.getValue());
}
}
Servlet:
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestMyServletContextAttributeListener extends HttpServlet{ private static final long serialVersionUID = -7057319189693064505L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//存储一个数据
context.setAttribute("name", "Zender");
//修改一个数据
context.setAttribute("name", "Zender2");
//删除一个数据
context.removeAttribute("name");
}
}
在web.xml文件中注册监听器和Servlet:
<?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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Listener</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!-- 注册Servlet -->
<servlet>
<servlet-name>TestMyServletContextAttributeListener</servlet-name>
<servlet-class>com.zender.servlet.TestMyServletContextAttributeListener</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestMyServletContextAttributeListener</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping> <!-- 注册针对ServletContext对象的属性的监听器 -->
<listener>
<listener-class>com.zender.MyServletContextAttributeListener</listener-class>
</listener>
</web-app>
访问http://localhost:8081/Listener/index.html,后台结果:

2, HttpSessionAttributeListener监听器(同上)
3,ServletRequestAriibuteListenr监听器(同上)
五,与session中的绑定的对象相关的监听器(对象感知监听器)
即将要被绑定到session中的对象有4种状态:
|
绑定状态 |
就一个对象被放到session域中 |
|
解绑状态 |
就是这个对象从session域中移除了 |
|
钝化状态 |
是将session内存中的对象持久化(序列化)到磁盘 |
|
活化状态 |
就是将磁盘上的对象再次恢复到session内存中 |
1,绑定与解绑的监听器HttpSessionBindingListener
当Person类在HttpSession对象绑定属性时,触发valueBound(HttpSessionBindingEvent arg0)方法。
当Person类在HttpSession对象解绑属性时,触发valueUnbound(HttpSessionBindingEvent arg0)方法。
例如:
首先创建一个Person类实现HttpSessionBindingListener接口:
public class Person implements HttpSessionBindingListener {
private int id;
private String name;
public int getId() {
return id;
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public Person() {
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("person对象被绑定了!");
}
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("person对象被解绑了!");
}
}
Servlet:
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;
import com.zender.Person;
public class TestPersonBindingListener extends HttpServlet {
private static final long serialVersionUID = -4836536065640905707L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//将Person绑定到Session域中
session.setAttribute("persion", new Person(1,"Zender"));
//将Person从Session域中解绑
session.removeAttribute("persion");
}
}
在web.xml文件中注册Servlet:
<?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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Listener</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!-- 注册Servlet -->
<servlet>
<servlet-name>TestPersonBindingListener</servlet-name>
<servlet-class>com.zender.servlet.TestPersonBindingListener</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestPersonBindingListener</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>
</web-app>
访问http://localhost:8081/Listener/index.html,后台结果:

2,钝化与活化的监听器HttpSessionActivationListener
当Person类被钝化时,触发sessionWillPassivate(HttpSessionEvent arg0)方法。
当Person类被活化时,触发sessionDidActivate(HttpSessionEvent arg0)方法。
例如:
首先创建一个Person类实现HttpSessionActivationListener接口,并且这个类必须实现Serializable接口(序列化):
public class Person implements HttpSessionActivationListener,Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public Person() {
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println("Person被活化了");
}
@Override
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("Person被钝化了");
}
}
Servlet:
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;
import com.zender.Person;
public class TestPersonActivationListener extends HttpServlet {
private static final long serialVersionUID = -4836536065640905707L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//将Person绑定到Session域中
session.setAttribute("persion", new Person(1,"Zender"));
System.out.println("Person被放到Session域中了!");
}
}
在web.xml文件中注册Servlet:
<?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_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Listener</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!-- 注册Servlet -->
<servlet>
<servlet-name>TestPersonActivationListener</servlet-name>
<servlet-class>com.zender.servlet.TestPersonActivationListener</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestPersonActivationListener</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>
</web-app>
访问http://localhost:8081/Listener/index.html,后台结果:

关闭服务器:

控制台打印:

钝化的文件:

活化对象:
Servlet2:
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;
import com.zender.Person;
public class TestPersonActivationListener2 extends HttpServlet {
private static final long serialVersionUID = -4836536065640905707L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//获取Session域中的Person
Person p = (Person) session.getAttribute("persion");
System.out.println("name:" + p.getName());
}
}
在web.xml文件中注册Servlet2:
<!-- 注册Servlet -->
<servlet>
<servlet-name>TestPersonActivationListener2</servlet-name>
<servlet-class>com.zender.servlet.TestPersonActivationListener2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestPersonActivationListener2</servlet-name>
<url-pattern>/index2.html</url-pattern>
</servlet-mapping>
启动服务器自动活化对象:

访问:http://localhost:8081/Listener/index2.html,控制台打印:

怎么控制对象的钝化时间呢?可以通过配置文件,指定对象钝化时间,对象多长时间不用会被钝化。
在META-INF下创建一个context.xml

内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- 这样session在一分钟不动的情况下则会被钝化到tomcat工作目录下面的 cjq目录下,直到再次访问才被激活。 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="cjq" />
</Manager>
</Context>
启动服务器访问Servlet把对象放到Session中:

控制台:过1分钟后对象会被自动钝化:

钝化的文件:

访问Servlet2时,对象会自动被活化:

Java Web学习总结(13)Listener监听器的更多相关文章
- java web学习总结(二十) -------------------监听器属性详解
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- java web学习总结(十九) -------------------监听器简单使用场景
一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听器技术来实现这个功能了. 1 package me.gacl.web.listener; 2 3 ...
- [原创]java WEB学习笔记13:JSP介绍(背景,特点,原理)
JSP介绍:(理解) 1)JSP背景 ①在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变: ②如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java Web 学习笔记 1
Java Web 学习笔记 1 一.Web开发基础 1-1 Java Web 应用开发概述 1.1.1 C/S C/S(Client/Server)服务器通常采用高性能的PC机或工作站,并采用大型数据 ...
- Java Web 学习路线
实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- Java Web学习系列——Maven Web项目中集成使用Spring
参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...
- Java web 学习之旅
java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...
随机推荐
- jsc2019_qualC Cell Inversion
先吐槽一下这个比赛的奇怪名字 这个破名字让我实在不知道博客标题该叫啥/px 题目大意 给你一个长度为2n的序列 包括W和B 每次可以选一个区间将里面的颜色反转 但是每个点只能被作为端点选一次 问将序列 ...
- css content属性
content 属性与 :before 及 :after 伪元素配合使用,来插入生成内容. 用于定义元素之前或之后放置的生成内容.默认地,这往往是行内内容,不过该内容创建的框类型可以用属性 displ ...
- 常用的Android关键词定位方法
1字符串,特征字 根据程序运行中出现的特征字词进行搜索,从而获取定位到程序的相关位置之中.以前用 得比较多,不过现在一般难以找到想要的关键词.有时候需要对特征字进行拆分来进行搜索.才 能获得一点提示. ...
- day28-Javascript定时器的应用案例
转行学开发,代码100天——2018-04-13 上篇文章中记录了定时器的用法,本篇通过两个常用案例进一步巩固定时器的应用. 案例一:消息框延时,如QQ中鼠标移动到头像,弹出一个信息框:移出后,消息框 ...
- Linux运维知识之linux shell date 用当天时间做备份文件名
本文主要向大家介绍了Linux运维知识之linux shell date 用当天时间做备份文件名,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. #!/bin/bash #dat ...
- 【FICO系列】SAP 创建会计凭证(FB01)的BAPI
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP 创建会计凭证(FB01) ...
- 【ABAP系列】SAP ABAP常用函数总结第一篇
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP常用函数总结第一 ...
- 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error creating bean with name
HTTP Status 500 - Servlet.init() for servlet mybatis threw exception type Exception report message S ...
- HNOI2019fish
\({\rm fish}\) 20分: 六个for,点积判锐角钝角. #include <vector> #include <queue> #include <cmath ...
- CodeChef GCD2
GCD2 Problem code: GCD2 Submit All Submissions All submissions for this problem are available. ...