listener配置
刚才看见一篇很好的文章,转载一下:
http://www.cnblogs.com/hellojava/archive/2012/12/26/2833840.html
以下文章完全为复制粘贴。
前言:之前写了一篇关于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的好处:
- 动态的改变记录级别和策略,不需要重启Web应用。
- 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。因为系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了。
- 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。
- 设置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>
listener配置相关推荐
- SpringBoot之Servlet、Filter、Listener配置
在SpringBoot中是不需要配置web.xml的,那么原来在web.xml中配置的Servlet.Filter.Listener现在怎么弄呢? SpringBoot提供了三种Bean Filter ...
- spring security 2.x HttpSessionEventPublisher 以及listener配置
在环境为spring security2.x时 *JDK6 spring 2* 正确的filter路径是:org.springframework.security.ui.session.HttpSes ...
- jms:listener配置字段解释
jms-listener 说明 subscription: 持久化订阅者名称, 设置这个属性,服务器每次重启后,都不会生成新的,一直只有这一个 destination: 监听的 topic 的值 ...
- oracle tns和sid,oracle tns listener配置 (附TNS介绍)
一.tnsnames.ora 用途:(用于客户端)告诉oracle client应该从哪连.连到哪.TEST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)( ...
- web.xml中的所有配置,Listener和Filter的加载顺序
web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人 ...
- Servlet监听器Listener
2019独角兽企业重金招聘Python工程师标准>>> 0.Listener是Servlet的一个功能组件: (1)用于application,session,request三个对象 ...
- tnsnames.ora和listener.ora文件中的几个概念
http://www.cnblogs.com/NickyYe/archive/2011/06/21/2086135.html 其实,在我们传统的概念里,数据库是一个统称的名字,在Oracle中,你可以 ...
- listener filter servlet_实战Spring Boot 2.0系列:Listener, Servlet和Filter
前言 用户认证授权.日志记录 MDC.编码解码.UA 检查.多端对应等都需要通过 拦截请求 来进行处理.这时就需要 Servlet.Filter.Listener.Interceptor 这几种组件. ...
- spring,springmvc,mybatis基本整合(一)--xml文件配置方式(1)
**这个整合.仅仅是最主要的整合,而且是xml配置文件的方式之中的一个,即当中的mybatis是採用非mapper接口的方式.(第二遍採用mapper接口方式.第三遍採用注解的方式:第四篇採用注解基于 ...
最新文章
- git config命令使用
- 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载四(使用程序载入事件)...
- Python 应用领域
- 算法分析与设计-实验二 动态规划算法设计
- 远程连接——Windows远程连接CentOS远程桌面
- Android硬件访问服务框架思想初识
- 人心散了、项目必然要败
- Python3——文件与异常
- 自动化测试——unittest编写接口测试用例
- ArcGIS的基本使用
- 千锋云计算毕业设计论文:论文设计任务书
- 免费天气API,天气JSON API,天气插件
- stm32定时器从模式解析
- 正则验证加js大全,真的很给力!!!很全啊有木有
- 就业协议书中的服务器是什么,就业协议书是什么?它有什么作用?
- Velocity User Guide 用户手册
- 出现跨域问题的原因及其解决方法
- 求最小公倍数【牛客网】
- 需求管理之需求分析的20条法则
- vue中identify(生成图片验证码)插件的配置和使用
热门文章
- 残酷的真相:低门槛的工作,带来低质量的生活
- 如何下载免费版XShell
- mysql创建用户表的sql语句_Mysql创建、删除用户和表的SQL语句
- excel计算机考试标注星期几,Excel中按照周次和星期自动计算并填入日期的方法...
- sigsuspend
- python抽象语法树_Python AST –抽象语法树
- javascript遍历set集合3种方式
- 如何在PowerPoint图表中编辑或删除数据
- Android 呼吸灯控制逻辑
- direct在计算机网络中是什么意思,wi-fi direct是什么意思