文章目录
14.1 官方文档
14.1.1 文档:java_ee_api_中英文对照版.chm
14.2 Listener 监听器介绍
- Listener 监听器它是 JavaWeb 的三大组件之一
- JavaWeb 的三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
- Listener 是 JavaEE 的规范,就是接口
- 监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化),触发对应方法完成相应的任务
- JavaWeb 中的监听器(共八个),目前最常用的是 ServletContextListener,后面案例演示
14.3 JavaWeb 的监听器
14.3.1 ServletContextListener 监听器
-
作用:监听 ServletContext 创建或销毁(当我们 Web 应用启动时,就会创建 ServletContext),即生命周期监听,应用场景:
① 加载初始化的配置文件,比如 spring 的配置文件
② 任务调度(配合定时器 Timer/TimerTask) -
相关方法
void contextInitialized(ServletContextEvent sce) 创 建 Servletcontext 时 触 发 void
contextDestroyed(ServletContextEvent sce) 销毁 Servletcontext
- 应用实例 创建 XjsServletContextListener.java
package com.xjs.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @Author: 谢家升
* @Date: 2022/3/13-03-13-22:57
* @Version: 1.0
*/
/**
* 解读:
* 1.当一个类实现了 ServletContextListener
* 2.该类就是一个监听器
* 3.该类可以监听的事件 由该类实现的监听接口决定,比如 实现了 ServletContextListener ,
* 则该类就可以监听 ServletContext 对象的创建和销毁,以此类推
* 4.ServletContextListener 就是一个监听者
* 5.当web应用启动时,就会产生 ServletContextEvent 事件,会调用监听器的对应的事件处理方法
* contextInitialized,同时会传递 事件对象
* 6.程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息,然后再进行业务处理
* 7.tomcat怎么知道监听器存在? 因为我们需要在web.xml中配置
*/
public class XjsServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("XjsServletContextListener 监听到 " +
servletContextEvent.getServletContext() + "被创建...");
//如果我们获取到 ServletContext 对象,可以进行业务处理
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("XjsServletContextListener 监听到 " +
servletContextEvent.getServletContext() + "被销毁...");
//可以对 ServletContext 数据进行处理, 或者日志的管理...
}
}
- 配置 web.xml
<listener>
<listener-class>com.xjs.listener.XjsServletContextListener</listener-class>
</listener>
- 完成测试
14.3.2 ServletContextAttributeListener 监听器
- 作用:监听 ServletContext 属性变化
- 相关方法
void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
- 使用少,再举个例 (后面的监听器类似)
- 创建 XjsServletContextAttributeListener
package com.xjs.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
* @Author: 谢家升
* @Date: 2022/3/13-03-13-23:16
* @Version: 1.0
*/
public class XjsServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("XjsServletContextAttributeListener" + "监听到添加属性: " +
servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("XjsServletContextAttributeListener" + "监听到删除属性: " +
servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("XjsServletContextAttributeListener" + "监听到替换/修改属性: " +
servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
}
}
- 配置 web.xml
<listener>
<listener-class>com.xjs.listener.XjsServletContextAttributeListener</listener-class>
</listener>
- 创建 HiServlet.java
package com.xjs.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 javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Author: 谢家升
* @Date: 2022/3/13-03-13-23:21
* @Version: 1.0
*/
public class HiServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HiServlet 被调用...");
//给servletContext 对象操作属性
ServletContext servletContext = request.getServletContext();
servletContext.setAttribute("name","谢家升");
servletContext.setAttribute("name","小谢");
servletContext.removeAttribute("name");
//操作session
HttpSession session = request.getSession();
session.setMaxInactiveInterval(30);
session.setAttribute("age",18);
session.setAttribute("age",23);
session.removeAttribute("age");
//操作request
request.setAttribute("job","java工程师");
request.setAttribute("job","老板~~");
request.removeAttribute("job");
System.out.println("hiServlet 处理完毕...");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
- 完成测试
14.3.3 其它监听器-使用较少
14.3.3.1 HttpSessionListener 监听器
- 作用:监听 Session 创建或销毁,即生命周期监听
- 相关方法
void sessionCreated(HttpSessionEvent se) 创 建 session 时 调 用 void
sessionDestroyed(HttpSessionEvent se)销毁 session 时调
- 使用方法和前面一样, 可以用于监控用户上线,离线
package com.xjs.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @Author: 谢家升
* @Date: 2022/3/14-03-14-8:41
* @Version: 1.0
*/
public class XjsHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("XjsHttpSessionListener 监听到创建session,id= " +
session.getId());
System.out.println(session.getId() +"用户上线");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
System.out.println("XjsHttpSessionListener 监听到销毁session,id= " +
session.getId());
System.out.println(session.getId() +"用户下线");
}
}
14.3.3.2 HttpSessionAttributeListener 监听
- 作用:监听 Session 属性的变化
- 相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时
- 使用少 , 使用方法和前面一样
package com.xjs.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* @Author: 谢家升
* @Date: 2022/3/14-03-14-8:52
* @Version: 1.0
*/
public class XjsHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("XjsHttpSessionAttributeListener 监听到添加属性" +
httpSessionBindingEvent.getName() + "=" +httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("XjsHttpSessionAttributeListener 监听到删除属性" +
httpSessionBindingEvent.getName() + "=" +httpSessionBindingEvent.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("XjsHttpSessionAttributeListener 监听到修改属性" +
httpSessionBindingEvent.getName() + "=" +httpSessionBindingEvent.getValue());
}
}
14.3.3.3 ServletRequestListener 监听器
- 作用:监听 Request 创建或销毁,即 Request 生命周期监听
- 相关方法
void requestInitialized(ServletRequestEvent sre) 创建 request 时
void requestDestroyed(ServletRequestEvent sre) 销毁 request 时
- 可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况
package com.xjs.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
* @Author: 谢家升
* @Date: 2022/3/14-03-14-8:58
* @Version: 1.0
*/
public class XjsHttpRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
System.out.println("XjsHttpRequestListener 监听到 request对象被创建.." +
servletRequest);
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
System.out.println("XjsHttpRequestListener 监听到 request对象被销毁.." +
servletRequest);
}
}
14.3.3.4 ServletRequestAttributeListener 监听器
- 作用:监听 Request 属性变化
- 相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时
- 使用方法和前面类似
package com.xjs.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
/**
* @Author: 谢家升
* @Date: 2022/3/14-03-14-9:06
* @Version: 1.0
*/
public class XjsHttpRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
ServletRequest servletRequest = servletRequestAttributeEvent.getServletRequest();
System.out.println("XjsHttpRequestAttributeListener 监听到添加属性" +
servletRequestAttributeEvent.getName() + "--"+ servletRequestAttributeEvent.getValue());
System.out.println("访问的IP= " + servletRequest.getRemoteAddr());
System.out.println("访问的资源:" + ((HttpServletRequest)servletRequest).getRequestURI());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("XjsHttpRequestAttributeListener 监听到删除属性" +
servletRequestAttributeEvent.getName() + "--"+ servletRequestAttributeEvent.getValue());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("XjsHttpRequestAttributeListener 监听到修改属性" +
servletRequestAttributeEvent.getName() + "--"+ servletRequestAttributeEvent.getValue());
}
}