1. Servlet监听器 Servlet 事件监听器是一个实现了特定接口的 Java 程序,这个程序专门用于监听 Web 应用中 ServletContext、HttpSession 和 ServletRequest 等对象的创建和销毁过程、监听这些域对象属性的修改以及感知绑定到 HttpSession 域中的某个对象的状态。 Servlet 规范中定义了八种监听器,这八种监听器的类型及作用. 根据监听事件的不同,可以将表中的监听器分为如下三类 1.1 用于监听域对象创建和销毁的事件监听器(ServletContextListener 接口、HttpSessionListener 接口、ServletRequestListener 接口)。 1.2 用于监听域对象属性增加和删除的事件监听器(ServletContextAttributeListener 接口、HttpSessionAttributeListener 接口、ServletRequestAttributeListener 接口)。 1.3 用于监听绑定到 HttpSession 中某个对象状态的事件监听器(HttpSessionBindingListener 接口、HttpSessionActivationListener 接口) 在 Servlet 规范中,这三类事件监听器都定义了相应的接口,在编写事件监听器程序时只需实现对应的接口即可。在使用监听程序时,Web 服务器会根据监听器所实现的接口,把它注册到被监听的对象上,当触发了某个对象的监听事件时,Web 容器将会调用 Servlet 监听器与之相关的方法对事件进行处理。 2.HttpSessionListener监听器统计网站在线人数 在许多网站或者软件应用中都有统计当前在线人数这一功能。在通常情况下,当一个用户进入网站时就会创建一个 HttpSession 对象,而当用户离开网站时,HttpSession 对象就会被销毁。在 Servlet 的八种监听器中,HttpSessionListener 监听器就可以监听 Web 应用中 HttpSession 对象的创建和销毁过程。因此,可以使用实现了 HttpSessionListener 接口的监听器统计网站的当前在线人数。 2.1 创建监听器[新建一个java类实现HttpSessionListener接口,重写方法]
package qing; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * HttpSessionListener接口监听HttpSession对象的创建和销毁 */ public class OnlineListener implements HttpSessionListener { private int count = 0; // 用于统计在线人数变量 @Override public void sessionCreated(HttpSessionEvent hse) { count++; // Session对象创建时count变量加1 ServletContext context = hse.getSession().getServletContext(); context.setAttribute("count", new Integer(count)); } @Override public void sessionDestroyed(HttpSessionEvent hse) { count--; // Session对象创建时count变量减1 ServletContext context = hse.getSession().getServletContext(); context.setAttribute("count", new Integer(count)); } } package qing; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HomeServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head><meta charset=\"utf-8\"><title>HomeServlet</title></head>"); out.println("<body><center>"); Object obj = req.getSession().getServletContext().getAttribute("count"); int count = (int) obj; out.println("<h1>当前在线人数:" + count + "</h1>"); out.println("<h2><a href=\"logout\">安全退出</a></h2>"); out.println("</center></body>"); out.println("</html>"); out.close(); } } package qing; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Parameter; public class LogOutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().invalidate(); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head><meta charset=\"utf-8\"><title>LogOutServlet</title></head>"); out.println("<body><center>"); out.println("<h1>你已经退出本系统!</h1>"); out.println("</center></body>"); out.println("</html>"); out.close(); } }web.xml 配置
<listener> <listener-class>qing.OnlineListener</listener-class> </listener> <servlet> <servlet-name>home</servlet-name> <servlet-class>qing.HomeServlet</servlet-class> </servlet> <servlet> <servlet-name>logout</servlet-name> <servlet-class>qing.LogOutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>home</servlet-name> <url-pattern>/home</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>logout</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping>测试:http://localhost:8080/home
安全退出以后的效果