JavaWeb监听器

来源:互联网 发布:淘宝代练可靠吗 编辑:程序博客网 时间:2024/06/07 01:30

简介

  • 监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
  • Servlet 监听器:Servlet 规范中定义的一种特殊类,它用于监听 web 应用程序中的 ServletContext, HttpSession 和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

Servlet 监听器的分类


按监听的事件类型 Servlet 监听器可分为如下三种类型:
  1. 监听域对象自身的创建和销毁的事件监听器
  2. 监听域对象中的属性的增加和删除的事件监听器
  3. 监听绑定到 HttpSession 域中的某个对象的状态的事件监听器

编写 Servlet 监听器


监听域对象的创建和销毁


域对象创建和销毁的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象的创建和销毁事件的监听器。
域对象的创建和销毁时机


ServletContextListener 接口

ServletContextListener 是最常用的 Listener, 可以在当前 WEB 应用被加载时对当前 WEB 应用的相关资源进行初始化操作: 创建数据库连接池, 创建 Spring 的 IOC 容器, 读取当前 WEB 应用的初始化参数 ...
  • ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。
  • 当 ServletContext 对象被创建时,激发contextInitialized (ServletContextEvent sce)方法
  • 当 ServletContext 对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法

API:
// SerlvetContext 对象被创建(即, 当前 WEB 应用被加载时)的时候, Servlet 容器调用该方法. 
public void contextInitialized(ServletContextEvent sce) 


// SerlvetContext 对象被销毁之前(即, 当前 WEB 应用被卸载时)的时候, Servlet 容器调用该方法. 
public void contextDestroyed(ServletContextEvent sce) 

ServletContextEvent 中的: getServletContext() 获取 ServletContext 

HttpSessionListener 接口

  • HttpSessionListener 接口用于监听HttpSession对象的创建和销毁
  • 创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
  • 销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。 


ServletRequestListener接口

  • ServletRequestListener 接口用于监听ServletRequest 对象的创建和销毁
  • 创建一个ServletRequest 对象时,激发requestInitialized(ServletRequestEvent sre)方法
  • 销毁一个Session时,激发requestDestroyed(ServletRequestEvent sre)方法。

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 HelloServletContextListner implements ServletContextListener, ServletRequestListener, HttpSessionListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("ServletContext 对象被创建。 " + sce.getServletContext());}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("ServletContext 对象被销毁。" + sce.getServletContext());}@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("HttpSession 被创建。");}       @Overridepublic void sessionDestroyed(HttpSessionEvent se) {// TODO Auto-generated method stubSystem.out.println("HttpSession 被销毁");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {// TODO Auto-generated method stubSystem.out.println("ServletRequest 被销毁");}@Overridepublic void requestInitialized(ServletRequestEvent sre) {// TODO Auto-generated method stubSystem.out.println("ServletRequest 被创建");}}

注册监听器
<listener><listener-class>com.XXX.HelloServletContextListner</listener-class></listener>

域对象中属性的变更的事件监听器

  • 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
  • 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同 

attributeAdded 方法

当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded 方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
各个域属性监听器中的完整语法定义为:
  1. public void attributeAdded(ServletContextAttributeEvent scae) 
  2. public void attributeReplaced(HttpSessionBindingEvent  hsbe) 
  3. public void attributeRmoved(ServletRequestAttributeEvent srae)
attributeRemoved 方法

当删除被监听对象中的一个属性时,web 容器调用事件监听器的这个方法进行相应
各个域属性监听器中的完整语法定义为:
  1. public void attributeRemoved(ServletContextAttributeEvent scae) 
  2. public void attributeRemoved (HttpSessionBindingEvent  hsbe) 
  3. public void attributeRemoved (ServletRequestAttributeEvent srae)

attributeReplaced 方法

当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的这个方法进行相应
各个域属性监听器中的完整语法定义为:

  1. public void attributeReplaced(ServletContextAttributeEvent scae) 
  2. public void attributeReplaced (HttpSessionBindingEvent  hsbe) 
  3. public void attributeReplaced (ServletRequestAttributeEvent srae)
public class TestAttributeListener implements ServletContextAttributeListener,ServletRequestAttributeListener, HttpSessionAttributeListener{@Overridepublic void attributeAdded(ServletRequestAttributeEvent srae) {System.out.println("向 request 中添加了一个属性: " + srae.getName() + ": " + srae.getValue());}@Overridepublic void attributeRemoved(ServletRequestAttributeEvent srae) {System.out.println("从 request 中移除了一个属性: " + srae.getName() + ": " + srae.getValue());}@Overridepublic void attributeReplaced(ServletRequestAttributeEvent srae) {System.out.println("request 中属性替换了: " + srae.getName() + ": " + srae.getValue());}@Overridepublic void attributeAdded(ServletContextAttributeEvent scab) {// TODO Auto-generated method stub}@Overridepublic void attributeRemoved(ServletContextAttributeEvent scab) {// TODO Auto-generated method stub}@Overridepublic void attributeReplaced(ServletContextAttributeEvent scab) {// TODO Auto-generated method stub}@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {// TODO Auto-generated method stub}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {// TODO Auto-generated method stub}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {// TODO Auto-generated method stub}}
<body><% request.setAttribute("name", "ABCD");System.out.println("-----------------------------");request.setAttribute("name", "DEFG");System.out.println("-----------------------------");request.removeAttribute("name");System.out.println("-----------------------------");%></body>
<listener>  <listener-class>com.XXX.TestAttributeListener</listener-class></listener>

感知 Session 绑定的事件监听器

  • 保存在 Session 域中的对象可以有多种状态:绑定到  Session 中;从 Session 域中解除绑定;随 Session 对象持久化到一个存储设备中;随 Session 对象从一个存储设备中恢复
  • Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean 对象了解自己在 Session 域中的这些状态:HttpSessionBindingListener接口和HttpSessionActivationListener接口 ,实现这两个接口的类不需要 web.xml 文件中进行注册

HttpSessionBindingListener接口

1). 监听实现了该接口的 Java 类的对象被绑定到 session 或从 session 中解除绑定的事件.

//当前对象被绑定到 session 时调用该方法public void valueBound(HttpSessionBindingEvent event) //当前对象从 session 中解除绑定调用该方法public void valueUnbound(HttpSessionBindingEvent event) 

2). 注意: 该监听器不需要在 web.xml 文件中进行配置. 

HttpSessionActivationListener接口

1). 监听实现了该接口和 Serializable 接口的 Java 类的对象随 session 钝化和活化事件


