多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Listener ## 简介 监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。 Servlet 监听器:Servlet 规范中定义的一种特殊类,它用于监听 web 应用程序中的 **ServletContext**, **HttpSession** 和 **ServletRequest** 等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。 ### Servlet 监听器的分类 按监听的事件类型 Servlet 监听器可分为如下三种类型: --监听域对象自身的创建和销毁的事件监听器 --监听域对象中的属性的增加和删除的事件监听器 --监听绑定到 HttpSession 域中的某个对象的状态的事件监听器 ### HelloServletContextListener ~~~ package com.neusoft.javaweb.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class HelloServletContextListener implements ServletContextListener,HttpSessionListener,ServletRequestListener{ @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("Servlet被销毁"); } @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("Servlet被创建"); } @Override public void requestDestroyed(ServletRequestEvent arg0) { System.out.println("ServletRequest被销毁"); } @Override public void requestInitialized(ServletRequestEvent arg0) { System.out.println("ServletRequest被创建"); } @Override public void sessionCreated(HttpSessionEvent arg0) { System.out.println("HttpSession被创建"); } @Override public void sessionDestroyed(HttpSessionEvent arg0) { System.out.println("HttpSession被销毁"); } } ~~~ web.xml ~~~ <!-- 配置Listener --> <listener> <listener-class>com.neusoft.javaweb.listener.HelloServletContextListener</listener-class> </listener> ~~~ ServletContextListener是最常用的Listener,可以在当前WEB应用被加载时对当前WEB应用的相关资源进行初始化操作,例如:读取当前WEB应用的初始化参数。 ### 典型案例--使用Listener统计在线人数 hello.jsp ~~~ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Hello Page</h1> <a href="logout.jsp">logout...</a> </body> </html> ~~~ logout.jsp ~~~ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>已退出</h1> <% request.getSession().invalidate(); %> </body> </html> ~~~ NumberOfOnlineListener ~~~ package com.neusoft.javaweb.listener; import java.util.HashSet; import javax.servlet.ServletContext; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * Application Lifecycle Listener implementation class NumberOfOnlineListener * */ @WebListener public class NumberOfOnlineListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent sev) { // 1.获取在线人数 ServletContext context = sev.getSession().getServletContext(); HashSet<HttpSession> set = (HashSet<HttpSession>)context.getAttribute("onlineCount"); if(set == null) { set = new HashSet(); } set.add(sev.getSession()); // 跟新在线人数 context.setAttribute("onlineCount", set); System.out.println("在线人数:"+set.size()); } public void sessionDestroyed(HttpSessionEvent sev) { // 1.获取在线人数 ServletContext context = sev.getSession().getServletContext(); HashSet<HttpSession> set = (HashSet<HttpSession>)context.getAttribute("onlineCount"); set.remove(sev.getSession()); sev.getSession().invalidate(); context.setAttribute("onlineCount", set); System.out.println("在线人数:"+set.size()); } } ~~~