代码语言:javascript复制【监听器】
监听器就是监听某个域对象状态变化的组件
【相关概念】
事件源:被监听的对象(三个域对象 request、session、servletContext(也就是application))
监听器:监听事件源对象事件源对象的状态的变化都会触发监听器
注册监听器:将监听器与事件源进行绑定
响应行为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码)
【使用】
加注解 :@WebListener
可以监听ServletContext、HttpSession、ServletRequest
监听器有 3 类 8 种
1、监听生命周期
ServletRequestListener
HttpSessionListener
ServletContextListener
2、监听值的变化
ServletRequestAttributeListener
HttpSessionAttributeListener
ServletContextAttributeListener
3、针对Session 中的对象
监听Session中的java对象(javaBean),是javaBean实现监听器的接口
根据监听的类型选择实现的接口
代码语言:javascript复制实例: 监听页面在线人数 当有用户访问时,会去创建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);
}
}