目录
三、ServletContextAttributeListener
1.HttpSessionAttributeListener :
3.ServletRequestAttributeListener :
一、Listener快速入门
1.Listener简介 :
(1) Listener是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器。
(2) Listener 是 JavaEE 的规范,就是接口.
(3) 监听器的作用是,监听某种变化(一般是对象的创建/销毁, 属性的变化), 触发对应方法完成相应的任务。
(4) JavaWeb 中的监听器共8个, 其中最常用的是 ServletContextListener。
2.Java事件处理机制 :
java的事件处理采用“委派事件模型”。即当事件发生时,产生该事件的对象,并把相关信息传递给“事件的监听者”处理。
其中——
①事件源,就是指用户的操作,可以是一个按钮,也可以是一个窗口,即产生事件对象的对象;
②事件,就是承载事件源状态改变时生成的信息的事件对象,比如键盘事件,窗口事件,鼠标事件等等,该对象保存着当前事件的很多信息,比如KeyEvent对象含有当前被按下键的Code值。java.awt.event包和javax.swing.event包下定义了各种事件类型。
二、ServletContextListener
1.作用 :
监听ServletContext的创建或销毁( Web应用启动时创建ServletContext对象), 即生命周期监听。
应用场景——
(1)加载初始化的配置文件;eg : Spring的配置文件
(2)任务调度(配合定时器 Timer/TimerTask)
2.相关方法 :
(1) void contextInitialized(ServletContextEvent sce) 创建ServletContext对象时触发
(2) void contextDestroyed(ServletContextEvent sce) 销毁ServletContext对象时触发
3.应用实例 :
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>listener.IntroListener</listener-class> </listener> </web-app>
IntroListener类代码如下 :
package listener; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletContextEvent; import jakarta.servlet.ServletContextListener; /** Δ注意事项 : (1) 当一个类实现了ServletContextListener接口,该类就是一个监听器。 (2) 该类可以监听的事件,由该类实现的监听接口决定, eg: 实现了ServletContextListener接口,就可以监听ServletContextListener对象 的创建和销毁,以此类推。 (3) 当Web应用启动时,会产生ServletContextEvent事件对象,会调用对应的监听器的事件 处理方法,此处为contextInitialized(...)方法,同时会传递事件对象。 (4) 程序员可以通过ServletContextEvent事件对象,来获取需要的信息,然后再进行相应的业务处理。 (5) Tomcat有维护一个容器来管理Listener. */ public class IntroListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContext servletContext = sce.getServletContext(); System.out.println("获取到的ServletContext对象 = " + servletContext); } @Override public void contextDestroyed(ServletContextEvent sce) { ServletContext servletContext = sce.getServletContext(); System.out.println(servletContext + "————ServletContext对象被销毁~"); } }
运行结果 :
编辑
编辑
三、ServletContextAttributeListener
1.作用 :
监听 ServletContext 属性变化
2.相关方法 :
(1) void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
(2) void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
(3) void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
3.应用实例 :
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>listener.IntroListener</listener-class> </listener> <listener> <listener-class>listener.ServletContextAttribute</listener-class> </listener> </web-app>
ServletContextAttribute类代码如下 :
package listener; import jakarta.servlet.ServletContextAttributeEvent; import jakarta.servlet.ServletContextAttributeListener; /** * @author : Cyan_RA9 * @version : 21.0 */ public class ServletContextAttribute implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent scae) { String name = scae.getName(); Object value = scae.getValue(); System.out.println("监听到\"" + name + " = " + value + "\"属性被添加"); } @Override public void attributeReplaced(ServletContextAttributeEvent scae) { //Δ该方法取得的属性为旧值。 String name = scae.getName(); Object value = scae.getValue(); System.out.println("监听到\"" + name + " = " + value + "\"属性被修改"); } @Override public void attributeRemoved(ServletContextAttributeEvent scae) { String name = scae.getName(); Object value = scae.getValue(); System.out.println("监听到\"" + name + " = " + value + "\"属性被删除"); } }
TestServlet类代码如下 :
package listener; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns={"/test"}) public class TestServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = getServletContext(); servletContext.setAttribute("color", "cyan"); servletContext.setAttribute("color", "pink"); servletContext.removeAttribute("color"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
运行结果 : (GIF)
编辑
四、HttpSessionListener
1.作用 :
监听Session对象的创建或销毁,即Session生命周期监听。
2.相关方法 :
(1)void sessionCreated(HttpSessionEvent se) 创建Session对象时调用
(2) void sessionDestroyed(HttpSessionEvent se) 销毁Session对象时调用
3.应用实例 :
HttpSessionListener_Demo类代码如下 :
package listener; import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSessionEvent; import jakarta.servlet.http.HttpSessionListener; public class HttpSessionListener_Demo implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { HttpSession session = se.getSession(); String sessionId = session.getId(); System.out.println("Session" + sessionId + "被创建."); } @Override public void sessionDestroyed(HttpSessionEvent se) { HttpSession session = se.getSession(); String sessionId = session.getId(); System.out.println("Session" + sessionId + "被销毁."); } }
在web.xml配置文件中配置该Listener,如下图所示 :
编辑
TestServlet2类代码如下 :
package listener; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; @WebServlet(urlPatterns = {"/test2"}) public class TestServlet2 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); System.out.println("session = " + session); String threadName = Thread.currentThread().getName(); System.out.println("令" + threadName + "线程休眠10秒钟~"); try { Thread.sleep(1000 * 10); } catch (InterruptedException e) { throw new RuntimeException(e); } session.invalidate(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
运行结果 : (如下GIF)
编辑
五、其他监听器
1.HttpSessionAttributeListener :
1.1 作用
监听 Session 属性的变化
1.2 相关方法
(1) void attributeAdded(ServletRequestAttributeEvent srae) 向Session对象中添加属性时
(2) void attributeReplaced(ServletRequestAttributeEvent srae) 替换Session对象中的属性时
(3) void attributeRemoved(ServletRequestAttributeEvent srae) 移除Session对象中的属性时
2.ServletRequestListener :
2.1 作用
监听Req对象的创建或销毁,即Request对象生命周期监听。
2.2 相关方法
(1) void requestInitialized(ServletRequestEvent sre)创建request对象时调用;可以通过ServletRequestEvent对象获取到ServletRequest对象,然后通过多态的向下转型,得到HttpServletRequest接口的实现类对象。
(2) void requestDestroyed(ServletRequestEvent sre) 销毁request对象时调用。
3.ServletRequestAttributeListener :
3.1 作用
监听Req的属性变化. (最先被调用;结合Tomcat的底层机制,Tomcat会通过HttpServletRequest对象来处理HTTP请求)
3.2 相关方法
(1) void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
(2) void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
(3) void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时
System.out.println("END----------------------------------------------------------------------------------------------------------------------------------");