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被创建时调用
@Override
public 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("您的数据有误!");
}
}
}
@Override
public 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 {
@Override
public 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>