js333 > 计算机互联网 > 其保存的数据无故丢失的原因金沙js333娱乐场

原标题:其保存的数据无故丢失的原因金沙js333娱乐场

浏览次数:144 时间:2019-11-04

session没有过期,其保存的数据无故丢失的原因,session过期

问题:

我们经常会做到的一个功能,将登录用户信息保存到session中,在页面上显示登录用户名。但是,如果很短时间内甚至几秒没有刷新这个页面的话,这个用户名就消失了,其实就是session中保存的用户数据丢失了。

百度过很多,大部分说是session过期时间设置长一点,或者tomcat的配置问题等等,但都没能解决....在上一篇博客里问到这个问题的时候,有个博友的评论给了我思路,果然O(∩_∩)O哈哈~ 先感谢!!!

然后 看测试过程吧 ↓↓↓

 

下面这个是用户实体类:

 1 package com.lizhou.entity;
 2 
 3 /**
 4  * 用户类
 5  * @author bojiangzhou
 6  * @date 2016年2月28日
 7  */
 8 public class User {
 9     
10     private int id;
11     
12     private String name;
13 
14     public User() {
15         
16     }
17 
18     public User(int id, String name) {
19         this.id = id;
20         this.name = name;
21     }
22 
23     public int getId() {
24         return id;
25     }
26 
27     public void setId(int id) {
28         this.id = id;
29     }
30 
31     public String getName() {
32         return name;
33     }
34 
35     public void setName(String name) {
36         this.name = name;
37     }
38     
39 }

 

用户servlet:地址栏输入 (这样刷新页面的时候就不会访问这个servlet了)

 1 package com.lizhou.servlet;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 import com.lizhou.entity.User;
11 
12 /**
13  * 用户servlet
14  * @author bojiangzhou
15  * @date 2016年2月28日
16  */
17 public class UserServlet extends HttpServlet {
18     private static final long serialVersionUID = 1L;
19 
20     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
21         request.setCharacterEncoding("UTF-8");
22         
23         User user = new User();
24         user.setId(1);
25         user.setName("Chiangchou");
26         
27         //将用户信息保存到session中
28         request.getSession().setAttribute("user", user);
29         //保存一个字符串信息
30         request.getSession().setAttribute("message", "用户登录成功");
31         
32         //重定向
33         response.sendRedirect("showUser.jsp");;
34         
35     }
36 
37     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
38         
39     }
40 
41 }

session监听器:监听session的创建与销毁、向session中添加属性、移除属性、更改属性。

 1 package com.lizhou.listener;
 2 
 3 import javax.servlet.http.HttpSessionAttributeListener;
 4 import javax.servlet.http.HttpSessionBindingEvent;
 5 import javax.servlet.http.HttpSessionEvent;
 6 import javax.servlet.http.HttpSessionListener;
 7 
 8 /**
 9  * session监听器
10  * @author bojiangzhou
11  * @date 2016年2月28日
12  */
13 public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {
14     
15     //属性添加时间
16     private long addTime;
17     
18     @Override
19     public void sessionCreated(HttpSessionEvent event) {
20         System.out.println("session 创建");
21     }
22 
23     @Override
24     public void sessionDestroyed(HttpSessionEvent event) {
25         System.out.println("session 销毁");
26     }
27 
28     @Override
29     public void attributeAdded(HttpSessionBindingEvent event) {
30         System.out.println("添加属性:"+event.getName());
31         //当属性保存的时候保存当前时间
32         addTime = System.currentTimeMillis();
33     }
34 
35     @Override
36     public void attributeRemoved(HttpSessionBindingEvent event) {
37         System.out.println("移除属性:"+event.getName());
38         //当属性移除的时候计算属性保存时间
39         long removeTime = System.currentTimeMillis();
40         long t = (removeTime-addTime)/1000;
41         System.out.println("数据保存时间:"+t+"秒");
42     }
43 
44     @Override
45     public void attributeReplaced(HttpSessionBindingEvent event) {
46         System.out.println("更改属性:"+event.getName());
47     }
48 
49 }

showUser.jsp 显示用户名

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>显示用户</title>
 8 </head>
 9 <body>
