一、Listener生命周期

  listener是web三大组件之一,是servlet监听器,用来监听请求,监听服务端的操作。

  listener分为:(都是接口类,必须实现相应方法)

  1.生命周期监听器(3个)
      • ServletContextListener 

        • requestInitialized 在容器启动时被调用(在servlet被实例化前执行)
        • requestDestroyed 在容器销毁时调用(在servlet被销毁后执行)
      • HttpSessionListener
        • sessionCreated 在HttpSession创建后调用
        • sessionDestroyed 在HttpSession销毁前调用(执行session.invalidate();方法)
      • ServletRequestListener
        • requestDestroyed 在request对象创建后调用(发起请求)
        • requestInitialized 在request对象销毁前调用(请求结束)
  2.属性变化监听器(3个)
        • attributeAdded(ServletContextAttributeEvent event)  向appliction中添加属性时调用
        • attributeRemoved(ServletContextAttributeEvent event)  从appliction中删除属性时调用
        • attributeReplaced(ServletContextAttributeEvent event)  替换application中的属性时调用
      • HttpSessionAttributeListener
        • attributeAdded(HttpSessionBindingEvent event)
        • attributeRemoved(HttpSessionBindingEvent event)
        • attributeReplaced(HttpSessionBindingEvent event)
      • ServletRequestAttributeListener
        • attributeAdded(ServletRequestAttributeEvent event)
        • attributeRemoved(ServletRequestAttributeEvent event)
        • attributeReplaced(ServletRequestAttributeEvent event)

       以上监听器接口除了传参不同,方法名都是一样的。分别监听application,session,request对象的属性变化。

 3.session中指定类属性变化监听器(2)
      • HttpSessionBindingListener 

        • valueBound(HttpSessionBindingEvent event) 当该类实例设置进session域中时调用
        • valueUnbound(HttpSessionBindingEvent event) 当该类的实例从session域中移除时调用
      • HttpSessionActivationListener 
        • sessionWillPassivate(HttpSessionEvent se) 当对象session被序列化(钝化)后调用
        • sessionDidActivate(HttpSessionEvent se)  当对象session被反序列化(活化)后调用

            

二、测试范例

 1.生命周期监听:

  ServletContentAttribute_Listener.java

 public class ServletContentAttribute_Listener implements ServletContextListener {
/**
* ServletContextListener实现方法
* @param sce
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextListener初始化");
} public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener销毁");
}
}

  其他两个监听器类似,不在重复贴出。

  在web.xml中配置

 <!-- 监听器 -->
<!-- servlet监听器 -->
<listener>
<listener-class>study.myListener.ServletContentAttribute_Listener</listener-class>
</listener> <!-- session监听器 -->
<listener>
<listener-class>study.myListener.HttpSessionAttribute_Listener</listener-class>
</listener> <!-- request监听器-->
<listener>
<listener-class>study.myListener.ServletRequestAttribute_Listener</listener-class>
</listener>

  运行结果:

 

  

 2.属性监听:

  ServletContentAttribute_Listener.java

 public class ServletContentAttribute_Listener implements ServletContextAttributeListener{

     /**
* ServletContextAttributeListener实现方法
* @param event
*/
public void attributeAdded(ServletContextAttributeEvent event) {
String meg = MessageFormat.format("ServletContent添加属性:{0},属性值:{1}",event.getName(),event.getValue());
System.out.println(meg);
} public void attributeRemoved(ServletContextAttributeEvent event) {
String meg = MessageFormat.format("ServletContent删除属性:{0},属性值:{1}",event.getName(),event.getValue());
System.out.println(meg);
} public void attributeReplaced(ServletContextAttributeEvent event) {
String meg = MessageFormat.format("ServletContent替换属性:{0},属性值:{1}",event.getName(),event.getValue());
System.out.println(meg);
} }

  另外两个监听器类似,不在赘诉。接下来用jsp页面测试

  listenerDemo.jsp

 <%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2017/10/17
Time: 15:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>监听器设置</title>
</head>
<body>
<%
/**
* servlet监听
*/
application.setAttribute("name","changxiang");
application.setAttribute("name","小Cai先森");
application.removeAttribute("name"); /**
* session监听
*/
session.setAttribute("sessionName","changxiang");
session.setAttribute("sessionName","小Cai先森");
session.removeAttribute("sessionName");
session.invalidate();
/**
* request监听
*/
request.setAttribute("requestName","changxiang");
request.setAttribute("requestName","小Cai先森");
request.removeAttribute("requestName");
%>
</body>
</html>

 执行结果如下:

 

