Listener
三大组件-Listener监听器
介绍
Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
Listener 是 JavaEE 的规范,就是接口
监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成相应的任务
JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener。
ServletContextListener 监听器
作用
监听 ServletContext 创建或销毁(当我们 Web 应用启动时,就会创建 ServletContext),即生命周期监听,
应用场景(1)加载初始化的配置文件;比如 spring 的配置文件 ;(2)任务调度(配合定时器 Timer/TimerTask)
相关方法
void contextInitialized(ServletContextEvent sce) 创建 Servletcontext 时触发
void contextDestroyed(ServletContextEvent sce) 销毁 Servletcontext 时
package com.lzw.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 1. 当一个类实现了 ServletContextListener
* 2. 该类就是一个监听器
* 3. 该类可以监听的事件 由该类实现的监听接口决定,比如实现了 ServletContextListener
* ,则该类就可以监听 ServletContext对象的创建和销毁,以此类推
* 4. LzwServletContextListener 就是一个监听者
* 5. 当web应用启动时,就会产生 ServletContextEvent 事件,会调用监听器的对应事件处理方法
* contextInitialized,同时会传递 事件对象
* 6. 程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息,然后再进行业务处理
* 7. tomcat 怎么知道这个监听器存在? 因为需要在web.xml中配置
*/
public class LzwServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println("LzwServletContextListener 监听到 " +
servletContext + " 被创建");
//如果我们获取到 ServletContext 对象。。 进行业务处理
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
System.out.println("LzwServletContextListener 监听到 " +
servletContext + " 被销毁");
//比如可以对 ServletContext 数据进行处理,或日志的管理
System.out.println("进行处理工作");
}
}
<?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.lzw.listener.LzwServletContextListener</listener-class>
</listener>
</web-app>
ServletContextAttributeListener 监听器
作用
监听 ServletContext 属性变化
相关方法
void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
package com.lzw.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class LzwServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("LzwServletContextAttributeListener 监听到添加属性" +
servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("LzwServletContextAttributeListener 监听到删除属性" +
servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("LzwServletContextAttributeListener 监听到修改属性" +
servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
}
}
package com.lzw.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;
public class HiServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给servletContext 对象操作属性
ServletContext servletContext = request.getServletContext();
servletContext.setAttribute("name","Lzw");
servletContext.setAttribute("name","LiAng");
servletContext.removeAttribute("name");
System.out.println("HiServlet 处理完毕");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
其他监听器-使用较少
HttpSessionListener 监听器
作用
监听 Session 创建或销毁,即生命周期监听
相关方法
void sessionCreated(HttpSessionEvent se) 创建 session 时调用
void sessionDestroyed(HttpSessionEvent se) 销毁 session 时调用
使用方法和前面一样, 可以用于监控用户上线,离线
package com.lzw.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class LzwHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
//当session创建时,给它设置一个生命周期
session.setMaxInactiveInterval(5);//5秒
System.out.println("LzwHttpSessionListener 监听到 session创建=" + session.getId());
System.out.println("用户id=" + session.getId() + " 上线");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("LzwHttpSessionListener 监听到 session销毁=" + session.getId());
System.out.println("用户id=" + session.getId() + " 离线");
}
}
HttpSessionAttributeListener 监听器
作用
监听 Session 属性的变化
相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时
ServletRequestListener 监听器
作用
监听 Request 创建或销毁,即 Request 生命周期监听
相关方法
void requestInitialized(ServletRequestEvent sre) 创建 request 时
void requestDestroyed(ServletRequestEvent sre) 销毁 request 时
可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况
package com.lzw.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class LzwRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("LzwRequestListener 监听到 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("LzwRequestListener 监听到 request对象销毁");
}
}
ServletRequestAttributeListener 监听器
作用
监听 Request 属性变化
相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时
HttpSessionBindingListener 感知监听器
作用
绑定Session中的数据(对象)
HttpSessionActivationListener 感知监听器
作用
Session绑定的对象在钝化(把对象持久化到磁盘)之前监听到。(和上面的 HttpSessionBindingListener 是一对)