> 活化: 从磁盘中读取 session 对象

> 钝化: 向磁盘中写入 session 对象

> session 对象存储在tomcat 服务器的 work\Catalina\localhost\contextPath 目录下. SESSION.SER

2). 该监听器不需要在 web.xml 文件中进行配置. 

public class Customer implements HttpSessionBindingListener, HttpSessionActivationListener,implements serializable{private String time;public void setTime(String time) {this.time = time;}/** *  */private static final long serialVersionUID = 1L;@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("绑定到 session");Object value = event.getValue();System.out.println(value == this);System.out.println(event.getName()); }@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("从 sessoin 中解除绑定");}@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {System.out.println("从内存中写到磁盘上...");}@Overridepublic void sessionDidActivate(HttpSessionEvent se) {System.out.println("从磁盘中读取出来...");}@Overridepublic String toString() {return super.toString() + ", time: " + time;}}
<body><h4>HttpSessionBindingListener</h4><%-- Customer customer = new Customer();session.setAttribute("customer", customer);System.out.println("------------------------");session.removeAttribute("customer");--%><% Customer customer = (Customer)session.getAttribute("customer");if(customer == null){customer = new Customer();customer.setTime("" + new Date()); session.setAttribute("customer", customer);System.out.println("创建一个新的 Customer 对象: " + customer + ", 并放入到 session 中");}else{System.out.println("从 session 中读取到 Customer 对象: " + customer);}%></body>

域对象的生命周期

request: 是一个请求, 当一个响应返回时, 即被销毁. 当发送一个请求时被创建. 注意, 请求转发的过程是一个 request 对象.重定向是两个请求


session: 当第一次访问 WEB 应用的一个 JSP 或 Servlet 时, 且该 JSP 或 Servlet 中还需要创建 session 对象. 此时服务器会创建一个 session 对象. 


 session 销毁: session 过期, 直接调用 session 的 invalidate 方法, 当前 web 应用被卸载(session 可以被持久化).
 
 * 关闭浏览器, 并不意味着 session 被销毁, 还可以通过 sessionid 找到服务器中的 session 对象.  
    JSESSIONID=F4119DE0FC93ED38E8EC83B24CFA3B81
    http://localhost:8989/javaweb/session.jsp;jsessionid=F4119DE0FC93ED38E8EC83B24CFA3B81


application:
贯穿于当前的 WEB 应用的生命周期. 当前 WEB 应用被加载时创建 application 对象, 当前 WEB 应用被卸载时销毁 application 对象.

0 0
原创粉丝点击