文档章节

Servlet Listener(监听器)

_
 _Roger_
发布于 2016/01/27 16:13
字数 1785
阅读 42
收藏 3

一、基本概念

  JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

1.1 Servlet监听器的分类

  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象 

  Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

  • 监听域对象自身的创建和销毁的事件监听器。

  • 监听域对象中的属性的增加和删除的事件监听器。

  • 监听绑定到HttpSession域中的某个对象的状态的事件监听器。

二、域对象的监听器

2.1 监听ServletContext域对象的创建和销毁

  ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。

  • 当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。

  • 当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

  • ServletContext域对象创建和销毁时机: 

    创建:服务器启动针对每一个Web应用创建ServletContext 

    销毁:服务器关闭前先关闭代表每一个web应用的ServletContext

(1)编写监听器

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext对象创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象销毁");
    }

(2)web.xml文件中注册监听器

    我们在上面的中讲到,要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听,在JavaWeb中,监听的注册是在web.xml文件中进行配置的。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- 注册针对ServletContext对象进行监听的监听器 -->
  <listener>
      <description>ServletContextListener监听器</description>
      <!--实现了ServletContextListener接口的监听器类 -->
      <listener-class>me.gacl.web.listener.MyServletContextListener</listener-class>
  </listener>

</web-app>

2.2 监听HttpSession域对象的创建和销毁

HttpSessionListener 接口用于监听HttpSession对象的创建和销毁 

  • 创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法 

  • 销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。

(1)编写监听器

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println( se.getSession() + "创建了!!");
    }

    /* HttpSession的销毁时机需要在web.xml中进行配置,如下:
     * <session-config>
              <session-timeout>1</session-timeout>
          </session-config>
          这样配置就表示session在1分钟之后就被销毁
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session销毁了!!");
    }
}

(2)web.xml文件中注册监听器

<!--注册针对HttpSession对象进行监听的监听器-->
   <listener>
      <description>HttpSessionListener监听器</description>
      <listener-class>me.gacl.web.listener.MyHttpSessionListener</listener-class>
  </listener>
  <!-- 配置HttpSession对象的销毁时机 -->
  <session-config>
      <!--配置HttpSession对象的1分钟之后销毁 -->
      <session-timeout>1</session-timeout>
  </session-config>

2.3 监听ServletRequest域对象的创建和销毁

  ServletRequestListener接口用于监听ServletRequest 对象的创建和销毁 :

  • Request对象被创建时,监听器的requestInitialized(ServletRequestEvent sre)方法将会被调用 

  • Request对象被销毁时,监听器的requestDestroyed(ServletRequestEvent sre)方法将会被调用


  ServletRequest域对象创建和销毁时机: 

  • 创建:用户每一次访问都会创建request对象 

  • 销毁:当前访问结束,request对象就会销毁

(1)编写监听器

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class MyServletRequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println(sre.getServletRequest() + "销毁了!!");

    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println(sre.getServletRequest() + "创建了!!");
    }
}

(2)web.xml文件中注册监听器

<!--注册针对ServletRequest对象进行监听的监听器-->
   <listener>
       <description>ServletRequestListener监听器</description>
       <listener-class>me.gacl.web.listener.MyServletRequestListener</listener-class>
   </listener>

三、域对象中属性变更的监听器

    域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。 

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

    自己编写监听器后需要在web.xml中进行注册:

   <listener>
       <description>MyServletContextAttributeListener监听器</description>
       <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class>
   </listener>


3.1 attributeAdded 方法

    当向被监听对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象 。

    各个域属性监听器中的完整语法定义为:

 public void attributeAdded(ServletContextAttributeEvent scae)
 public void attributeAdded(HttpSessionBindingEvent  hsbe)
 public void attributeAdded(ServletRequestAttributeEvent srae)

3.2 attributeRemoved 方法

        当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应 

     各个域属性监听器中的完整语法定义为:

public void attributeRemoved(ServletContextAttributeEvent scae)
 public void attributeRemoved (HttpSessionBindingEvent  hsbe)
 public void attributeRemoved (ServletRequestAttributeEvent srae)

3.3 attributeReplaced 方法

       当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应 

  各个域属性监听器中的完整语法定义为:

public void attributeReplaced(ServletContextAttributeEvent scae)
 public void attributeReplaced (HttpSessionBindingEvent  hsbe)
 public void attributeReplaced (ServletRequestAttributeEvent srae)

四、感知Session绑定的事件监听器

    保存在Session域中的对象可以有多种状态:绑定(session.setAttribute(“bean”,Object))到Session中;从 Session域中解除(session.removeAttribute(“bean”))绑定;随Session对象持久化到一个存储设备中;随Session对象从一个存储设备中恢复 。

  Servlet 规范中定义了两个特殊的监听器接口“HttpSessionBindingListenerHttpSessionActivationListener”来帮助JavaBean 对象了解自己在Session域中的这些状态,实现这两个接口的类不需要 web.xml 文件中进行注册

4.1 HttpSessionBindingListener接口

    实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件: 

  • 当对象被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法 

  • 当对象从HttpSession对象中解除绑定时,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法

4.2 HttpSessionActivationListener接口

    实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)钝化(序列化)的事件 :

  • 当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被钝化(序列化)之前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。这样javabean对象就可以知道自己将要和HttpSession对象一起被序列化(钝化)到硬盘中

  • 当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被活化(反序列化)之后,web服务器调用该javabean对象的void sessionDidActive(HttpSessionEvent event)方法。这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中


本文转载自:http://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/

共有 人打赏支持
_
粉丝 29
博文 82
码字总数 39915
作品 0
武汉
web.xml 常用标签配置(转)

1.Web.xml作用: 每一个javaWeb工程都有一个web.xml配置文件,web.xml文件是用来初始化工程配置信息的,比如说welcome页面,filter,listener,servlet,servlet-mapping,启动加载级别等等,...

hxlzpnyist
2012/05/29
0
0
java web Servlet 使用 Application/ServletContext

本文介绍 怎么在Servlet Web应用 中 初始化 全局变量(ServletContext) ServletContext 也就是 java Servlet Web应用 里面的全局变量,当我们有时要做一些初始化配置是通常也是存在ServletCo...

JacCoffee
2013/10/19
0
3
web.xml中Filter,Listener,Servlet的区别

一、Servlet Servlet是基本的服务端程序,他来自接口Servlet,接口中有方法service。而Servlet的一个重要实现类,则是tomcat服务器的核心,那就是HttpServlet HttpServlet有方法: public a...

architect刘源源
05/04
0
0
综合技术 --maven web.xml详解

//参考 http://mianhuaman.iteye.com/blog/1105522 本项目的web.xml文件内容 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/d......

求是科技
2015/08/19
0
0
web工程中web.xml元素加载顺序以及配置实例

web工程中web.xml元素加载顺序以及配置实例 简介 web.xml是web工程的配置文件,容器加载web工程时,会首先从WEB-INF中查询web.xml,并加载其中的配置信息,可以将web.xml认为是web工程的入口...

jhon_n
2017/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
14
2
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部