一、ServletContextListener 

Method Summary

 void

contextDestroyed(ServletContextEvent sce)
          Receives
notification that the ServletContext is about to be shut down.

 void

contextInitialized(ServletContextEvent sce)
          Receives
notification that the web application initialization process is starting.

代码举例:

  1. package com.kdyzm.listener;
  2.  
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletContextEvent;
  5. import javax.servlet.ServletContextListener;
  6.  
  7. public class MyServletContextListener implements ServletContextListener{
  8.  
  9. @Override
  10. public void contextDestroyed(ServletContextEvent sce) {
  11. ServletContext sc=sce.getServletContext();
  12. System.out.println(sc+"被销毁!");
  13. }
  14.  
  15. @Override
  16. public void contextInitialized(ServletContextEvent sce) {
  17. System.out.println(sce.getServletContext()+"初始化!");
  18. }
  19.  
  20. }

ServletContextListener举例

二、ServletContextAttributeListener

Method Summary

 void

attributeAdded(ServletContextAttributeEvent event)
          Receives
notification that an attribute has been added to the ServletContext.

 void

attributeRemoved(ServletContextAttributeEvent event)
          Receives
notification that an attribute has been removed from the ServletContext.

 void

attributeReplaced(ServletContextAttributeEvent event)

使用方法和HttpSessionAttriuteListener的用法相似,略。

三、HttpSessionBindingListener

Method Summary

 void

valueBound(HttpSessionBindingEvent event)
          Notifies the
object that it is being bound to a session and identifies the session.

 void

valueUnbound(HttpSessionBindingEvent event)
          Notifies the
object that it is being unbound from a session and identifies the session.

  1.功能:监听一个Bean是否被放到了Session中。

  2.特点:该接口需要被Bean实现才能正常发挥作用,实现该接口的Bean不需要配置到web.xml文件中。

  3.举例说明:

  1. package com.kdyzm.domain;
  2.  
  3. import javax.servlet.http.HttpSessionBindingEvent;
  4. import javax.servlet.http.HttpSessionBindingListener;
  5.  
  6. public class Person implements HttpSessionBindingListener{
  7. private String name;
  8. public Person() {
  9. }
  10.  
  11. public Person(String name) {
  12. this.name = name;
  13. }
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18.  
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22.  
  23. @Override
  24. public String toString() {
  25. return "Person [name=" + name + "]";
  26. }
  27.  
  28. @Override
  29. public void valueBound(HttpSessionBindingEvent event) {
  30. System.out.println(this+"被加入到session中!");
  31. }
  32.  
  33. @Override
  34. public void valueUnbound(HttpSessionBindingEvent event) {
  35. System.out.println(this+"被移出session!");
  36. }
  37.  
  38. }

实现了HttpSessionBindingListener接口的Bean

  1. <%@page import="com.kdyzm.domain.Person"%>
  2. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"
  3. contentType="text/html; charset=utf-8" %>
  4.  
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  9. <title>Insert title here!</title>
  10. </head>
  11.  
  12. <body>
  13. <%
  14. Person p=new Person("小黄");
  15. session.setAttribute("p", p);
  16. out.println(session.getAttribute("p"));
  17. session.removeAttribute("p");
  18. out.println(session.getAttribute("p"));
  19. %>
  20. </body>
  21. </html>

index.jsp测试JSP文件

浏览器显示:

控制台显示:

  1. Person [name=小黄]被加入到session中!
  2. Person [name=小黄]被移出session

四、HttpSessionActivationListener

Method Summary

 void

sessionDidActivate(HttpSessionEvent se)
          Notification that
the session has just been activated.

 void

sessionWillPassivate(HttpSessionEvent se)
          Notification that