10     用户名:【 ${user.name} 】
11     <br/>
12     信息:【 ${message} 】
13 </body>
14 </html>

 

金沙js333娱乐场,准备工作做好了,下面看测试:

首先直接在地址栏输入地址访问UserServlet,在doGet()里会将用户信息保存到session中,重定向到showUser.jsp时,显示用户名和信息,如图: 可以看到,User对象的属性和字符串都能显示。

 金沙js333娱乐场 1

下面是控制台输出的信息:刚访问servlet后就截图的

金沙js333娱乐场 2

 然后,过了一会,控制台如图:

金沙js333娱乐场 3

 可以看到,54秒后,user属性移除了,message没有移除,session并没有销毁哦!!!然后刷新页面显示:这就是我们常见到的情况了....

金沙js333娱乐场 4

 

然后,百度大部分说设置session过期时间长一点:但是没有效果

1 <!-- 设置session失效时间(单位:分) -->
2 <session-config>
3   <session-timeout>30</session-timeout>
4 </session-config>

然后还有一种方法:在根目录下放一个refresh.jsp文件,内容如下:主要是第6行代码,每隔一秒刷新一下,链接到自己

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="refresh" content="1; url=refresh.jsp">
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title></title>
 9 </head>
10 <body>
11 
12 </body>
13 </html>

然后在显示数据的页面(showUser.jsp)加上一句代码:<iframe width=0 height=0 src="refresh.jsp"></iframe>

目的是不断请求服务器,我的理解是服务端以为客户端一直在使用这个对象,就不会移除这个数据了....

这样虽然达到了目的,但有很大的弊端,而且治标不治本:一直请求服务器消耗服务器资源是肯定的了,而且浏览器的刷新图标会一直跳,看着很不爽的...

金沙js333娱乐场 5

 

 *****************************************************************************************************************

 最后,看解决办法:只需要将User实现序列化接口Serializable即可,如下:

 1 package com.lizhou.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 /**
 6  * 用户类
 7  * @author bojiangzhou
 8  * @date 2016年2月28日
 9  */
10 public class User implements Serializable {
11     
12     private int id;
13     
14     private String name;
15 
16     public User() {
17         
18     }
19 
20     public User(int id, String name) {
21         this.id = id;
22         this.name = name;
23     }
24 
25     //getter/setter方法26     
27 }

 

将要保存到session中的对象实现序列化接口Serializable,这样用户数据就一直保存在session里了,不管你怎么刷新,除非session销毁,数据一直都在!!!

那么原因是什么呢?下面是我百度的一段:

【Object serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。
举个例子:网络传输的时候,可以传字符串,亦可以传对象object,例如socket。传字符串的时候接收方很容易解析出来,但是,传一个对象的时候,对方读完字节流后,不知道你传的什么对象,所以没办法给转成原来的对象并解析对象的属性,这时候就要用到序列化和反序列化。类实现序列化接口,socket发送这个对象的字节流,接收方收到流后就可以将流反序列化成对象,然后使用对象的方法和属性。】

 

附上测试代码:session数据丢失测试代码

 OK!!!

 

问题: 我们经常会做到的一个功能,将登录用户信息保存到session中,在页面上...

监听器就是实现特定接口的Java类,这个类专门用于监听另一个Java对象的方法调用或者属性改变,当监听对象发生上述事件后,监听器某个方法将立即被执行

1. 监听器

JavaWeb中的监听器

1.1 概述

监听器: 主要是用来监听特定对象的创建或销毁、属性的变化的!

 是一个实现特定接口的普通java类!

 

对象:

自己创建自己用 (不用监听)

别人创建自己用 (需要监听)

 

Servlet中哪些对象需要监听?

request / session / servletContext

分别对应的是request监听器、session相关监听器、servletContext监听器

 

监听器(listener)

 

 

监听器接口:

一、监听对象创建/销毁的监听器接口

Interface ServletRequestListener     监听request对象的创建或销毁

Interface HttpSessionListener        监听session对象的创建或销毁

Interface ServletContextListener     监听servletContext对象的创建或销毁

