【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 ...
随机推荐
- 51Nod 1250 排列与交换
Description 统计 \(1...n\) 的排列,恰好进行 \(k\) 次相邻交换和至多进行 \(k\) 次交换生成的不同的序列个数. Sol DP. 好妙的题啊... 首先看第一个问题. 对 ...
- FlexPaper使用小结
FlexPaper相关介绍及后台swf生成,参见 FlexPaper实现文档在线浏览(附源码) 前台swf在flash中的预览: 1.下载相关文档 FlexPaper Classic 2.将下载的文件 ...
- 【leetcode】Wildcard Matching
Wildcard Matching Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any ...
- 压测 apache ab 初探
2015年10月30日 14:58:34 ab是apache自带的压测命令, 在其bin目录下边, 不仅可以压测Apache, 也可以测nginx或其他服务器 可以模拟上传post值 (-p, 与下边 ...
- 全能直播王PC版-0707-full_codecs
全能直播王是一款高清流畅的全平台的电视直播应用,让您随时随地看高清电视直播. [全能特色] 1. 收录全国1400多个直播频道,包括湖南卫视.江苏卫视.浙江卫视等热门频道. 2. 频道多线路自动选择, ...
- Effective C++ -----条款50:了解new 和delete 的合理替换时机
有许多理由需要写个自定的new 和delete ,包括改善效能.对heap 运用错误进行调试.收集heap 使用信息.
- codeforces 425B Sereja and Table (枚举、位图)
输入n*m的01矩阵.以及k. n,m<=100,k<=10 问修改至多k个,使得矩阵内的各连通块(连着的0或1构成连通块)都是矩形,且不含另外的数字(边界为0(1)的矩形内不含1(0)) ...
- linux安装软件
安装方式一: RPM包安装 安装方式二:yum包安装 安装方式三:源码包安装 安装方式四:脚步安装包 视频教程
- Mysql之多源复制
在复制时,可以有多个Master.这些Master不进行冲突检查拓扑到Slave.在使用多源复制时对Slave的表存储格式是有要求的,必须要基于table存储而非文件存储[require table ...
- java Unicode、ISO-8859-1、GBK、UTF-8编码转换深入浅出
参考文献:搞懂ASCII, ISO8859-1, ANSI和Unicode Unicode百度文献 ISO-8859-1百度文献 注: 1.utf-8虽然是国际编码,对不同范围的字符使用不同长度的编码 ...