the session is about to be passivated.

  1.功能:监听到一个session被保存到一个文件或者从文件中加载session的过程。

  2.特点:也需要一个Bean实现该接口,而且也不需要配置到web.xml文件中。

  3.小练习:在服务器关闭的时候将所有session保存到文件(钝化),服务器开启之后,再将session恢复到服务器内存。

     源代码:https://github.com/kdyzm/day21_1

     第一步:建立Person类并实现HttpSessionActivationListener接口。

  1. package com.kdyzm.domain;
  2.  
  3. import javax.servlet.http.HttpSessionActivationListener;
  4. import javax.servlet.http.HttpSessionEvent;
  5.  
  6. public class Person implements HttpSessionActivationListener{
  7. private String name;
  8. public Person() {
  9. }
  10.  
  11. public Person(String name) {
  12. this.name = name;
  13. }
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18.  
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22.  
  23. @Override
  24. public String toString() {
  25. return "Person [name=" + name + "]";
  26. }
  27.  
  28. @Override
  29. public void sessionDidActivate(HttpSessionEvent se) {
  30. System.out.println(se.getSource()+" 从文件恢复到内存!");
  31. }
  32.  
  33. @Override
  34. public void sessionWillPassivate(HttpSessionEvent se) {
  35. System.out.println(se.getSource()+" 从内存保存到文件!");
  36. }
  37. }

实现了HttpSessionActivationListener接口的Person类

     第二步:配置配置文件,在%tomcat_home%/conf/Catalina/localhost目录下新建xml文件abc.xml,在xml文件中进行如下配置:

  1. <?xml version="1.0" encoding="gbk"?>
  2. <Context docBase="E:\\MyEclipseWorkSpace\\day21_1\\WebRoot">
  3. <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true">
  4. <Store className="org.apache.catalina.session.FileStore" directory="d:/a">
  5. </Store>
  6. </Manager>
  7. </Context>

abc.xml配置文件

     第三步:创建jsp文件进行测试,这里直接使用index.xml文件

  1. <%@page import="com.kdyzm.domain.Person"%>
  2. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"
  3. contentType="text/html; charset=utf-8" %>
  4.  
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  9. <title>Insert title here!</title>
  10. </head>
  11.  
  12. <body>
  13. <%
  14. if(session.getAttribute("p")==null)
  15. {
  16. Integer a=new Random().nextInt(100);
  17. session.setAttribute("p", new Person(a.toString()));
  18. }
  19. %>
  20. ${p}<br/>
  21. <%
  22. System.out.println(session.getId());
  23. %>
  24. </body>
  25. </html>

index.xml文件

     第四步:打开浏览器,在浏览器上输入:http://localhost:8080/abc,回车,观察输出结果。

       (1)浏览器输出结果

        

       (2)控制台输出结果

       

       控制台输出结果是当前会话的sessionid。

      (3)打开D://a目录,查看有没有session文件,结果是没有

    第五步:通过shutdown的方式关闭服务器。再次观察现象

      (1)控制台输出:显示了将session保存到了文件

      

      (2)查看D://a目录看看有没有相应的session文件,结果是有,而且session文件的名字就是sessionid

      

      (3)刷新原来的页面,看看数值是否有变化,结果是变化了;再看看后台打印输出的结果,比较是否是同一个session,确实是同一个session

        疑问:后台没有打印输出“当前对象没有从文件中活化”的提示,既然从session文件中活化了,为什么数值会发生变化

        结果图片:

        

        

    第六步:解决疑问

    让Person类实现Serializable接口,一切问题就都解决了。

  1. package com.kdyzm.domain;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import javax.servlet.http.HttpSessionActivationListener;
  6. import javax.servlet.http.HttpSessionEvent;
  7.  
  8. public class Person implements HttpSessionActivationListener,Serializable{
  9. private String name;
  10. public Person() {
  11. }
  12.  
  13. public Person(String name) {
  14. this.name = name;
  15. }
  16.  
  17. public String getName() {
  18. return name;
  19. }
  20.  
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24.  
  25. @Override
  26. public String toString() {
  27. return "Person [name=" + name + "]";
  28. }
  29.  
  30. @Override
  31. public void sessionDidActivate(HttpSessionEvent se) {
  32. System.out.println(se.getSource()+" 从文件恢复到内存!");
  33. }
  34.  
  35. @Override
  36. public void sessionWillPassivate(HttpSessionEvent se) {
  37. System.out.println(se.getSource()+" 从内存保存到文件!");
  38. }
  39. }

