Lisenter
Listener监听器的介绍
- Listener 监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是:Servlet程序、 Listener监听器、 Filter过滤器
- Listener 是 JavaEE 的规范,就是接口
- 监听器的作用是,监听某种变化 ( 一般就是对象创建 / 销毁 , 属性变化 ), 触发对应方法完成 相应的任务
- JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener
生命周期
监听器(Listener)在JavaWeb应用程序中起到监听和处理事件的作用。监听器的生命周期与Web应用程序的生命周期密切相关。
- ServletContextListener:ServletContextListener会在Web应用程序启动时起作用,并在Web应用程序关闭时销毁。具体来说,当Web容器启动时会触发contextInitialized()方法,开发者可以在这个方法中进行一些初始化操作;当Web容器关闭时会触发contextDestroyed()方法,开发者可以在这个方法中进行一些资源释放、清理操作。
- ServletRequestListener:ServletRequestListener会在每次客户端请求到达服务器时起作用,并在服务器响应完成后销毁。具体来说,当客户端发送请求到达服务器时会触发requestInitialized()方法,开发者可以在这个方法中获取和处理请求相关的信息;当服务器响应完成后会触requestDestroyed()方法,开发者可以在这个方法中进行一些善后操作。
- HttpSessionListener:HttpSessionListener会在每次HttpSession创建和销毁时起作用。具体来说,当用户访问Web应用程序时,如果尚未创建HttpSession,会触发sessionCreated()方法,在这个方法中可以进行一些会话管理的操作;当HttpSession被销毁时,会触发sessionDestroyed()方法,在这个方法中可以进行一些会话清理的操作。
注意:监听器是通过在web.xml配置文件中声明来启用的。开发者需要在web.xml文件中添加相应的监听器声明,告诉Web容器要监听哪些事件,并指定相应的监听器类。
常见的监听器
- ServletContextListener:监听ServletContext对象的创建和销毁事件,当Web应用程序启动和关闭时触发。
- ServletRequestListener:监听ServletRequest对象的创建和销毁事件,在每次客户端请求到达服务器时触发。
- HttpSessionListener:监听HttpSession对象的创建和销毁事件,当用户与Web应用程序建立和关闭会话时触发。
- ServletContextAttributeListener:监听ServletContext中属性的添加、修改和删除事件。
- ServletRequestAttributeListener:监听ServletRequest中属性的添加、修改和删除事件。
- HttpSessionAttributeListener:监听HttpSession中属性的添加、修改和删除事件。
- HttpSessionActivationListener:监听HttpSession对象的钝化(passivation)和活化(activation)事件,与分布式会话(Distributed Session)有关。
- ServletRequestListener:监听ServletContext对象的创建和销毁事件,以及请求的开始和完成。
- ServletContextListener:监听ServletContext对象的创建和销毁事件,与Web应用程序的启动和关闭有关。
举例
ServletContextListener
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 应用程序启动时执行的初始化操作
System.out.println("应用程序已启动");
// 加载配置文件、初始化数据库连接池等
// ...
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 应用程序关闭时执行的清理操作
System.out.println("应用程序即将关闭");
// 关闭数据库连接池、释放资源等
// ...
}
}
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
ServletContextAttributeListener
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
// 当ServletContext属性被添加时执行的操作
String attributeName = event.getName();
Object attributeValue = event.getValue();
System.out.println("ServletContext属性 " + attributeName + " 添加,值为: " + attributeValue);
// 其他处理逻辑
// ...
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
// 当ServletContext属性被移除时执行的操作
String attributeName = event.getName();
Object attributeValue = event.getValue();
System.out.println("ServletContext属性 " + attributeName + " 被移除,值为: " + attributeValue);
// 其他处理逻辑
// ...
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
// 当ServletContext属性被替换时执行的操作
String attributeName = event.getName();
Object oldAttributeValue = event.getValue();
Object newAttributeValue = event.getServletContext().getAttribute(attributeName);
System.out.println("ServletContext属性 " + attributeName + " 被替换,旧值为: " + oldAttributeValue + ",新值为: " + newAttributeValue);
// 其他处理逻辑
// ...
}
}
HttpSessionListener
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// 当HttpSession被创建时执行的操作
System.out.println("HttpSession被创建,ID: " + se.getSession().getId());
// 其他处理逻辑
// ...
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 当HttpSession被销毁时执行的操作
System.out.println("HttpSession被销毁,ID: " + se.getSession().getId());
// 其他处理逻辑
// ...
}
}
HttpSessionAttributeListener
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
// 当向HttpSession中添加属性时执行的操作
System.out.println("属性已添加:名称:" + event.getName() + ",值:" + event.getValue());
// 其他处理逻辑
// ...
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// 当从HttpSession中移除属性时执行的操作
System.out.println("属性已移除:名称:" + event.getName() + ",值:" + event.getValue());
// 其他处理逻辑
// ...
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// 当替换HttpSession中的属性时执行的操作
System.out.println("属性已替换:名称:" + event.getName() + ",旧值:" + event.getValue() + ",新值:" + event.getSession().getAttribute(event.getName()));
// 其他处理逻辑
// ...
}
}
ServletRequestListener
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
// 页面请求到达时执行的操作
System.out.println("收到新请求");
// 记录请求信息,如URL、参数等
// ...
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// 页面请求处理完成后执行的操作
System.out.println("请求处理完成");
// 清理操作,如释放资源
// ...
}
}
ServletRequestAttributeListener
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent event) {
// 当向ServletRequest中添加属性时执行的操作
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
System.out.println("属性已添加:名称:" + event.getName() + ",值:" + event.getValue() + ",请求URL:" + request.getRequestURL());
// 其他处理逻辑
// ...
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent event) {
// 当从ServletRequest中移除属性时执行的操作
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
System.out.println("属性已移除:名称:" + event.getName() + ",值:" + event.getValue() + ",请求URL:" + request.getRequestURL());
// 其他处理逻辑
// ...
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent event) {
// 当替换ServletRequest中的属性时执行的操作
HttpServletRequest request = (HttpServletRequest) event.getServletRequest();
System.out.println("属性已替换:名称:" + event.getName() + ",旧值:" + event.getValue() + ",新值:" + request.getAttribute(event.getName()) + ",请求URL:" + request.getRequestURL());
// 其他处理逻辑
// ...
}
}