listener叫监听器,它用来监听容器内的一些变化,如session的创建,销毁,servlet容器的创建销毁等。当这些内容变化产生时,监听器就要完成一些工作。这是观察者设计模式的典型使用场景
先建立一个软件包listenter 专门放listener功能的类 比如:OneLineCountListener
首先要implements(实现)HttpSessionListener接口
重写sessionCreated和sessionDestroyed方法
sessionCreated是session创建的时候 会执行sessionCreated中代码
sessionDestroyed是session被摧毁的时候 会执行sessionDestroyed中代码
session什么时候被摧毁呢?
默认情况下 tomcat中的session会在内存中默认存储30分钟 30分钟之后这个session在内存当中会被彻底移除
而我们在浏览器当中关闭之后 session是不会消失的 而是会一直留着
那为什么浏览器关掉会找不到session呢?
是因为前端的id搞丢了
这是一个统计在线人数的listener
注解:@WebListener 当我们Tomcat启动的时候会自动的帮我们标注的注解的类 运作起来 然后监听整个程序的session session被创建的时候就会被触发
相当于就是观察者 会一直在盯着HttpSession 只要有新的session被创建就会被触发
有旧的session消失了就会触发session被摧毁的代码
se.getSession() 获取当前创建的session
访问量监听的是请求 这时要监听请求request
需要实现ServletRequestListener接口
小案例:
public class OnlineCountListener implements HttpSessionListener {// session被创建时调用@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("一个session被创建");ServletContext application = se.getSession().getServletContext();Object visitCount = application.getAttribute("onlineCount");if(visitCount == null){application.setAttribute("onlineCount",1);} else {if(visitCount instanceof Integer){Integer count = (Integer) visitCount;application.setAttribute("onlineCount",count+1);} else {throw new RuntimeException("您的数据有误!");}}}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("一个session被销毁了");ServletContext application = se.getSession().getServletContext();Object visitCount = application.getAttribute("onlineCount");if(visitCount instanceof Integer){Integer count = (Integer) visitCount;application.setAttribute("onlineCount",Math.max(count - 1,0));} else {throw new RuntimeException("您的数据有误!");}}}
public class VisitCountListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {ServletContext application = sre.getServletContext();Object visitCount = application.getAttribute("visitCount");if(visitCount == null){application.setAttribute("visitCount",1);} else {if(visitCount instanceof Integer){Integer count = (Integer) visitCount;application.setAttribute("visitCount",count+1);} else {throw new RuntimeException("您的数据有误!");}}}}
<listener><listener-class>com.ydlclass.VisitCountListener</listener-class><listener-class>com.ydlclass.OnlineCountListener</listener-class></listener>
