一、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.

代码举例:

package com.kdyzm.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext sc=sce.getServletContext();
System.out.println(sc+"被销毁!");
} @Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(sce.getServletContext()+"初始化!");
} }

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.举例说明:

package com.kdyzm.domain;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; public class Person implements HttpSessionBindingListener{
private String name;
public Person() {
} public Person(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Person [name=" + name + "]";
} @Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println(this+"被加入到session中!");
} @Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println(this+"被移出session!");
} }

实现了HttpSessionBindingListener接口的Bean

<%@page import="com.kdyzm.domain.Person"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"
contentType="text/html; charset=utf-8" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Insert title here!</title>
</head> <body>
<%
Person p=new Person("小黄");
session.setAttribute("p", p);
out.println(session.getAttribute("p"));
session.removeAttribute("p");
out.println(session.getAttribute("p"));
%>
</body>
</html>

index.jsp测试JSP文件

浏览器显示:

控制台显示:

Person [name=小黄]被加入到session中!
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接口。

package com.kdyzm.domain;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent; public class Person implements HttpSessionActivationListener{
private String name;
public Person() {
} public Person(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Person [name=" + name + "]";
} @Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(se.getSource()+" 从文件恢复到内存!");
} @Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println(se.getSource()+" 从内存保存到文件!");
}
}

实现了HttpSessionActivationListener接口的Person类

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

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

abc.xml配置文件

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

<%@page import="com.kdyzm.domain.Person"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"
contentType="text/html; charset=utf-8" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Insert title here!</title>
</head> <body>
<%
if(session.getAttribute("p")==null)
{
Integer a=new Random().nextInt(100);
session.setAttribute("p", new Person(a.toString()));
}
%>
${p}<br/>
<%
System.out.println(session.getId());
%>
</body>
</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接口,一切问题就都解决了。

package com.kdyzm.domain;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent; public class Person implements HttpSessionActivationListener,Serializable{
private String name;
public Person() {
} public Person(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Person [name=" + name + "]";
} @Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(se.getSource()+" 从文件恢复到内存!");
} @Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println(se.getSource()+" 从内存保存到文件!");
}
}

实现了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. ACM - a + b Problem

    前几天看了ACM的第一题,映入眼帘的是一个“简单”的题目: 输入两个数,a,b 输出他们的和. 本着,此乃ACM的原则,便有了如下的思考: ACM的题目肯定很难,a+b,怎么可能直接printf,不行 ...

  2. Genymotion自动化启动

      一.启动方式 命令行: player.exe --vm-name [模拟器名称]   例子: "D:\Program files\Genymobile\Genymotion\player ...

  3. jenkins Auth fail验证失败

    重新设置密码

  4. Response.Redirect()、Server.Execute和Server.Transfer的区别

    1.Response.Redirect(): Response.Redirect方法导致浏览器链接到一个指定的URL. 当Response.Redirect()方法被调用时,它会创建一个应答,应答头中 ...

  5. Node.js简介

    Node核心思想:1.非阻塞:2.单线程:3.事件驱动. 在目前的web应用中,客户端和服务器端之间有些交互可以认为是基于事件的,那么AJAX就是页面及时响应的关键.每次发送一个请求时(不管请求的数据 ...

  6. HTML锚点参考II

    锚点使用:<a href="#a">会直接找到id为a的元素的位置,不需要其他设置.如此简单! <a href="#a"> <li ...

  7. 在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标的解决方法

    在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标,空白一片.将面板窗口拉大,发现那些图标在很下面的位置,X轴的排列与正常状态一致. 软件环境 ...

  8. ios8 新增的 showViewController 和 showDetailViewController

    1.showViewController 先看看说明: You use this method to decouple the need to display a view controller fr ...

  9. reportng的使用

    1.首先安装testng 2.下载reportng jar包 http://pan.baidu.com/s/1i3KdlQH 3.添加到project build path 注意:需要同时引入goog ...

  10. 小项目特供 简易迷宫(基于Java)

    明天返校,于是昨天和今天简单熟系了一下JAVA的GUI,做了一个简易的迷宫小游戏(暂时没有时间实现随机迷宫及多关卡,仅供学习) 源码及运行文件(提供JRE8):链接:简易迷宫 密码:hy8v