使用session实现的计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用session实现真实的计数器
在上一章介绍过一个简单计数器,虽然实现了计数功能,但只要一刷新网页,计数器的数值就增加,反映的访问人数不真实。用户是站点的第5位访问者,怎样刷新网页都应还是第5位,即便是他访问了站点的其他网页,又回到计数器所在的网页,计数器仍然显示是第5位,这才是真实的计数器。本范例就使用session的特性,实现这种真实计数器的功能。
一、范例的演示和代码清单
演示步骤:
1.启动JSP引擎后,启动IE,在地址栏键入http://127.0.0.1:8080/ch3/ch3-31.jsp,
如图3-12所示:
图3-12
2.刷新当前网页,会发现计数器的数值不发生变化,多次刷新数值都不发生变化。
3.这时如果是在局域网上体验范例,再从另外两台计算机访问本机的范例。那两台计
算机会显示是“第2位访客”和“第3位访客”,他们刷新网页,计数器的数值也
不会发生变化。
4.访问范例网页的所有计算机(包括本机),点击“返回”,然后再进入本范例网页,
计数器仍然是原来的数值。(即便是访问多个其他网页后,再进入本范例网页,计
数器也不发生变化。)
5.此时如果在局域网上有一台计算机点击“注销返回”,然后再进入本范例网页,计
算机屏幕上显示是“第4位访客”,其他依次注销,然后再进入本范例网页的计算
机,将是“第5位访客”和“第6位访客”。
6.如果没在局域网上,只在本机上体验范例。每次注销后再进入本范例网页,计数器
将自动加一。
从范例的演示,可以进一步体验到session的魅力和作用。还有一点要说明,session 默认的生命周期是1800秒(30分钟),如果在这个时间内,没有再次使用session,他将自动消失。
下面是范例的代码:
范例ch3-31jsp
1)<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" %>
2)
3)
4)
5)
6)<%! int count=0;%>
7)<%
8)String usercount; //usercount 用来记录使用者上网时的人数
9)request.getSession(true); //建立使用者的session
10)if(session.isNew()) //判断使用者的session是否为新创建的
11){
12)count++;
13)usercount = String.valueOf(count); //将数值型数据转换成字符串型数据
14)session.putValue("usercount",usercount); //写入session
15)}
16)out.print("您是本站的第");
17)out.print(session.getValue("usercount"));
18)out.print(" 位访客");
19)%>
20)
21)
22)
23)
24)
范例ch3-32.jsp
1)<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql%>
2)
3)
4)
5)<% session.invalidate(); //删除session
6)response.setHeader("Refresh","1;URL=index.htm"); %>
7)
8)
注销当前用户
9)
10)
二、JSP动态网页的代码分析
范例ch3-31.jsp的设计思路是,定义一个整型变量用于计数,创建session保存转换成
字符串型的计数数值。然后从session中提取数据送到屏幕上显示。而在session创建之后,写入数据之前,要判断session是否为本次运行JSP网页新创建的。如果是新创建的,整型变量加一写入session,从session中提取数据送到屏幕上显示,新用户访问网页,整型变量都加一,因此每个新用户计数器的数据不一样;如果session不是新创建的,则直接从session 中提取原有的数据送到屏幕上显示。因此刷新网页时,用户屏幕上显示的数据不会发生变化。
网页中“注销返回”链接的是ch3-32.jsp网页,他的作用是删除用户的session。所以注销后,再次访问ch3-31.jsp,必然重新创建session,计数器也就发生新的变化。
相关的代码提示如下:
Session计数器的代码行:
在ch3-31.jsp中:
6)<%! int count=0;%> 定义整型变量用于计数
7)<%
8)String usercount; 定义字符串行变量以便写入session
9)request.getSession(true); 建立用户的session
10)if(session.isNew())判断用户的session是否为新创建的
11){
12)count++; 整型变量加一
13)usercount = String.valueOf(count); 将数值型数据转换成字符串型数据
14)session.putValue("usercount",usercount); 写入session
15)}
16)out.print("您是本站的第");
17)out.print(session.getValue("usercount")); 从session中提取数据送到屏幕上显示
18)out.print(" 位访客");
第10行是这个范例重要代码行,他判断本次访问网页的用户session是否是新创建的。
如果访问网页的是新用户第9行必定为该用户创建一个session,第10行session.isNew()的返回值为True,这样网页就会运行11-15行,整型变量count加一,数值转换成字符串并赋值给usercount,再写入session。然后才能运行16-18行,此时17行从session中提取的数据,是刚刚更新的,屏幕上计数器的数值是新数据。
如果访问网页的用户是(刷新)重复访问者,第9行不会为该用户创建session,第10行session.isNew()的返回值为False,这样网页就会直接运行16-18行。此时17行从session 中提取的数据,是原来的数据。屏幕上的计数器不会发生变化。
删除session的代码行:
在ch3-32.jsp中:
5)<% session.invalidate(); //删除session
删除session的代码行,在本章第一节介绍过,他是JSP默认对象session的一个方法。这里再介绍session对象的另一个方法,前面说过session的默认生命周期是1800秒,而生命周期的长短是可以设定的。设定session生存时间的方法是session.setMaxInactiveInterval(时间),方法中的“时间”用数值表示,单位为秒。
如果在ch3-31.jsp的第10行之后增加一行代码:
session.setMaxInactiveInterval(120);
session的生存时间被改变成120秒,用户访问网页120秒(2分钟)之后,再次访问范例网页时,原来的session已经消失,又会成为新用户,重新创建session,屏幕上计数器就会变成新的数值。