监听器也是Java web的组件之一,监听域对象(request session 上下文对象)的创建和销毁,以及域对象属性的新增 修改 删除
监听器和过滤器以及servlet一样都是单例的
JavaWeb三大组件启动顺序
servlet filter listener
监听器先启动 过滤器启动 servlet启动
都是单例的,只有一个对象
监听器的作用:
事件发生前和发生后做一些处理
监听器使用场景
1.统计访问量
2.统计在线人数
3.系统初始化动作(数据库连接池的初始化)
监听域对象的接口
- ServletRequestListener request域对象的创建和销毁
代码演示:
方法1.使用web.xml配置
1.1 编写CusRequestListener 类实现ServletRequestListener接口
public class CusRequestListener implements ServletRequestListener {
public CusRequestListener(){
System.out.println("request域构造实例化...");
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
// System.out.println("监听-->request域销毁");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("监听-->request域创建");
}
}
2.2 配置web.xml
<listener>
<listener-class>com.codeyancy.listener.CusRequestListener</listener-class>
</listener>
方法2.使用注解配置
无需再配置web.xml文件,直接在实现接口的类上添加注解@WebListener
即可
@WebListener
public class CusRequestListener implements ServletRequestListener {
- HttpSessionListener session域对象的创建和销毁
@WebListener
public class CusSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("监听--->session域创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("监听--->session域销毁");
}
}
- ServletContextListener ServletContext域对象的创建和销毁
监听域对象属性的接口
- ServletRequestAttributeListener
代码演示:
@WebListener
public class CusRequestAttrListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
}
}
- HttpSessionAttributeListener
代码演示:
监听Session域对象的属性小案例
@WebListener
public class CusSessionAttrListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("新增了一个session属性");
String name = httpSessionBindingEvent.getName();
Object value = httpSessionBindingEvent.getValue();
System.out.println("新增了一个session属性名为:" + name);
System.out.println("新增了一个session属性值为:" + value);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
}
}
- ServletContextAttributeListener
通过监听request域对象统计网站访问量
前端jsp页面 (count.jsp)
<body>
当前网站的访问量为:${requestScope.num}
</body>
后端监听器代码
@WebListener
public class CusRequestListener implements ServletRequestListener {
private AtomicInteger count = new AtomicInteger(0);
public CusRequestListener(){
System.out.println("request域构造实例化...");
}
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
// System.out.println("监听-->request域销毁");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
count.incrementAndGet();
servletRequestEvent.getServletRequest().setAttribute("num",count);
System.out.println("监听-->request域创建");
}
}
结果:
客户端每发起一次请求,就会更新访问量: