【监听器】
监听器就是监听某个域对象状态变化的组件 【相关概念】 事件源:被监听的对象(三个域对象 request、session、servletContext(也就是application)) 监听器:监听事件源对象事件源对象的状态的变化都会触发监听器 注册监听器:将监听器与事件源进行绑定 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码) 【使用】 加注解 :@WebListener 可以监听ServletContext、HttpSession、ServletRequest 监听器有 3 类 8 种 1、监听生命周期 ServletRequestListener HttpSessionListener ServletContextListener 2、监听值的变化 ServletRequestAttributeListener HttpSessionAttributeListener ServletContextAttributeListener 3、针对Session 中的对象 监听Session中的java对象(javaBean),是javaBean实现监听器的接口 根据监听的类型选择实现的接口
实例:
监听页面在线人数
当有用户访问时,会去创建session对象 ,人数+1
当有用户退出时,会销毁对应session对象 ,人数-1
注:
当你登录的时候也就是创建session的时候会+1,但是你退出浏览器的时候session仍然存在,并不会-1。
你可以通过session.invalidate(); 去销毁session;
你要是想要达到关闭浏览器去销毁session可以通过js
< body οnbefοreunlοad=“window.location=‘loginout.jsp’” >
在 loginout.jsp 中写 <% session.invalidate();%>
目前知道的就这些,上面那个方法只能在IE中可行。
如果有更好的方式,欢迎评论
import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class Onlinecountlistener implements HttpSessionListener { private int onlineNumber = 0; @Override public void sessionCreated(HttpSessionEvent se) { // 如果将值设置到session作用域中 范围太小 页面刷新时 在线人数并不更新 // 所以设置到更大的作用域application也就是ServletContext作用域中 // 这里获取ServletContext 为了就是这个 onlineNumber++; ServletContext servletContext = se.getSession().getServletContext(); servletContext.setAttribute("onlineNumber", onlineNumber); } @Override public void sessionDestroyed(HttpSessionEvent se) { onlineNumber--; ServletContext servletContext = se.getSession().getServletContext(); servletContext.setAttribute("onlineNumber", onlineNumber); } }