【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 ...
随机推荐
- 百度地图api 常用demo
功能一:获取map地图窗口的可视区域: var map = new BMap.Map("allmap"); // 创建Map实例 map.centerAndZ ...
- div 加滚动条
div 加滚动条的方法: <div style="position:absolute; height:400px; overflow:auto"></div> ...
- note:获取字符输入的一些函数
总是弄混,所以总结一下: getline() // 接受一个字符串,可以接收空格并输出,需包含“#include<string>” #include<iostream> ...
- centos 谷歌浏览器安装
首先,这个是坑 http://www.tecmint.com/install-google-chrome-on-redhat-centos-fedora-linux/ 安装会报错,按照错误找到以下资源 ...
- [转]Python的ASCII, GB2312, Unicode , UTF-8
2007-12-13 10:50:47| 分类: Python实用软件编|举报|字号 订阅 ASCII 是一种字符集,包括大小写的英文字母.数字.控制字符等,它用一个字节表示,范围是 0-1 ...
- Ext 下拉列表模糊搜索
/** * Created by huangbaidong on 2016/9/18. * 楼盘通用Combo组件,支持模糊查询 * 使用案例: * { fieldLabel : '楼盘名称', xt ...
- phpcms更换域名用户无法注册问题
问题背景: 用户注册必须在后台开启phpsso,这个sso也就是单点登录了,之前做的站都没有带用户登录,也一直没注意,今天线下localhost用户登录注册都没有问题,可是移到线上测试却怎么都无法注册 ...
- Linux的IO性能监控工具iostat详解
Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.其中iostat可以提供更丰富的IO性能状态数据. . 基本使用 $iostat - ...
- 【iOS开发-22】navigationBar导航条和navigationItem设置:基本搞定导航条上的文字和按钮以及各种跳转
http://blog.csdn.net/weisubao/article/details/39646739?utm_source=tuicool&utm_medium=referral (1 ...
- Linux 查找指定名称的进程并显示进程详细信息
实际应用中可能有这样的场景:给定一个进程名称特征串,查找所有匹配该进程名称的进程的详细信息. 解决的办法是: (1) 先用pgrep [str] 命令进行模糊匹配,找到匹配该特征串的进程ID: (2) ...