1 基本概念
javaweb中的监听器是Servlet规范中定义的一种特殊的类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
2 Servlet监听器的分类
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
a 监听域对象自身的创建和销毁的事件监听器。
b 监听域对象中的属性的增加和删除的事件监听器。
c 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
3 监听ServletContext,HttpSession,ServletRequest域对象的创建和销毁
ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。
当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。
当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
ServletContext域对象创建和销毁时机:
创建:服务器启动针对每一个Web应用创建ServletContext
销毁:服务器关闭前先关闭代表每一个web应用的ServletContext
范例:写一个HelloServletContextListener监听器demo,同时implements(实现) ServletContextListener,ServletRequestListener,HttpSessionListener接口。
1 package listener; 2 3 import javax.servlet.ServletContextEvent; 4 import javax.servlet.ServletContextListener; 5 import javax.servlet.ServletRequestEvent; 6 import javax.servlet.ServletRequestListener; 7 import javax.servlet.http.HttpSessionEvent; 8 import javax.servlet.http.HttpSessionListener; 9 10 public class HelloServletContextListener implements ServletContextListener,ServletRequestListener,HttpSessionListener{ 11 12 @Override 13 public void contextDestroyed(ServletContextEvent arg0) { 14 System.out.println("context被销毁"+arg0.getServletContext()); 15 16 } 17 18 @Override 19 public void contextInitialized(ServletContextEvent arg0) { 20 System.out.println("context被创建"+arg0.getServletContext()); 21 22 } 23 24 @Override 25 public void sessionCreated(HttpSessionEvent session) { 26 System.out.println("sesion被创建"+session.getSession().getId());//测试获取的sessionId 27 28 } 29 30 @Override 31 public void sessionDestroyed(HttpSessionEvent arg0) { 32 System.out.println("sesiont被销毁"); 33 } 34 35 @Override 36 public void requestDestroyed(ServletRequestEvent arg0) { 37 System.out.println("ruquest被销毁"); 38 39 } 40 41 @Override 42 public void requestInitialized(ServletRequestEvent arg0) { 43 System.out.println("ruquest被创建"); 44 45 } 46 47 }
4 在web.xml注册监听器,配置如下,监听器是所有Servlet配置中最简单的配置,只需要配置全类名就可以直接映射了。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 6 <listener> 7 <listener-class> listener.HelloServletContextListener</listener-class> 8 </listener> 9 </web-app>
5 经过以上2个步骤,我们完成了监听器的编写和注册,下面进行测试HttpSession,写一个index.jsp页面
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'index.jsp' starting page</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 <!-- 19 <link rel="stylesheet" type="text/css" href="styles.css"> 20 --> 21 </head> 22 23 <body> 24 hello page<br> 25 访问页面就创建的id: ${pageContext.session.id } 26 </body> 27 </html>
6 前台页面访问效果以及后台输出的ID值展示
总结,在前台访问一个新的页面,会立即产生一个ID,同时也会调用ServletContext,HttpSession和ServletRequest的创建方法,从而具备监听作用。