listener叫监听器,它用来监听容器内的一些变化,如session的创建,销毁,servlet容器的创建销毁等。当这些内容变化产生时,监听器就要完成一些工作。这是观察者设计模式的典型使用场景

先建立一个软件包listenter 专门放listener功能的类 比如:OneLineCountListener
首先要implements(实现)HttpSessionListener接口
重写sessionCreatedsessionDestroyed方法
sessionCreated是session创建的时候 会执行sessionCreated中代码
sessionDestroyed是session被摧毁的时候 会执行sessionDestroyed中代码

session什么时候被摧毁呢?

默认情况下 tomcat中的session会在内存中默认存储30分钟 30分钟之后这个session在内存当中会被彻底移除
而我们在浏览器当中关闭之后 session是不会消失的 而是会一直留着
那为什么浏览器关掉会找不到session呢?
是因为前端的id搞丢了

这是一个统计在线人数的listenerimage.png

注解:@WebListener 当我们Tomcat启动的时候会自动的帮我们标注的注解的类 运作起来 然后监听整个程序的session session被创建的时候就会被触发
相当于就是观察者 会一直在盯着HttpSession 只要有新的session被创建就会被触发
有旧的session消失了就会触发session被摧毁的代码
se.getSession() 获取当前创建的session

访问量监听的是请求 这时要监听请求request
需要实现ServletRequestListener接口

小案例:

  1. public class OnlineCountListener implements HttpSessionListener {
  2. // session被创建时调用
  3. @Override
  4. public void sessionCreated(HttpSessionEvent se) {
  5. System.out.println("一个session被创建");
  6. ServletContext application = se.getSession().getServletContext();
  7. Object visitCount = application.getAttribute("onlineCount");
  8. if(visitCount == null){
  9. application.setAttribute("onlineCount",1);
  10. } else {
  11. if(visitCount instanceof Integer){
  12. Integer count = (Integer) visitCount;
  13. application.setAttribute("onlineCount",count+1);
  14. } else {
  15. throw new RuntimeException("您的数据有误!");
  16. }
  17. }
  18. }
  19. @Override
  20. public void sessionDestroyed(HttpSessionEvent se) {
  21. System.out.println("一个session被销毁了");
  22. ServletContext application = se.getSession().getServletContext();
  23. Object visitCount = application.getAttribute("onlineCount");
  24. if(visitCount instanceof Integer){
  25. Integer count = (Integer) visitCount;
  26. application.setAttribute("onlineCount",Math.max(count - 1,0));
  27. } else {
  28. throw new RuntimeException("您的数据有误!");
  29. }
  30. }
  31. }
  1. public class VisitCountListener implements ServletRequestListener {
  2. @Override
  3. public void requestInitialized(ServletRequestEvent sre) {
  4. ServletContext application = sre.getServletContext();
  5. Object visitCount = application.getAttribute("visitCount");
  6. if(visitCount == null){
  7. application.setAttribute("visitCount",1);
  8. } else {
  9. if(visitCount instanceof Integer){
  10. Integer count = (Integer) visitCount;
  11. application.setAttribute("visitCount",count+1);
  12. } else {
  13. throw new RuntimeException("您的数据有误!");
  14. }
  15. }
  16. }
  17. }
  1. <listener>
  2. <listener-class>com.ydlclass.VisitCountListener</listener-class>
  3. <listener-class>com.ydlclass.OnlineCountListener</listener-class>
  4. </listener>