实现了Seriable接口、HttpSessionActivationListener接口的Person类

    (1)重复之前的步骤,最后重启服务器,刷新网页,查看后台输出结果和网页现实的数值是否有变化。

      浏览器:第一次打开的时候是

      

      重启服务器之后再次刷新页面,结果相同。

      服务器控制台:

      

      显示了从文件恢复到内存的提示信息。

      

【Java EE 学习 21 上】【其它类型的监听器】【使用HttpSessionActivationListener监听session的活化和钝化】的更多相关文章

  1. 【Java EE 学习 80 上】【WebService】

    一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...

  2. 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】

    之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...

  3. 【Java EE 学习 79 上】【mybatis 基本使用方法】

    一.简介 mybatis类似于hibernate,都是简化对数据库操作的框架,但是和hibernate不同的是,mybatis更加灵活,整体来说框架更小,这体现在它需要我们手写SQL语句,而hiber ...

  4. 【Java EE 学习 76 上】【数据采集系统第八天】【角色授权】【用户授权】【权限的粗粒度控制】【权限的细粒度控制】

    一.角色管理 单击导航栏上的"角色管理"超链接,跳转到角色管理界面,在该界面上显示所有角色,并提供角色的增加和删除.修改超链接. 1.增加新角色(角色授权) 流程:单击增加新角色超 ...

  5. 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】

    增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...

  6. 【Java EE 学习 25 上】【网上图书商城项目实战】

    一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...

  7. 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】

    一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...

  8. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  9. 【Java EE 学习 83 上】【SpringMVC】【基本使用方法】

    一.SpringMVC框架概述 什么是SpringMVC?SpringMVC是一个和Struts2差不多的东西,他们的作用和性质几乎是相同的,甚至开发效率上也差不多,但是在运行效率上SpringMVC ...

随机推荐

  1. u-boot 2011.09 开启debug 调试

    以前做过,现在刚才又想不起来了,这个错误非常的严重. 在这里记一下. debug 调试信息的开启在 include/common.h 有如下宏定义: #ifdef DEBUG #define debu ...

  2. ajax给全局变量赋值问题解决

    $.ajax({ type: "post", //以post方式与后台沟通 url: "./php/chartAjax.php", //与此php页面沟通 da ...

  3. ext 对齐

    layout : { type : 'hbox', pack : 'end' } buttonAlign:'center', //按钮居中   pack : String Controls how t ...

  4. nova 虚拟机迁移

    ref: 官方文档很给力: nova 迁移有以下类型: Non-live migration (sometimes referred to simply as ‘migration’). The in ...

  5. 【Network】高性能 UDP 服务应该怎么搞?

    参考资料: Netty系列之Netty高性能之道 C++高性能服务框架revover:rudp总体介绍(可靠UDP传输) - zerok的专栏 - 博客频道 - CSDN.NET 高性能异步Socke ...

  6. C#中使用ADOMD.NET查询多维数据集

    ADOMD.NET 是用于与 Microsoft SQL Server Analysis Services 进行通信的 Microsoft .NET Framework 数据访问接口. ADOMD.N ...

  7. Unity3d 制作物品平滑运动

    直接贴代码了 using UnityEngine; using System; using System.Collections; using System; using DataTable; pub ...

  8. the XMLHttpRequest Object

    Ajax的核心是XMLHttpRequest对象.XMLHttpRequest对象允许异步发送请求并且以文本的形式返回结果.发送什么样的请求(what),在服务器端怎样处理这个请求(how),返回什么 ...

  9. iOS App Extensions 推荐文章

    写的非常不错,读完后,基本的extension的套路就清楚了,也是我们的园友写的,感谢他: http://www.cnblogs.com/xdream86/p/3855932.html 下面这个教程是 ...

  10. ios Coredata 的 rollback undo 等事物处理函数

    首先说明 ios 中 NSManagedObjectContext 默认的 undoManager是nil的,就是说 undo 和 redo 都是没用的. 但是 rollback函数和reset函数是 ...