一、概述
监听器是Servlet规范中定义的一种特殊类,当时间发生时会自动触发相应的事件。
监听器主要用于监听ServletContext、HttpSession、ServletRequest等域对象的创建和销毁事件以及对象中属性发生修改的事件。
- ServletContext的域对象是application。
- HttpSession的域对象是session。
- ServletRequest的域对象是request。
二、接口
根据监听对象分类
- ServletContextListener、ServletContextAttributeListener
- HttpSessionListener、HttpSessionAttributeListener
- ServletRequestListener、ServletRequestAttributeListener
根据监听事件分类
- HttpSessionListener、ServletContextListener、ServletRequestListener
- HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener
- HttpSessionBindingListener、HttpSessionActivationListener
三、代码实例
实现统计在线人数功能。
Servlet源代码。
//LoginServlet.java package servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String user = req.getParameter("user"); HttpSession session = req.getSession(); session.setAttribute("user", user); resp.sendRedirect("online.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } //LogoutServlet.java package servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class LogoutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("user"); resp.sendRedirect("index.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
监听器源代码。
package listener; import user.OnlineGroup; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class OnlineListener implements HttpSessionListener, HttpSessionAttributeListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println(String.format("session %s created!", se.getSession().getId())); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println(String.format("session %s destroyed!", se.getSession().getId())); } @Override public void attributeAdded(HttpSessionBindingEvent se) { String user = String.valueOf(se.getValue()); OnlineGroup.add(user); System.out.println(String.format("session %s added %s: %s", se.getSession().getId(), se.getName(), se.getValue())); } @Override public void attributeRemoved(HttpSessionBindingEvent se) { String user = String.valueOf(se.getValue()); OnlineGroup.remove(user); System.out.println(String.format("session %s removed %s: %s", se.getSession().getId(), se.getName(), se.getValue())); } @Override public void attributeReplaced(HttpSessionBindingEvent se) { String oldUser = String.valueOf(se.getValue()); String newUser = String.valueOf(se.getSession().getAttribute(se.getName())); OnlineGroup.remove(oldUser); OnlineGroup.add(newUser); System.out.println(String.format("session %s replaced %s: %s", se.getSession().getId(), se.getName(), newUser)); } }
配置文件源代码。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置Servlet--> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>servlet.LoginServlet</servlet-class> </servlet> <servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>servlet.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping> <!--配置监听器--> <listener> <listener-class>listener.OnlineListener</listener-class> </listener> </web-app>