文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
4分钟前
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
38分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部