Listener 监听对象的创建和销毁
HttpSessionListener、ServletContextListener、ServletRequestListener分别用于控制Session、context、request的创建和销毁。触发时机分别为:
- HttpSessionListener:监听Session的创建和销毁。创建session时执行sessionCreated(HttpSessionEvent se)方法。超时或者执行session.invalidate()时执行sessionDestroyed(HttpSessionEvent se)方法。该Listener用于收集在线者信息。
- ServletContextListener:监听context的创建和销毁。context代表当前的web应用程序。服务器启动或者热部署war包时执行contextInitialized(ServletContextEvent event)方法。服务器关闭或者只关闭该web时会执行contextDestoryed(ServletContextEvent event)方法。该Listener可用于获取web.xml里配置的初始化参数。
- ServletRequestListener:监听request的创建和销毁。用户每次请求request都会执行requestInitialized(ServletRequestEvent event)方法。request处理完毕自动销毁前执行requestDestoryed(ServletRequestEvent event)方法。如果一个HTML页面内含有多个图片,则请求一次HTML页面可能会出发多次request事件。
package linstener; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class LinstenerTest implements HttpSessionListener, ServletContextListener, ServletRequestListener { private Log log =LogFactory.getLog(this.getClass());
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
//销毁Request时调用
HttpServletRequest request=(HttpServletRequest)arg0.getServletRequest();
long time=System.currentTimeMillis()-(long)request.getAttribute("dateCreated");
log.info(request.getRemoteAddr()+"请求处理结束,用时"+time+"毫秒。");
} @Override
public void requestInitialized(ServletRequestEvent arg0) { //创建Request时调用
HttpServletRequest request=(HttpServletRequest) arg0.getServletRequest();
String uri=request.getRequestURI();
uri=request.getQueryString()==null?uri:(uri+"?"+request.getQueryString());
request.setAttribute("dateCreated", System.currentTimeMillis());
log.info("IP:"+request.getRemoteAddr()+" 请求 "+uri);
} @Override
public void contextDestroyed(ServletContextEvent arg0) {
//销毁Servlet上下文时调用
ServletContext servletContext=arg0.getServletContext();
log.info("即将关闭"+servletContext.getContextPath());
} @Override
public void contextInitialized(ServletContextEvent arg0) {
//加载Servlet上下文时调用
ServletContext servletContext=arg0.getServletContext();
log.info("即将启动"+servletContext.getContextPath());
} @Override
public void sessionCreated(HttpSessionEvent arg0) {
//创建session时调用
HttpSession session =arg0.getSession();
log.info("新创建一个session,ID为:"+session.getId());
} @Override
public void sessionDestroyed(HttpSessionEvent arg0) {
//销毁session前调用
HttpSession session =arg0.getSession();
log.info("销毁一个session,ID为:"+session.getId());
} }
Listener类web.xml文件中的配置:
<listener>
<listener-class>
linstener.LinstenerTest
</listener-class>
</listener>
Listener 监听对象的创建和销毁的更多相关文章
- Java监听器中ServletRequestListener监听Request的创建和销毁
ServletRequest和HttpServletRequest的区别 HttpServletRequest和ServletRequest都是接口,HttpServletRequest继承自Serv ...
- Listener 监听对象的属性变化
Listener用于监听Session.context.Request的属性变化,接口名称格式为xxxAttributeListener,包括HttpSessionAttributeListener. ...
- javaWeb学习之Listener监听
] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet listener filt ...
- Listener 监听Session内的对象
Listener用于监控Session内的对象,分别是HttpSessionBindingListener与HttpSessionActivationListener.它们的触发时机分别为: Http ...
- Proxy监听对象的数据变化,处理绑定数据很有用
Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作.一下子让我们对一个对象有了很强的追踪能力,同时在数据绑定方面也很有用处. }; //interceptor 拦截 var ...
- AngularJS - Watch 监听对象
<body> <div ng-app="myApp"> <div ng-controller="firstController"& ...
- java多个listener监听
java 多个listener 监听方法 在class 名称上一行添加@Listeners 括号中用逗号隔开 @Listeners({com.example.MyListener.class,com. ...
- [ Java学习基础 ] Java对象的创建和销毁
类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别 ...
- 在vue中使用watch监听对象或数组
最近发现在vue中使用watch监听对象或者数组时,当数组或者对象只是单一的值改变时,并不会出发watch中的事件. 在找问题过程中,发现当数组使用push一类的方法时,会触发watch,如果只是单一 ...
随机推荐
- Winform开发框架之通用高级查询模块--SNF快速开发平台3.3-Spring.Net.Framework
最近项目确实忙,但也是一直忙于有关项目和框架技术的事情,也一直致力于改善我的WInform开发框架.使得自己及客户使用起来更加方便,更加友好,更加高效. 在很多程序模块中都很常见,也是给客户扩展查询的 ...
- linux分享二:Linux如何修改字符集
问题: 当在项目中用到服务器端导出并且查询条件中包含汉字时,总是导出失败,Excel中出现null字样,如何解决方法呢? 解决方法: 把linux的字符集改变一下. 路径:etc/sysconfig/ ...
- ios 精简日历
网上其他人写的日历类功能都很齐全,比较繁杂,对于想看看日历基础实现然后自己绘制日历的我来说不太方便,就自己整理了一个极精简的日历出来,大家看了之后应该能多少理解日历该怎么自定义,很简单. 我的小dem ...
- python argparse详解
1.argparse模块作用 用于解析命令行参数 2.位置参数和可选参数 运行以下代码: import argparse parser = argparse.ArgumentParser() args ...
- 【FastDFS】FastDFS在CentOS的搭建
准备安装软件 [root@blog third_package]# cp fastdfs-nginx-module_v1.16.tar.gz FastDFS_v5.08.tar.gz libfastc ...
- 【数据库】悲观锁与乐观锁与MySQL的MVCC实现简述
悲观锁 悲观锁,就是一种悲观心态的锁,每次访问数据时都会锁定数据: 乐观锁 乐观锁,就是一种乐观心态的锁,每次访问数据时并不锁定数据,期待数据并没作修改,如果数据没被修改则作具体的业务 应用程序上使用 ...
- 【Android】HAL分析
HAL概述 以下是基于android4.0.3,对应其他低版本的代码,可能有所差异,但基本大同小异. Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚 ...
- 【C/C++】void指针知多少
void指针 void指针平时用的地方不多,但是不代表它不重要 #include <stdio.h> typedef ]; //指针数组的指针类型 int main(void) { voi ...
- Asp.Net上传大文件带进度条swfupload
Asp.Net基于swfupload上传大文件带进度条百分比显示,漂亮大气上档次,大文件无压力,先看效果 一.上传效果图 1.上传前界面:图片不喜欢可以自己换 2.上传中界面:百分比显示 3.上传后返 ...
- Jenkins自动化构建python nose测试
[本文出自天外归云的博客园] 简介 通过Jenkins自动化构建python nose测试分两步: 1. 创建节点(节点就是执行自动化测试的机器): 2. 创建任务并绑定节点(用指定的机器来跑我们创建 ...