注意:其中遇到一个问题:就是在启动tomcat的时候servletcontextListener监听执行了两次,最后删除掉server.xml中 Context 的手动配置,这样就不会加载两次了。

解决思路:http://blog.csdn.net/shaokai132333/article/details/53328258

Listener监听器生命周期的更多相关文章

  1. filter和listener的生命周期

    filter(过滤器)和listener(监听器)的生命周期 老实说 生命周期要是说成作用的时间范围我会理解的更好 filter package com.javaweb.filter; import ...

  2. servelt filter listener 的生命周期

    1. servlet    当第一次请求一个servlet资源时,servlet容器创建这个servlet实例,并调用他的 init(ServletConfig config)做一些初始化的工作,然后 ...

  3. Java实现生命周期管理机制

    先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然 ...

  4. 在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean

    1.有时候在项目中需要定时启动某个任务,对于这个需求,基于JavaEE规范,我们可以使用Listener与TimerTask来实现,代码如下: public class TestTaskListene ...

  5. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. JavaWEB 通过Listener理解域对象生命周期

    利用 ServletRequestListener.HttpSessionListener 以及 ServletContextListener 可以把request,session,以及Applica ...

  7. JavaEE(16) - JPA生命周期及监听器

    1. 理解实体的生命周期 2. 为实体生命周期事件定义监听器 3. 通过监听实现回调 4. 排除默认监听器和父类上定义的监听器 1. 理解实体的生命周期(Net Beans创建Java Project ...

  8. 在web.xml中配置监听器来控制ioc容器生命周期

    5.整合关键-在web.xml中配置监听器来控制ioc容器生命周期 原因: 1.配置的组件太多,需保障单实例 2.项目停止后,ioc容器也需要关掉,降低对内存资源的占用. 项目启动创建容器,项目停止销 ...

  9. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

随机推荐

  1. FTP主动模式和被动模式

    FTP主动模式和被动模式 FTP是仅基于TCP的服务,不支持UDP.与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口).通常来说这两个端口是21(命令端口)和20(数据端口 ...

  2. MSSql Server 批量插入数据优化

    针对批量入库, .Net Framework  提供了一个批量入库Class : SqlBulkCopy , 批量入库性能不错,经测试 四万左右数据 2秒入库. 以下是测试Demo , 使用外部传入事 ...

  3. DB2日常维护——REORG TABLE命令优化数据库性能(转)

    [转]DB2日常维护——REORG TABLE命令优化数据库性能 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止一些错误 ...

  4. Eclipse中如何忽略报错的js文件

    https://jingyan.baidu.com/article/4f7d5712d3701a1a20192786.html

  5. php 网络爬虫2种方法

    1,通过curl进行抓取再进行写入文件当中: $curlobj = curl_init(); // 初始化curl_setopt($curlobj, CURLOPT_URL, "https: ...

  6. mysql 导出每张表中的100条数据..............

    windows下配好MYSQL 环境变量,cmd 然后: mysqldump -uroot -p123 [数据库名]--where "1=1 limit 100" --lock-a ...

  7. php留言板

    这个小项目的学习,就这样结束啦.由于过程中需要使用到js,这个目前还是感觉不会.之前的分析还是不太懂的.现在心里还是有点迷茫.什么都是照着葫芦画瓢. 我的拥有自己的东西才行.

  8. C#中windows服务安装方法

    关于windows服务的编写方法,参考:http://www.cnblogs.com/sorex/archive/2012/05/16/2502001.html 我这里就补充一下安装方法. 1.首先打 ...

  9. 3.3.3 PCI设备对可Cache的存储器空间进行DMA读写

    PCI设备向"可Cache的存储器空间"进行读操作的过程相对简单.对于x86处理器或者PowerPC处理器,如果访问的数据在Cache中命中,CPU会通知FSB总线,PCI设备所访 ...

  10. Sublime Text [Decode error - output not utf-8]

    改Sublime Text的python build的设置.将其编码设置为cp936. 打开Python.sublime-build文件,并添加”encoding”:”cp936″这一行,保存即可 S ...