【Java EE 学习 21 上】【其它类型的监听器】【使用HttpSessionActivationListener监听session的活化和钝化】
一、ServletContextListener
Method Summary |
|
|
|
|
|
代码举例:
- 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 |
|
|
|
|
|
|
使用方法和HttpSessionAttriuteListener的用法相似,略。
三、HttpSessionBindingListener
Method Summary |
|
|
|
|
|
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 |
|
|
|
|
|
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的活化和钝化】的更多相关文章
- 【Java EE 学习 80 上】【WebService】
一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...
- 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...
- 【Java EE 学习 79 上】【mybatis 基本使用方法】
一.简介 mybatis类似于hibernate,都是简化对数据库操作的框架,但是和hibernate不同的是,mybatis更加灵活,整体来说框架更小,这体现在它需要我们手写SQL语句,而hiber ...
- 【Java EE 学习 76 上】【数据采集系统第八天】【角色授权】【用户授权】【权限的粗粒度控制】【权限的细粒度控制】
一.角色管理 单击导航栏上的"角色管理"超链接,跳转到角色管理界面,在该界面上显示所有角色,并提供角色的增加和删除.修改超链接. 1.增加新角色(角色授权) 流程:单击增加新角色超 ...
- 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】
增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...
- 【Java EE 学习 25 上】【网上图书商城项目实战】
一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...
- 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...
- 【Java EE 学习 83 上】【SpringMVC】【基本使用方法】
一.SpringMVC框架概述 什么是SpringMVC?SpringMVC是一个和Struts2差不多的东西,他们的作用和性质几乎是相同的,甚至开发效率上也差不多,但是在运行效率上SpringMVC ...
随机推荐
- u-boot 2011.09 开启debug 调试
以前做过,现在刚才又想不起来了,这个错误非常的严重. 在这里记一下. debug 调试信息的开启在 include/common.h 有如下宏定义: #ifdef DEBUG #define debu ...
- ajax给全局变量赋值问题解决
$.ajax({ type: "post", //以post方式与后台沟通 url: "./php/chartAjax.php", //与此php页面沟通 da ...
- ext 对齐
layout : { type : 'hbox', pack : 'end' } buttonAlign:'center', //按钮居中 pack : String Controls how t ...
- nova 虚拟机迁移
ref: 官方文档很给力: nova 迁移有以下类型: Non-live migration (sometimes referred to simply as ‘migration’). The in ...
- 【Network】高性能 UDP 服务应该怎么搞?
参考资料: Netty系列之Netty高性能之道 C++高性能服务框架revover:rudp总体介绍(可靠UDP传输) - zerok的专栏 - 博客频道 - CSDN.NET 高性能异步Socke ...
- C#中使用ADOMD.NET查询多维数据集
ADOMD.NET 是用于与 Microsoft SQL Server Analysis Services 进行通信的 Microsoft .NET Framework 数据访问接口. ADOMD.N ...
- Unity3d 制作物品平滑运动
直接贴代码了 using UnityEngine; using System; using System.Collections; using System; using DataTable; pub ...
- the XMLHttpRequest Object
Ajax的核心是XMLHttpRequest对象.XMLHttpRequest对象允许异步发送请求并且以文本的形式返回结果.发送什么样的请求(what),在服务器端怎样处理这个请求(how),返回什么 ...
- iOS App Extensions 推荐文章
写的非常不错,读完后,基本的extension的套路就清楚了,也是我们的园友写的,感谢他: http://www.cnblogs.com/xdream86/p/3855932.html 下面这个教程是 ...
- ios Coredata 的 rollback undo 等事物处理函数
首先说明 ios 中 NSManagedObjectContext 默认的 undoManager是nil的,就是说 undo 和 redo 都是没用的. 但是 rollback函数和reset函数是 ...