学习完了java三大器中的两大器了(过滤器Filter和拦截器Interceptor),
今天来跟我一起学习一下java监听器Listener吧~
java监听器简介
1.来自于servlet规范的一组接口[8个接口]
2.专门用于监听[域对象生命周期变化]以及[域对象共享数据变化情况]
域对象的生命周期体现在可以监听域对象何时创建何时销毁
共享数据的变化有哪些?以监听全局作用域对象共享数据为例
ServletContextAttributeListener可以监听全局作用域对象共享数据的变化
application.setAttribute("key",100)---新增共享数据
application.setAttribute("key",200)---更新共享数据
application.removeAttribute("key")---删除共享数据
以此类推:
如果想监听seesion会话域作用域对象共享数据的变化情况可以使用
HttpSessionAttributeListener
如果想监听request请求作用域对象共享数据的变化情况可以使用
HttpRequestAttributeListener
3.监听器接口的实现类,只能由开发人员负责实现
那么什么是域对象呢?
域对象简介
定义:
在某一个范围之内.可以为servlet之间提供共享数据的对象
分类:
1.ServletContext application:全局作用域对象
在tomcat运行期间.可以为当前工程中所有的Servlet提供共享数据
2.HttpSession session:回话作用域对象
在一次会话过程中.为参与本次会话的servlet提供共享数据
3.HttpServletRequest request:请求作用域对象
在一次请求处理过程中.比如[请求转发] 为参与本次请求的所有servlet提供共享数据
监听器用途
1.统计在线人数和在线用户
2.系统启动时加载初始化信息
3.统计网站访问量
4.跟Spring结合
话不多说.来创建我们的第一个Listener吧
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.itgzw.listener.MyListener01</listener-class>
</listener>
</web-app>
先来创建一个可以监听全局作用域对象的生命周期的监听器吧~
所谓的生命周期就是何时创建何时销毁
步骤:创建MyListener01 类实现ServletContextListener 接口即可
package com.itgzw.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @title: ServletContextListener
* 可以看到全局域对象何时创建 何时销毁--域对象的生命周期
* @Author Mr.Guo
* @Date: 2021/9/9 15:45
* @Version 1.0
*/
public class MyListener01 implements ServletContextListener {
//在application被初始化时调用(也就是tomcat容器启动的时候)
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("全局作用域对象被初始化");
}
//在tomcat容器关闭的时候调用
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("全局作用域对象被销毁");
}
}
经过测试,当tomcat启动的时候会输出"全局作用域对象被初始化"
当tomcat关闭的时候会输出"全局作用域对象被销毁"
这样就可以知道全局作用域对象什么时候被初始化以及什么时候被销毁了
监听了全局作用域对象的生命周期,接下来我们来写一个监听器来监听全局作用域对象共享数据的变化情况吧–使用ServletContextAttributeListener
web.xml配置
<listener>
<listener-class>com.itgzw.listener.MyListener02</listener-class>
</listener>
监听器类
package com.itgzw.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
* @title: ServletContextAttributeListener
* 监听全局作用域对象共享数据的变化情况
* @Author Mr.Guo
* @Date: 2021/9/9 15:45
* @Version 1.0
*/
public class MyListener02 implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("全局作用域对象共享数据被新增了");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("全局作用域对象共享数据被删除了");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("全局作用域对象共享数据被更新了");
}
}
attributeAdded:监听新增共享数据
attributeReplaced:监听更新共享数据
attributeRemoved:监听删除共享数据
由于共享数据的变化依赖于servletcontext,所以我们还需写一个servlet
web.xml
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>com.itgzw.servlet.MyServlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/myFirstServlet.do</url-pattern>
</servlet-mapping>
servlet类
package com.itgzw.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @title: MyServlet01
* @Author Mr.Guo
* @Date: 2021/9/10 14:35
* @Version 1.0
*/
public class MyServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取全局作用域对象
ServletContext servletContext = req.getServletContext();
//新增共享数据
servletContext.setAttribute("key",100);
//更新共享数据
servletContext.setAttribute("key",200);
//删除共享数据
servletContext.removeAttribute("key");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
万事具备.启动测试~
web.xml中配置的servlet的访问路径为:myFirstServlet.do
启动程序之后浏览器访问http://localhost:38080/mylistener/myFirstServlet.do
可以看到控制台依次输出了我们的打印语句,搞定啦!
至此,java Listener就算是入门啦!!!
小伙伴们如果在项目中遇到问题可以在线讨论哟!!!
本文章纯属个人学习记录,如有问题,请不吝赐教。