二、监听对象属性的变化

Interface ServletRequestAttributeListener 监听request对象属性变化: 添加、移除、修改

Interface HttpSessionAttributeListener    监听session对象属性变化: 添加、移除、修改

Interface ServletContextAttributeListener  监听servletContext对象属性变化

 

三、session相关监听器

Interface HttpSessionBindingListener   监听对象绑定到session上的事件

    Interface HttpSessionActivationListener(了解) 监听session序列化及反序列化的事件

 

 

404(路径写错)

500(服务器错误,调试)

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,主要是用于监听Servlet域中的ServletContext、HttpSession和ServletRequest等对象的创建、销毁,属性发生改变的事件。

1.2 生命周期监听器

声明周期监听器: 监听对象的创建、销毁的过程!

监听器开发步骤:

1. 写一个普通java类,实现相关接口;

2. 配置(web.xml)

 

所以JavaWeb中的监听器主要是三类

A.  ServletRequestListener    

监听request对象的创建或销毁。

 

代码:

/**

 *  监听request对象的创建或销毁

 * @author Jie.Yuan

 *

 */

public class MyRequestListener implements ServletRequestListener{

 

// 对象销毁

@Override

public void requestDestroyed(ServletRequestEvent sre) {

// 获取request中存放的数据

Object obj = sre.getServletRequest().getAttribute("cn");

System.out.println(obj);

System.out.println("MyRequestListener.requestDestroyed()");

}

 

// 对象创建

@Override

public void requestInitialized(ServletRequestEvent sre) {

System.out.println("MyRequestListener.requestInitialized()");

}

}

 

Web.xml

<!-- 监听request对象创建、销毁 -->

<listener>

<listener-class>cn.itcast.a_life.MyRequestListener</listener-class>

</listener>

 

 

 

ServletContextListener:监听ServletContext的初始化和销毁

B. HttpSessionListener

监听session对象的创建或销毁。

 

HttpSessionListener:监听HttpSession域中的某个对象的状态

C. ServletContextListener

监听servletContext对象的创建或销毁。

 

 

ServletRequestListener:监听ServletRequest域对象的创建和销毁

1.3 属性监听器

监听:request/session/servletContext对象属性的变化!

关于Listener的配置,同样有两种方法配置

ServletRequestAttributeListener

web.xml中配置

HttpSessionAttributeListener

2.用注解@WebListener配置

ServletContextAttributeListener

 

总结:先写类,实现接口;  再配置

 

 

ServletContextListener

1.4 其他监听器: session相关监听器

 

 

有两个方法:

HttpSessionBindingListener   

监听对象绑定/解除绑定到sesison上的事件!

 

步骤:

对象实现接口; 再把对象绑定/解除绑定到session上就会触发监听代码。

作用:

(上线提醒!)

 

/**

 * 监听此对象绑定到session上的过程,需要实现session特定接口

 * @author Jie.Yuan

 *

 */

public class Admin implements HttpSessionBindingListener {

   … 省略get/set

// 对象放入session

@Override

public void valueBound(HttpSessionBindingEvent event) {

System.out.println("Admin对象已经放入session");

}

// 对象从session中移除

@Override

public void valueUnbound(HttpSessionBindingEvent event) {

System.out.println("Admin对象从session中移除!");

}

}

 

 

思考:

这个session监听器,和上面的声明周期、属性监听器区别?

--à 不用再web.xml配置

   -à 因为监听的对象是自己创建的对象,不是服务器对象!

 

 

 

contextInitialized(ServletContextEvent sce),官方注解是:此方法在 servlet context 初始化时被调用(当web项目部署的时候),你可以在这个方法里初始化相关的servlet context

1.4 案例

需求:做一个在线列表提醒的功能!

      用户--à 登陆

               ---à 显示登陆信息,列表展示。(list.jsp)

   --à  显示在线用户列表        (list.jsp)

-à 列表点击进入“在线列表页面”   onlineuser.jsp

 

实现:

1. 先增加退出功能;  再把session活跃时间1min;

2. 写监听器,监听servletContext对象的创建: 初始化集合(onlineuserlist)

