Servlet监听器的总结,仅为个人的理解
一、ServletContext
1、ServletContextListener
当ServletContext初始化时Servlet容器会调用所有已部署的ServletContextListener的contextInitialized()方法
当ServletContext销毁时,Servlet容器会调用所有部署的ServletContextListener的contextDestory()方法
package javaweb.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class PeopleCountListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 已创建"+sce.toString());
// ServletContext 已创建javax.servlet.ServletContextEvent
// [source=org.apache.catalina.core.ApplicationContextFacade@1a994d1]
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 已销毁"+sce.toString());
// ServletContext 已销毁javax.servlet.ServletContextEvent
// [source=org.apache.catalina.core.ApplicationContextFacade@1a994d1]
}
}
就是在web程序启动的时候,所有在web.xml中配置的Lintener都要进行初始化,就会调用Initialized方法。同理在web程序关闭的时候要注销所有的Lintener,在注销之前或调用Destory方法
监听Servlet初始化和销毁的时机,进行准备和清理的工作
2、ServletContextAttributeLintener
当一个ServletContext的属性被添加删除或者替换时,这个接口的实现类会收到相应的消息
package javaweb.web.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class ServletContextAttribute implements ServletContextAttributeListener {
//ServletContext属性添加所响应的方法
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("Add Attribute"+event.getName()+"="+event.getValue());
}
//ServletContext属性删除所响应的方法
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("Remove Attribute"+event.getName()+"="+event.getValue());
}
//ServletContext属性被替换所响应的方法
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("Replace Attribute"+event.getName()+"="+event.getValue());
}
}
使用场景为:监听ServletContext的属性操作
二、Session Listener
HttpSession相关的监听接口有四个!
1、HttpSessionListener:监听HttpSession的创建/销毁
可以通过监听HttpSession的数量来统计并发用户的在线数量
package javaweb.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.concurrent.atomic.AtomicInteger;
//同时实现两个接口,ServletContextListener负责根据web程序的启动创建和销毁“在线人数”属性
//HttpSessionListener负责监听session的创建和注销事件,并及时的对“在线人数”属性的数值做修改
public class HttpSession implements HttpSessionListener,ServletContextListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
//通过事件拿到对应用户的Session,通过Session获取ServletContext中的动态Web属性userCount
//使用原子操作的Integer,避免线程不安全
AtomicInteger userCount = (AtomicInteger) se.getSession()
.getServletContext().getAttribute("userCount");
//用户数加一
System.out.println("session user online = "+userCount.incrementAndGet());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//和上面的方法思路一样
AtomicInteger userCount = (AtomicInteger) se.getSession().getServletContext()
.getAttribute("userCount");
//用户数减一
System.out.println("session online = "+userCount.decrementAndGet());
}
@Override
public void contextInitialized(ServletContextEvent sce) {
* sce.getServletContext().setAttribute("userCount",new AtomicInteger(0));
System.out.println("ServletContext has Init:userCount = 0");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
sce.getServletContext().removeAttribute("userCount");
System.out.println("ServletContext has close!");
}
}
2、HttpSessionAttributeListener
和ServletContextAtributeListener一样,只不过它响应的是HttpSession范围的属性添加、删除、替换事件。
3、HttpSessionBindingListener
用来捆绑监听Session
从监听范围上来讲,HttpSessionAttributeListener在web.xml中设置一次就可以监听到所有的session
但是HttpSessionBindingListener是和Session一对一的
所以HttpSessionBindingListener具有一定的优势,让每一个Session都对应一个Listener,这样就不用像
HttpsessionListenter每次都去session中读取用户属性,维护性更强
4、HttpSessionActivationListener
实现会话的持久化,一般来说在服务器关闭的时候Session的时候用户的session就不见了,假设用户正在
服务器上工作,服务器突然关闭了,就造成很大的损失。所以就要实现会话的持久化
就是即使在重新启动了Session的时候用户的session还是存在。就是在服务器关闭的时候,把用户的session存储到硬盘了(钝化),这样
session就会被存储下来。服务器重新启动的时候,再把session从内存中读取出来,这个操作叫做活化,所以用户的信息就不会丢失了。
三、ServletRequest
1、ServletRequestListener
响应一个ServletRequest的创建或者删除
package javaweb.web.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class MyServletRequest implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
ServletRequest request = sre.getServletRequest();
long starttime = (long) request.getAttribute("start");
long end_time = System.nanoTime();
String URL = ((HttpServletRequest)request).getRequestURI();
System.out.println("Request:"+URL+"costtime:"+(end_time-starttime)/1000+"ms");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
long time = System.nanoTime();
ServletRequest servletRequest = sre.getServletRequest();
servletRequest.setAttribute("start",time);
}
}
8.ServletRequestAttributeListener:响应ServletR0equest范围的属性添加,删除,修改事件
类似于HttpSessionAttributeListener
四、常用的八大Servlet监听器:
request:
RequestListener:监听请求
RequestAttributeListener:监听请求中属性的增删改
Servlet:
ServletContextListener:监听web程序
ServletContextAttributeListener:监听共享属性的增删改
Session:
HttpSessionListener:监听session对象的添加和删除
HttpSessionAttributeListener:监听Session中属性的增删改
HttpSessionActivationListener:session持久化
HttpSessionBindingListener:捆绑监听session,一对一
事件类关系图(不存在HttpSessionAttributeEvent事件)
注意:如果监听器的事件类型含有子类的事件类型,那么如果子类的事件类型发生,那么此监听器也会产生响应。
先总结到这里,希望大佬能给出一些指点,本人对这里的了解不是很深。