监听器
监听器是什么?
监听器就是一个在j2EE中的一个接口
监听器主要监听三大域对象(request、session、servletContext)
监听内容:
1.监听域对象的创建和销毁,也就是生命周期
2.监听域对象的属性添加,更新,移除动作
3.监听被加入域对象中的对象
下面写监听器的用法,创建一个监听器:
package com.zs.servlet; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionBindingEvent; public class ListenerDemo implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener { // Public constructor is required by servlet spec public ListenerDemo() { } /** * 初始化全局域对象,在tomcat被启动时执行,过滤器在后面被执行 * @param sce */ public void contextInitialized(ServletContextEvent sce) { System.out.println("初始化全局域对象"); } /** * 销毁全局域对象 * @param sce */ public void contextDestroyed(ServletContextEvent sce) { System.out.println("销毁全局与对象"); } /** * 创建session对象 * @param se */ public void sessionCreated(HttpSessionEvent se) { System.out.println("创建session对象"); } /** * 销毁session对象 * @param se */ public void sessionDestroyed(HttpSessionEvent se) { System.out.println("销毁session对象"); } /** * 添加共享数据 * @param sbe */ public void attributeAdded(HttpSessionBindingEvent sbe) { System.out.println("添加了一个共享数据"); } /** * 移除了共享数据 * @param sbe */ public void attributeRemoved(HttpSessionBindingEvent sbe) { System.out.println("移除了一个共享数据"); } /** * 替换共享数据 * @param sbe */ public void attributeReplaced(HttpSessionBindingEvent sbe) { System.out.println("共享数据被替换了"); } }
然后在创建servlet,并调用方法
package com.zs.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/login") public class ServletDemo extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); HttpSession session = req.getSession();//创建session对象 session.setAttribute("user", username);//添加共享数据 session.setAttribute("user","张三");//替换共享数据中的数据 session.removeAttribute("user");//移除共享数据 resp.sendRedirect("index.jsp"); } }
运行结果如下:
是在上一篇的项目基础上写的,所以显示了过滤器内的内容。
下面实现在线人数的统计功能。
要想实现统计在线人数,那么就要用到全局域对象,这里通过监听器来获取在线人数
package com.zs.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.*; public class ListenerDemo implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener { public ListenerDemo() { } /** * 初始化全局域对象,在tomcat被启动时执行,过滤器在后面被执行 * @param sce */ public void contextInitialized(ServletContextEvent sce) { System.out.println("初始化全局域对象"); } /** * 销毁全局域对象 * @param sce */ public void contextDestroyed(ServletContextEvent sce) { System.out.println("销毁全局与对象"); } /** * 创建session对象 * @param se */ public void sessionCreated(HttpSessionEvent se) { System.out.println("创建session对象"); } /** * 销毁session对象 * @param se */ public void sessionDestroyed(HttpSessionEvent se) { System.out.println("销毁session对象"); } /** * 添加共享数据 * @param sbe */ public void attributeAdded(HttpSessionBindingEvent sbe) { /** * 当添加一个共享数据(user)的时候,就表示有一个用户登陆了,在线人数就+1 */ HttpSession session = sbe.getSession();//获取session对象 ServletContext servletContext = session.getServletContext();//获取全局域对象 Object user = session.getAttribute("user"); if (user != null) { Integer count = (Integer) servletContext.getAttribute("count"); if (count == null) { count=0; } count++; servletContext.setAttribute("count", count); } } /** * 移除了共享数据 * @param sbe */ public void attributeRemoved(HttpSessionBindingEvent sbe) { Integer count = (Integer) sbe.getSession().getServletContext().getAttribute("count"); count--; sbe.getSession().getServletContext().setAttribute("count", count); } /** * 替换共享数据 * @param sbe */ public void attributeReplaced(HttpSessionBindingEvent sbe) { System.out.println("共享数据被替换了"); } }
index页面为:
退出系统servlet为:
package com.zs.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/exit") public class ExitServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().removeAttribute("user"); resp.sendRedirect("index.jsp"); } }
打开两个浏览器,分别登录注销测试。