3. 登陆功能: 用户登陆时候,把数据保存到servletContext中

4. List.jsp  增加超链接, 点击时候提交直接跳转到online.jsp

5. 写监听器: 监听session销毁,把当前登陆用户从onlineuserlist移除!

 

 

contextDestroyed(ServletContextEvent sce),官方注解是:此方法在 servlet context被取消部署,或者关闭服务器的时候被调用

2. 国际化

Javaweb增强:过滤器、监听器、国际化、文件上传下载、javaMail

 

l 国际化又简称为 i18n:internationalization

 

国际化的人:

人,英语,汉语;  可以说这个人是国际化的人;

 

软件的国际化:

软件

中国: 显示中文,以及服务符合中国习惯的文本字符串!

 1999-09-09

美国: 显示英文,以及服务符合他国习惯的文本字符串!

这种软件,就叫国际化的软件!

 

如何做到国际化的软件,要求:

1. 软件中存储特定的字符串

2. 知道浏览器当前使用哪种语言(Locale  )

 

翻译可能有点不专业,具体的可以看官方注解

Locale  本地化

Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!

 

 

public class App {

 

@Test

//1. 本地化对象:Locale

// 封装语言、国家信息的对象,有java.util提供

public void testLocale() throws Exception {

// 模拟中国语言等环境

//Locale locale = Locale.CHINA;

Locale locale = Locale.getDefault(); // 当前系统默认的语言环境

System.out.println(locale.getCountry());    // CN  国家的简称

System.out.println(locale.getDisplayCountry()); // 国家名称

System.out.println(locale.getLanguage()); // zh 语言简称

 

// 模拟美国国家

Locale l_us = Locale.US;

System.out.println(l_us.getCountry());

System.out.println(l_us.getDisplayCountry());

}

}

 

 

Debug发现,在启动项目时,会调用contextInitialized方法

国际化

在停止项目时,会调用contextDestroyed方法

静态数据国际化

网站中显示的固定文本的国际化: “用户名”“密码“

 

国际化的软件:

1. 存储所有国家显示的文本的字符串

a) 文件: properties

b) 命名:  基础名_语言简称_国家简称.properties

例如:msg_zh_CN.properties     存储所有中文

      Msg_en_US.properties    存储所有英文

2. 程序中获取

ResourceBundle类,可以读取国际化的资源文件!

 

 

 

至此,ServletContextListener简单的例子算是完成。

动态文本国际化

中文:1987-09-19   ¥1000

英文: Sep/09 1987  $100

 

数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API (位于 java.util 包和 java.text 包中)

 

// 国际化 - 静态数据

@Test

public void testI18N() throws Exception {

 

// 中文语言环境

Locale locale = Locale.US;

 

// 创建工具类对象ResourceBundle

ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.f_i18n.msg", locale);

// 根据key获取配置文件中的值

System.out.println(bundle.getString("hello"));

System.out.println(bundle.getString("username"));

System.out.println(bundle.getString("pwd"));

 

}

 

// 国际化 - 动态文本 - 0. 概述

@Test

public void testI18N2() throws Exception {

// 国际化货币

NumberFormat.getCurrencyInstance();

// 国际化数字

NumberFormat.getNumberInstance();

// 国际化百分比

NumberFormat.getPercentInstance();  

// 国际化日期

//DateFormat.getDateTimeInstance(dateStyle, timeStyle, aLocale)

}

 

// 国际化 - 动态文本 - 1. 国际化货币

@Test

public void testI18N3() throws Exception {

// 模拟语言环境

Locale locale = Locale.CHINA;

// 数据准备

double number = 100;

// 工具类

NumberFormat nf = NumberFormat.getCurrencyInstance(locale);

// 国际化货币

String m = nf.format(number);

// 测试

System.out.println(m);

}

 

//面试题:  代码计算:  $100 * 10  

@Test

public void eg() throws Exception {

String str = "$100";

int num = 10;

 

// 1. 分析str值是哪一国家的货币

Locale us = Locale.US;

// 2. 国际化工具类

NumberFormat nf = NumberFormat.getCurrencyInstance(us);

// 3. 解析str国币

Number n = nf.parse(str);

 

System.out.println(n.intValue() * num);

}

 

