`
lee79
  • 浏览: 106061 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

Listener 监听器

 

  前言:之前写了一篇关于Filter的文章:http://tianweili.github.io/blog/2015/01/26/java-filter/,现在再来一篇Listener的,Filter和Listener在项目中是经常用到的,巧妙的使用可以达到事半功倍的效果。故把两者的用法总结一下。

  原文链接:http://tianweili.github.io/blog/2015/01/27/java-listener/

1、Listener的定义与作用

  监听器Listener就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

  Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

2、Listener的分类与使用

  主要有以下三类:

  1、ServletContext监听

  ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。

public void contextInitialized(ServletContextEvent sce);//上下文初始化
public void contextDestroyed(ServletContextEvent sce);//上下文销毁

public ServletContext getServletContext();//ServletContextEvent事件:取得一个ServletContext(application)对象

  ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。

public void attributeAdded(ServletContextAttributeEvent scab);//增加属性
public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除
public void attributeRepalced(ServletContextAttributeEvent scab);//属性替换(第二次设置同一属性)

//ServletContextAttributeEvent事件:能取得设置属性的名称与内容
public String getName();//得到属性名称
public Object getValue();//取得属性的值

  2、Session监听

  Session属于http协议下的内容,接口位于javax.servlet.http.*包下。

  HttpSessionListener接口:对Session的整体状态的监听。

public void sessionCreated(HttpSessionEvent se);//session创建
public void sessionDestroyed(HttpSessionEvent se);//session销毁

//HttpSessionEvent事件:
public HttpSession getSession();//取得当前操作的session

  HttpSessionAttributeListener接口:对session的属性监听。

public void attributeAdded(HttpSessionBindingEvent se);//增加属性
public void attributeRemoved(HttpSessionBindingEvent se);//删除属性
public void attributeReplaced(HttpSessionBindingEvent se);//替换属性

//HttpSessionBindingEvent事件:
public String getName();//取得属性的名称
public Object getValue();//取得属性的值
public HttpSession getSession();//取得当前的session

  session的销毁有两种情况:

  1、session超时,web.xml配置:

<session-config>
    <session-timeout>120</session-timeout><!--session120分钟后超时销毁-->
</session-config>

  2、手工使session失效

public void invalidate();//使session失效方法。session.invalidate();

  3、Request监听

  ServletRequestListener:用于对Request请求进行监听(创建、销毁)。

public void requestInitialized(ServletRequestEvent sre);//request初始化
public void requestDestroyed(ServletRequestEvent sre);//request销毁

//ServletRequestEvent事件:
public ServletRequest getServletRequest();//取得一个ServletRequest对象
public ServletContext getServletContext();//取得一个ServletContext(application)对象

  ServletRequestAttributeListener:对Request属性的监听(增删改属性)。

public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除
public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换(第二次设置同一属性)

//ServletRequestAttributeEvent事件:能取得设置属性的名称与内容
public String getName();//得到属性名称
public Object getValue();//取得属性的值

  4、在web.xml中配置

  Listener配置信息必须在Filter和Servlet配置之前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都优先,而销毁比Servlet和Filter都慢。

<listener>
    <listener-class>com.listener.class</listener-class>
</listener>

3、Listener应用实例

  1、利用HttpSessionListener统计最多在线用户人数

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class HttpSessionListenerImpl implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent event) {
        ServletContext app = event.getSession().getServletContext();
        int count = Integer.parseInt(app.getAttribute("onLineCount").toString());
        count++;
        app.setAttribute("onLineCount", count);
        int maxOnLineCount = Integer.parseInt(app.getAttribute("maxOnLineCount").toString());
        if (count > maxOnLineCount) {
            //记录最多人数是多少
            app.setAttribute("maxOnLineCount", count);
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //记录在那个时刻达到上限
            app.setAttribute("date", df.format(new Date()));
        }
    }
    //session注销、超时时候调用,停止tomcat不会调用
    public void sessionDestroyed(HttpSessionEvent event) {
        ServletContext app = event.getSession().getServletContext();
        int count = Integer.parseInt(app.getAttribute("onLineCount").toString());
        count--;
        app.setAttribute("onLineCount", count);    
        
    }
}

  2、Spring使用ContextLoaderListener加载ApplicationContext配置信息

  ContextLoaderListener的作用就是启动Web容器时,自 动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个 监听器,启动容器时,就会默认执行它实现的方法。

  ContextLoaderListener如何查找 ApplicationContext.xml的配置位置以及配置多个xml:如果在web.xml中不写任何参数配置信息,默认的路径是"/WEB- INF/applicationContext.xml",在WEB-INF目录下创建的xml文件的名称必须是 applicationContext.xml(在MyEclipse中把xml文件放置在src目录下)。如果是要自定义文件名可以在web.xml里 加入contextConfigLocation这个context参数。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/applicationContext-*.xml</param-value><!-- 采用的是通配符方式,查找WEB-INF/spring目录下xml文件。如有多个xml文件,以“,”分隔。 -->
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

  3、Spring使用Log4jConfigListener配置Log4j日志

  Spring使用Log4jConfigListener的好处:

  1. 动态的改变记录级别和策略,不需要重启Web应用。
  2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。因为系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了。
  3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。
  4. 设置log4jRefreshInterval时间,开一条watchdog线程每隔段时间扫描一下配置文件的变化。
<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>project.root</param-value><!-- 用于定位log文件输出位置在web应用根目录下,log4j配置文件中写输出位置:log4j.appender.FILE.File=${project.root}/logs/project.log -->
</context-param>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value><!-- 载入log4j配置文件 -->
</context-param>
<context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>60000</param-value><!--Spring刷新Log4j配置文件的间隔60秒,单位为millisecond-->
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

  4、Spring使用IntrospectorCleanupListener清理缓存

  这个监听器的作用是在web应用关闭时刷新JDK的JavaBeans的Introspector缓存,以确保Web应用程序的类加载器以及其加载的类正确的释放资源。

  如果JavaBeans的Introspector已被用来分析应用程序类, 系统级的Introspector缓存将持有这些类的一个硬引用。因此,这些类和Web应用程序的类加载器在Web应用程序关闭时将不会被垃圾收集器回 收!而IntrospectorCleanupListener则会对其进行适当的清理,已使其能够被垃圾收集器回收。

  唯一能够清理Introspector的方法是刷新整个Introspector缓存,没有其他办法来确切指定应用程序所引用的类。这将删除所有其他应用程序在服务器的缓存的Introspector结果。

  在使用Spring内部的bean机制时,不需要使用此监听器,因为 Spring自己的introspection results cache将会立即刷新被分析过的JavaBeans Introspector cache,而仅仅会在应用程序自己的ClassLoader里面持有一个cache。虽然Spring本身不产生泄漏,注意,即使在Spring框架的 类本身驻留在一个“共同”类加载器(如系统的ClassLoader)的情况下,也仍然应该使用使用 IntrospectorCleanupListener。在这种情况下,这个IntrospectorCleanupListener将会妥善清理 Spring的introspection cache。

  应用程序类,几乎不需要直接使用JavaBeans Introspector,所以,通常都不是Introspector resource造成内存泄露。相反,许多库和框架,不清理Introspector,例如: Struts和Quartz。

  需要注意的是一个简单Introspector泄漏将会导致整个Web应用程 序的类加载器不会被回收!这样做的结果,将会是在web应用程序关闭时,该应用程序所有的静态类资源(比如:单实例对象)都没有得到释放。而导致内存泄露 的根本原因其实并不是这些未被回收的类!

  注意:IntrospectorCleanupListener应该注册为 web.xml中的第一个Listener,在任何其他Listener之前注册,比如在Spring's ContextLoaderListener注册之前,才能确保IntrospectorCleanupListener在Web应用的生命周期适当时机 生效。

<!-- memory clean -->
<listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

 原文链接:http://tianweili.github.io/blog/2015/01/27/java-listener/

 

1、org.springframework.web.context.ContextLoaderListener

ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。至于ApplicationContext.xml这个配置文件部署在哪,如何配置多个xml文件,书上都没怎么详细说明。现在的方法就是查看它的API文档。在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。看看它的API说明

第一段说明ContextLoader可以由 ContextLoaderListener和ContextLoaderServlet生成。如果查看ContextLoaderServlet的API,可以看到它也关联了ContextLoader这个类而且它实现了HttpServlet。这个接口

第二段,ContextLoader创建的是 XmlWebApplicationContext这样一个类,它实现的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->BeanFactory这样一来spring中的所有bean都由这个类来创建

第三段,讲如何部署applicationContext的xml文件,如果在web.xml中不写任何参数配置信息,默认的路径是”/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:

1. <context-param>
2. <param-name>contextConfigLocation</param-name>
3. <param-value>
4. /WEB-INF/classes/applicationContext-*.xml
5. </param-value>
6. </context-param>

在<param-value> </param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并一“,”号分隔。上面的applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。

由此可见applicationContext.xml的文件位置就可以有两种默认实现:

第一种:直接将之放到/WEB-INF下,之在web.xml中声明一个listener、

第二种:将之放到classpath下,但是此时要在web.xml中加入<context-param>,用它来指明你的applicationContext.xml的位置以供web容器来加载。按照 Struts2 整合spring的官方给出的档案,写成:

1. <!-- Context Configuration locations for Spring XML files -->
2. <context-param>
3. <param-name>contextConfigLocation</param-name>
4. <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>
5. </context-param>

分享到:
评论

相关推荐

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    ### web.xml文件中配置(servlet, spring, filter, listener)的加载顺序 在Java Web应用开发中,`web.xml`文件是整个Web应用程序的核心配置文件之一,它定义了Servlet容器如何启动、初始化以及配置各个组件如...

    Spring 3.0 整合Ibatis 3

    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; ``` 这里需要注意的是,作者提到使用 Eclipse 的 User library 出现了问题,解决方法是直接将所需的库文件...

    SpringBoot整合Listener的两种方式.docx

    在Spring Boot应用中,整合Listener主要是为了监听应用的生命周期事件,例如在应用启动或关闭时执行特定的操作。这里我们讨论两种整合Listener的方式。 ### 方式一:通过注解扫描完成Listener组件的注册 1. **创建...

    基于netty + SpringBoot仿照dubbo手动实现RPC远程本地无感知调用项目源码

    反射,SpringListener 配置,负债均衡随机算法。 通过Spring注解形式启用RPC,接口暴露扫描,Rpc接口注解引用。 等等 ​ 该版本实现到的功能:服务注册、服务发现、服务断开注册中心自动剔除服务、多个提供者可...

    基于Spring的listener和Task

    在Spring框架中,Listener和Task是两种非常关键的组件,它们在后端开发中起着至关重要的作用。本文将深入探讨这两个概念以及如何在实际应用中利用它们。 首先,我们来了解一下Spring的Listener。在Java Web开发中,...

    Android代码-AnimationMenu

    Rebound库提供了SpringSystem、Spring、SpringListener等关键类。SpringSystem是整个系统的基础,负责管理所有的Spring,并处理时间步进。Spring则是模拟弹簧行为的对象,它有初始位置、目标位置、阻尼系数、刚度...

    spring-listener-0.0.1-SNAPSHOT.jar

    spring内置监听者demo

    有弹性的ScrollView&ListView&HorizontalScrollView

    `Rebound`库提供了一系列物理模型,如SpringSystem、Spring、SpringListener等,用于创建复杂的物理动画。SpringSystem是整个系统的管理器,可以创建和管理多个Spring;Spring则模拟了现实世界中的弹簧,可以通过...

    Spring ApplicationListener的使用详解

    Spring ApplicationListener的使用详解 Spring ApplicationListener是Spring事件机制的一部分,通常与ApplicationEvent抽象类结合完成ApplicationContext的事件通知机制。下面我们将详细介绍Spring Application...

    spring-kafka-batch-listener.zip

    在本文中,我们将深入探讨Spring Kafka的批量监听器(Batch Listener)特性,以及如何实现Kafka消息的顺序消费。Spring Kafka是Spring框架的一个模块,它提供了与Apache Kafka集成的能力,让我们能够轻松地在Java...

    JMS与Spring之二(用message listener container异步收发消息)

    JMS与Spring之二(用message listener container异步收发消息) 在本文中,我们将探讨使用 message listener container 在 Spring 框架中异步收发 JMS 消息的方法。Message listener container 是 Spring 提供的一...

    Spring注入Filter与Listener的方法.png

    Spring注入Filter与Listener的方法.png

    SSH框架配置

    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; ``` ##### 3.2 Spring上下文参数配置 在`web.xml`中还需要指定Spring配置文件的位置。 ```xml ...

    ssh框架整合步骤

    -- Spring Listener --&gt; &lt;listener&gt; &lt;listener-class&gt; org.springframework.web.context.ContextLoaderListener &lt;/listener-class&gt; &lt;/listener&gt; &lt;!-- Struts2 Filter Dispatcher --&gt; &lt;filter-name&gt;struts2...

    facebook rebound开源库

    3. **SpringListener**: 这个接口允许开发者监听Spring状态的变化,例如当Spring达到稳定状态或者正在振动时,可以通过回调方法进行相应的操作,比如更新UI。 4. **PhysicsWorld**: 它是一个容器,用来管理一组...

    Android-Android实现回弹效果的Scrollview

    在自定义ScrollView中,我们需要创建一个SpringListener来处理回弹过程中的事件,并根据Spring的状态调整ScrollView的滚动位置: ```java public class BounceScrollView extends ScrollView { private ...

    Spring ApplicationListener监听器用法详解

    Spring ApplicationListener监听器用法详解 本文主要介绍了Spring框架中的ApplicationListener监听器的用法详解,通过示例代码对 listeners 的实现和使用进行了详细的讲解,对大家的学习或者工作具有一定的参考学习...

    Spring Boot的listener(监听器)简单使用实例详解

    "Spring Boot的listener(监听器)简单使用实例详解" 在Spring Boot中,listener(监听器)是一种非常重要的组件,它可以帮助我们在应用程序启动和停止时执行一些特定的任务。今天,我们将详细介绍Spring Boot的...

    Tomcat中--Error listenerStart错误的解决方案

    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; ``` 如果使用的是Spring Boot,则通常不需要显式地在`web.xml`中配置`ContextLoaderListener`。 ##### 2....

    self-entertainment:在线花店,消息中间件,springcloud,spring,sharding-jdbc,springboot,netty源码,vue,elasticsearch,lucene,mybatis,jpa

    包括aop,自定义注释解,springmvc,jpa + hibernate,springlistener,@预定定时任务,过滤器的简单实用,包括简单的登录权限验证,设备crud功能cloud模块没得说,主要是亲手建造一整套springcloud服务,包括常用的...

Global site tag (gtag.js) - Google Analytics