Java中的监听器
servlet的技术规范包括三个:servlet,listener,filter,今天记录一下listener的学习。
监听器就是监听某个对象的状态变化的技术。监听器包括事件源,监听器,注册监听器以及响应行为四个部分。
事件源即被监听的对象。
监听器是监听事件源对象的状态变化。
注册监听器即将监听器与事件源关联起来。
响应行为即监听到事件源所触发的动作。
监听器按照不同的划分方式可以分为多种
1,按照监听的对象不同可分为HttpRequest域,HttpSession域和ServletContext域。
2,按照监听的状态可分为监听域对象的创建与销毁,属性状态的变化。(这两点可归纳为监听三大域对象的创建与销毁及其属性的状态变化)
3,其它监听器
ServletContext域 | HttpSession域 | ServletRequest域 | |
域对象的创建与销毁 | ServletContextListener | HttpSessionListener | ServletRequestListener |
域对象属性状态的变化 | ServletContextAttributeListener | HttpSessionAttributeListener | ServletRequestAttributeListener |
一,三大域对象的监听器
此三大域对象的监听器的使用方法:
-
-
- 创建类实现监听器接口
- 实现接口中监听的方法
- 注册监听器即在配置文件中把监听器也事件源关联起来
-
1,ServletContext域对象的监听器
A,ServletContextListener监听器
此监听器主要用来监听ServletContextListener的创建与销毁即服务器的创建与销毁,它的主要作用是初始化对象例如加载数据库驱动,连接池的初始化等;加载一些初始化的配置文件如spring的一些内容等;任务调度,如定时器等
下面演示一下此监听器的用法:
1 package com.zw.listener; 2 3 import javax.servlet.ServletContextEvent; 4 import javax.servlet.ServletContextListener; 5 6 public class MyServletContextListener implements ServletContextListener { 7 8 @Override 9 public void contextDestroyed(ServletContextEvent sce) { 10 System.out.println("ServletContext被创建了"); 11 } 12 13 @Override 14 public void contextInitialized(ServletContextEvent sce) { 15 System.out.println("ServletContext被销毁了"); 16 } 17 18 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 5 id="WebApp_ID" version="2.5"> 6 <display-name>ListenerDemo</display-name> 7 <welcome-file-list> 8 <welcome-file>index.html</welcome-file> 9 <welcome-file>index.htm</welcome-file> 10 <welcome-file>index.jsp</welcome-file> 11 <welcome-file>default.html</welcome-file> 12 <welcome-file>default.htm</welcome-file> 13 <welcome-file>default.jsp</welcome-file> 14 </welcome-file-list> 15 <listener> 16 <listener-class>com.zw.listener.MyServletContextListener</listener-class> 17 </listener> 18 </web-app>
B,ServletContextAttributeListener监听器
1 package com.zw.listener; 2 3 import javax.servlet.ServletContextAttributeEvent; 4 import javax.servlet.ServletContextAttributeListener; 5 6 public class MyServletContextAttributeListener implements ServletContextAttributeListener { 7 8 @Override 9 public void attributeAdded(ServletContextAttributeEvent scae) { 10 System.out.println(scae.getServletContext().getServletContextName() + "被添加了属性"); 11 } 12 13 @Override 14 public void attributeRemoved(ServletContextAttributeEvent scae) { 15 System.out.println(scae.getServletContext().getServletContextName() + "被移除了属性"); 16 } 17 18 @Override 19 public void attributeReplaced(ServletContextAttributeEvent scae) { 20 System.out.println(scae.getServletContext().getServletContextName() + "被修改了属性"); 21 } 22 23 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 5 id="WebApp_ID" version="2.5"> 6 <display-name>ListenerDemo</display-name> 7 <welcome-file-list> 8 <welcome-file>index.html</welcome-file> 9 <welcome-file>index.htm</welcome-file> 10 <welcome-file>index.jsp</welcome-file> 11 <welcome-file>default.html</welcome-file> 12 <welcome-file>default.htm</welcome-file> 13 <welcome-file>default.jsp</welcome-file> 14 </welcome-file-list> 15 <listener> 16 <listener-class>com.zw.listener.MyServletContextListener</listener-class> 17 </listener> 18 <listener> 19 <listener-class>com.zw.listener.MyServletContextAttributeListener</listener-class> 20 </listener> 21 <servlet> 22 <servlet-name>servletDemo1</servlet-name> 23 <servlet-class>com.zw.servlet.ServletDemo</servlet-class> 24 </servlet> 25 <servlet-mapping> 26 <servlet-name>servletDemo1</servlet-name> 27 <url-pattern>/servlet1</url-pattern> 28 </servlet-mapping> 29 </web-app>
1 package com.zw.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletContext; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class ServletDemo extends HttpServlet { 12 13 @Override 14 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 15 ServletContext servletContext = req.getServletContext(); 16 servletContext.setAttribute("name", "张三"); 17 servletContext.setAttribute("name", "李四"); 18 servletContext.removeAttribute("name"); 19 } 20 21 @Override 22 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 23 24 doGet(req, resp); 25 } 26 27 }
另外两个监听对象属性状态的监听器的实现方式与此相同,以下不再演示
2,HttpSession域对象的监听器
HttpSessioinListener监听器用来监听Session的创建与销毁,其操作方法是实现此接口然后实现其中的方法,注册监听器当访问一个JSP页面时有Session被创建,此监听器内创建Session的方法被调用;当Session过期或被销毁则此监听器Sessioni销毁的方法被调用。
3,ServletRequest域对象的监听器
ServletRequestListener监听器用来监听每一次请求调用请求创建时的方法,当请求结束时,调用销毁的方法;操作方法也是实现此接口,实现其中的方法,然后注册监听器。
二,其它监听器
与Session中绑定的对象相关的监听器(对象感知监听器),该监听器分为两大类,四种状态
A:HttpSessionBindingLinstener此监听器监听将对象绑定到Session中与将对象从Session中解顷的事件
B:HttpSessionActivationLinstener此监听器可将Session中的对象钝化到硬盘上以及从硬盘上读取Session中的对象
这两种监听器不需要注册,直接用一个类实现这两个接口,实现其中的方法即可。
HttpSessionBindingLinstener监听器演示如下:
1 package com.zw.listener; 2 3 import javax.servlet.http.HttpSessionBindingEvent; 4 import javax.servlet.http.HttpSessionBindingListener; 5 6 public class Student implements HttpSessionBindingListener { 7 8 @Override 9 public void valueBound(HttpSessionBindingEvent event) { 10 11 System.out.println("Student被绑定到Session中了"); 12 } 13 14 @Override 15 public void valueUnbound(HttpSessionBindingEvent event) { 16 System.out.println("Student从Session中解绑了"); 17 } 18 19 }
此时,把Student这个对象添加到Session中便全触被绑定的方法,当remove时便全触发解绑的方法
HttpSessionActivationListener监听器演示如下:
1 package com.zw.listener; 2 3 import java.io.Serializable; 4 5 import javax.servlet.http.HttpSessionActivationListener; 6 import javax.servlet.http.HttpSessionBindingEvent; 7 import javax.servlet.http.HttpSessionBindingListener; 8 import javax.servlet.http.HttpSessionEvent; 9 10 public class Student implements HttpSessionActivationListener, Serializable { 11 12 @Override 13 public void sessionDidActivate(HttpSessionEvent se) { 14 System.out.println("Student被活化了"); 15 } 16 17 @Override 18 public void sessionWillPassivate(HttpSessionEvent se) { 19 System.out.println("Student被钝化了"); 20 } 21 22 }
此监听器监听的对象需要实现序列化接口,因为需要被存储到硬盘上,以上操作当Student被放入Sessioni中,服务器停止时便把Student对象存储到了硬盘上,当重新启动服务器时,Session中的Student便被活化了
但是钝化与活化Session里的对象,不能总停止与启动服务器,可通过配置文件指定Session多久没有操作便钝化,当用户再次使用程序时活化Session,具体操作如下:
1,在META-INF文件下创建context.xml文件,此文件名固定,此文件中的内容如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Context> 3 <!-- maxIdleSwap:session中的对象多长时间不使用就钝化 --> 4 <!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 --> 5 <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> 6 <Store className="org.apache.catalina.session.FileStore" 7 directory="zw205" /> 8 </Manager> 9 </Context>
此时经过一分钟不操作,Session中的对象便被钝化到指定的目录下了,再次操作时是从此文件内拿Session中的对象的