// 国际化 - 动态文本 - 2. 国际化数值

@Test

public void testI18N4() throws Exception {

// 模拟语言环境

Locale locale = Locale.CHINA;

NumberFormat nf = NumberFormat.getNumberInstance(Locale.US);

String str = nf.format(1000000000);

System.out.println(str);

}

 

// 国际化 - 动态文本 - 3. 国际化日期

/*

 * 日期

 *   FULL   2015年3月4日 星期三

 *   LONG   2015年3月4日

 *   FULL   2015年3月4日 星期三

 *    MEDIUM 2015-3-4

 *    SHORT  15-3-4

 *    

 * 时间

 *   FULL   下午04时31分59秒 CST

 *   LONG   下午04时32分37秒

 *    MEDIUM 16:33:00

 *    SHORT  下午4:33

 *    

 *

 */

@Test

public void testI18N5() throws Exception {

 

// 日期格式

int dateStyle = DateFormat.SHORT;

// 时间格式

int timeStyle = DateFormat.SHORT;

 

// 工具类

DateFormat df =

DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.CHINA);

String date = df.format(new Date());

 

System.out.println(date);

}

 

// 面试2: 请将时间值:09-11-28 上午10时25分39秒 CST,反向解析成一个date对象。

@Test

public void eg2() throws Exception {

String str = "09-11-28 上午10时25分39秒 CST";

// 创建DateFormat工具类,国际化日期

DateFormat df = DateFormat.getDateTimeInstance(

DateFormat.SHORT, DateFormat.FULL, Locale.getDefault());

Date d = df.parse(str);

 

System.out.println(d);

}

 

 

HttpSessionListener

Jsp页面国际化

<html>

  <head>

   <%

   ResourceBundle bundle = ResourceBundle.getBundle("cn.itcast.f_i18n.msg",request.getLocale());

   %>

    <title><%=bundle.getString("title") %></title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">    

  </head>

  

  <body>

  <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">

   <table align="center" border="1">

   <tr>

   <td><%=bundle.getString("username") %></td>

   <td>

   <input type="text" name="userName">

   </td>

   </tr>

   <tr>

   <td><%=bundle.getString("pwd") %></td>

   <td>

   <input type="password" name="pwd">

   </td>

   </tr>

   <tr>

   <td>

   <input type="submit" value="<%=bundle.getString("submit") %>">

   </td>

   </tr>

   </table>

  </form>

  </body>

</html>

 

有两个方法:

Jsp页面国际化 – 使用jstl标签

JSTL标签:

核心标签库

国际化与格式化标签库

数据库标签库(没用)

函数库

 

<fmt:setLocale value=""/>        设置本地化对象

   <fmt:setBundle basename=""/>     设置工具类

   <fmt:message></fmt:message>     显示国际化文本

格式化数值

<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber>

格式化日期:

<fmt:formatDate pattern="yyyy-MM-dd" value="${date}"/>

 

<html>

  <head>

   <!-- 一、设置本地化对象 -->

   <fmt:setLocale value="${pageContext.request.locale}"/>

   <!-- 二、设置工具类 -->

   <fmt:setBundle basename="cn.itcast.f_i18n.msg" var="bundle"/>

 

    <title><fmt:message key="title" bundle="${bundle}"></fmt:message></title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">    

  </head>

  

  <body>

  <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">

   <table align="center" border="1">

   <tr>

   <td><fmt:message key="username" bundle="${bundle}"></fmt:message></td>

   <td>

   <input type="text" name="userName">

   </td>

   </tr>

   <tr>

   <td><fmt:message key="pwd" bundle="${bundle}"></fmt:message></td>

   <td>

   <input type="password" name="pwd">

   </td>

   </tr>

   <tr>

   <td>

   <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>">

   </td>

   </tr>

   </table>

  </form>

  </body>

</html>

 

sessionCreated(HttpSessionEvent se),官方注解:Session被创建

sessionDestroyed(HttpSessionEvent se),官方注解:Session被销毁

