文档章节

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
武汉
私信 提问
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刘源源
2018/05/04
0
0
关于web.xml中配置listener的问题

web.xml文件如下: contextConfigLocation classpath:/spring-*.xml spring监听器 org.springframework.web.context.ContextLoaderListener spring mvc servlet springmvc org.springframewo......

gondor
2016/02/23
2.9K
4
spring3 ,spring3 mvc 配置文件整合问题,哪种配置更好?

正常的整合是要在web.xml里面配置spring监听器,spring mvc的dispath servlet,代码如下: Java代码 org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-I......

_凤求凰_
2014/01/07
2.4K
3
web工程中web.xml元素加载顺序以及配置实例

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

jhon_n
2017/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
今天
2
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
3
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部