@Weblistener注解简介
`@WebListener`是Java Servlet 3.0引入一个标准注解(Annotation)
用于声明一个类为Web应用的监听器(Listener)
它可以监听Web应用的生命周期事件和HTTP会话、
请求等状态变化
替代传统`web.xml`中 `<listener>`配置方式
使开发者可以更简洁地定义监听逻辑
`@WebListener`注解主要功能
功能 | 描述 |
声明监听器类 | 标记某个类为监听器,自动注册到 Web 容器中 |
监听应用启动/关闭事件 | 如 `ServletContextListener` |
监听会话创建/销毁事件 | 如 `HttpSessionListener` |
监听请求开始/结束事件 | 如 `ServletRequestListener` |
监听属性变更事件 | 如 `ServletContextAttributeListener`、`HttpSessionAttributeListener` |
`@WebListener`注解定义(简化版)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.Runtime)
public @interface WebListener {
String value() default "";
}
- `value()`:可选描述信息,通常不使用
例 1:监听 Web 应用启动和关闭(`ServletContextListener`)
@WebListener
public class AppContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Web 应用启动中...");
ServletContext context = sce.getServletContext();
context.setAttribute("appStartTime", System.currentTimeMillis());
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Web 应用正在关闭...");
}
}
例 2:监听用户会话创建与销毁(`HttpSessionListener`)
@WebListener
public class SessionCounterListener implements HttpSessionListener {
private static int activeSessions = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
activeSessions++;
System.out.println("新会话创建,当前在线人数:" + activeSessions);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
activeSessions--;
System.out.println("会话销毁,当前在线人数:" + activeSessions);
}
}
例 3:监听请求开始与结束(`ServletRequestListener`)
@WebListener
public class RequestLoggerListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
System.out.println("请求开始: " + request.getRequestURI());
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
System.out.println("请求结束: " + request.getRequestURI());
}
}
例 4:监听会话属性变化(`HttpSessionAttributeListener`)
@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("会话属性添加: " + event.getName() + "=" + event.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("会话属性移除: " + event.getName());
}
@Override
public void attributereplaced(HttpSessionBindingEvent event) {
System.out.println("会话属性替换: " + event.getName());
}
}
`@WebListener`注解与 `web.xml` 对比
使用`web.xml`传统写法
<listener>
<listener-class>com.example.AppContextListener</listener-class>
</listener>
<listener>
<listener-class>com.example.SessionCounterListener</listener-class>
</listener>
常见的监听器类型
监听器接口 | 功能描述 |
`ServletContextListener` | 监听 Web 应用启动和关闭 |
`HttpSessionListener` | 监听会话创建和销毁 |
`ServletRequestListener` | 监听请求开始和结束 |
`ServletContextAttributeListener` | 监听上下文属性添加、删除、替换 |
`HttpSessionAttributeListener` | 监听会话属性变化 |
`HttpSessionActivationListener` | 监听会话激活与钝化(分布式会话迁移) |
`HttpSessionBindingListener` | 监听对象绑定或解绑到会话的过程 |