为了测试这两个方法,修改方法如下

因为要测试Session的过期方法,所以要在配置文件中配置Session的过期时间为1分钟,当在这段时间内,之前的请求未有新的操作,则会把对应的Session过期掉。

Debug模式,发现控制台输出三次请求的SessionID,如果在sessionCreated打上断点,会发现,这个方法中的断点会命中三次。

但是查看起的页面的SessionID是最后一次的请求

按照理论来讲,这个方法只会请求一次,但是为什么这里会请求三次,这是因为测试的时候是在IDEA中Debug,前两次的请求User-Agent 是IDEA,IDEA请求两次判断该进程是否keep-alive

然后用新的浏览器访问

因为在配置文件中配置的是1分钟过期,所以在1分钟后,陆续发现调用sessionDestroyed

至此,HttpSessionListener测试完成,一般这个监听器可以用来统计你的站点有多少人登陆等功能

ServletRequestListener

有两个方法:

requestInitialized(ServletRequestEvent servletRequestEvent),用户每一次访问都会创建request对象,调用该方法

requestDestroyed(ServletRequestEvent servletRequestEvent),当前访问结束,request对象就会销毁,调用该方法

修改测试用例如下

发现debug的时候,会有三次创建和销毁,说明一切如预期一样,但是为什么会有三次,理由和HttpSessionListener一样,因为IDEA会请求两次

至此,JavaWeb的基本的监听器已经讲解完成了。这三个监听器只是监听对应对象的创建和销毁,与之对应的还有三个监听器用来监听者三个对象中的属性变更信息,这三个监听器分别是:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener,至于其中的方法,这里就不细讲,基本上和上面的方法类似。

感知Session绑定的事件监听器

Servlet规范中定义了两个特殊的监听器接口:HttpSessionBindingListener和HttpSessionActivationListener。这两个监听器来帮助JavaBean对象链接自己在Session域中的状态。再者,实现这两个接口的类不需要在web.xml文件中配置。

HttpSessionBindingListener

有两个方法:

valueBound(HttpSessionBindingEvent httpSessionBindingEvent):当对象被绑定到HttpSession对象中时,web服务器调用该对象的该方法

valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent):当对象从HttpSession对象中解除绑定时,web服务器调用该对象的该方法

其实也就在调用session.setAttribute()方法时会触发valueBound方法,在调用session.removeAttribute方法时会触发valueUnbound,这个监听器主要就是监听session的绑定和解绑

修改ListenerDemo类如下

修改index.jsp如下

当debug时,因为会访问页面index.jsp,然后页面会执行绑定和解绑session的方法,这时救护触发该监听器的两个方法,所以控制台会输出改造后的方法中的信息

HttpSessionActivationListener

在介绍这个监听器之前,先介绍两个概念:活化、钝化

活化:javabean对象和session一起被反序列化(活化)到内存中

钝化:javabean对象如果存在session中,当服务器把session序列化到硬盘上时,如果session中的javabean对象实现了Serializable接口,那么服务器会把session中的javabean对象一起序列化到硬盘上,这个操作就叫钝化,但是如果javabean没有实现Serializable接口,那么服务器会先把没有实现Serializable接口的javabean对象移除,然后再钝化到硬盘中。

该接口也有两个方法:

sessionWillPassivate(HttpSessionEvent httpSessionEvent):当绑定在session中的javabean将要被钝化到硬盘中,会调用这个方法

sessionDidActivate(HttpSessionEvent httpSessionEvent):当绑定在session中的javabean将要被活化到内存中,会调用这个方法

修改ListenerDemo如下

修改index.jsp如下

当debug的时候,页面会打印出当前的sessionID

然后退出debug时,控制台会输出

查找文件,可以发现文件夹中会有一个文件

说明钝化成功。

至于活化的流程,和钝化类似,这里不在叙述

以上就是javaweb的大都数监听器,因为这些在实际开发中用的次数还是很多的,所以还是很有必要掌握的。

本文由js333发布于计算机互联网,转载请注明出处:其保存的数据无故丢失的原因金沙js333娱乐场

关键词:

上一篇:没有了

下一篇:没有了