分享
 
 
 

ASP讲座之三:Application对象与Session对象

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

上一讲中,我们学习了Request对象的Form数据集合、QueryString数据集合和ServerVariables数据集合。在继续下面的学习之前,建议你先轻松一下,因为接下来要介绍的Application对象相对比较抽象,刚开始理解起来恐怕会不辨东西。切记:当你找不到北时,便不要过多考虑Application对象到底是什么东西?还是一句老话,先学会使用它。

一、了解Application对象。为了提神,我们先看一个计数器的例程(你应该运行它以便于理解):

先编辑一个wuf16.htm文件:

<html>

<body>

记录某个页面的点击数示例:<a href="wuf17.asp">wuf17.asp</a>

</body>

</html>

wuf17.asp的代码如下:

<% @ LANGUAGE = VBScript %>

<% 'wuf17.asp - 记录某一页面的访问数(计数器原理)

Option Explicit

Dim CountWeb

CountWeb = Request.ServerVariables("SCRIPT_NAME")

'这样保证每个页面都有一个唯一的变量, 避免混乱

%>

<HTML><BODY>

<%

Response.Write CountWeb & "<Br><Br>" & vbcrlf

Application.Lock '请看讲解

Application(CountWeb) = Application(CountWeb) + 1 '累加器,点击数加1

Application.UnLock

Response.Write "WEB服务器关闭重启前该页的点击总数为: " & Application(CountWeb)

%>

</BODY></HTML>

运行这个程序时,对大部分的人来说,只有一台机器,既是Web服务器,又是客户端。那么你只能想象这样一种境况了:你的这两个主页文件放在很远的Web服务器上,而如潮水般的国内外用户正通过浏览器访问它们。每个用户点击一次,Application(CountWeb) 的值就加1,而且只要存放文件wuf17.asp的服务器没有关闭,Application(CountWeb)就将一直累加下去。但是注意,如果服务器关闭后重启,则Application(CountWeb)将重新从0开始计数(我晕,我说我的页面访问数怎么老是一位数)。为了避免这种永远从零开始的计数情况,你必须要在服务器关闭之前将Application(CountWeb)的值保存起来,下次需要时再取出来,就能够顺序累计下去了,具体如何做,且听N回后分解。

接下来的问题,就是Application.Lock、UnLock是什么意思?刚才我们做了一个假设,大量的用户正在访问该页面,而每一个用户的点击都会发生Application(CountWeb)加1,想想看,这样不就乱套了(什么!想不出,那肯定是你的主页终日只有你一个人赞助),所以得有个先来后到的规则。当某一用户访问该页面,需要修改Application(CountWeb)的值时,使用Lock方法加锁,避免其他用户修改,修改完后,再解锁。

从上例中您是否已看出,Application对象提供给所有用户共享信息(Application(CountWeb)),它所面向的是所有用户(每个用户的访问都会导致计数器加1)。Application对象还有两个事件,Application_OnStart事件和Application_OnEnd事件(您可千万别晕,这只是面向对象编程语言中起步的概念),使用时语法如下:

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_OnEnd

‘当WEB服务器关闭时,将激活Application_OnEnd事件

‘也就是程序将执行放在这里的代码

‘因此服务器关闭前我们可以在这里将wuf17.asp中Application(CountWeb)的值

‘保存起来,如放在一个文本文件中。

End Sub

Sub Application_OnStart

‘当第一个用户浏览ASP网页时,将激活Application_OnStart事件,而以后其他用户浏览时,就不发生这一事件了

‘也就是程序将执行放在这里的代码

‘因此可在这里读出保存在文本文件中Application(CountWeb)的值。

End Sub

</SCRIPT>

下面通过一个实例来说明如何使用事件,该程序的作用是统计站点所有页面的总点击数。

文件wuf18.asp的代码(站点内其他页面文件与这个文件类似):

<% @ LANGUAGE = VBScript %>

<% Option Explicit

‘站内所有页面文件都应包括这句<!--#include file="wuf19.asp"-->%>

<!--#include file="wuf19.asp"-->

<HTML><BODY>

在服务器关闭重启之前站点所有页面总点击数: <%= Application("CountAll") %>

</BODY></HTML>

文件wuf19.asp的代码:

<% ' wuf19.asp

Application.Lock

Application("CountAll") = Application("CountAll") + 1

Application.UnLock

%>

文件wuf18.asp与wuf19.asp放在同一目录下。文件global.asa的代码:

注意:事件处理程序必须以名为“global.asa”的文本文件存盘,而且必须放在虚拟路径的根目录下(一般就是与index.htm或default.htm文件放在同一目录下,例如:以我的机器为例,就绝对路径而言,global.asa放在c:\InetPub\home下,而wuf18.asp和wuf19.asp放在c:\InetPub\home\asp下),同一虚拟路径只允许有一个global.asa文件存在。

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

'global.asa - wuf18.asp 在下载包中的文件名为18global.asa,使用时要改名。

Sub Application_OnStart

‘当第一个用户浏览网页时,置计数器初值为0,

‘而以后其他用户浏览时,不再执行以下代码

Application.Lock

Application("CountAll") = 0

Application.UnLock

End Sub

</SCRIPT>

浏览wuf18.asp查看运行结果。看来,仅仅学会使用Application对象并不难。

||||||二、认识Session对象。有了前面的Application对象做铺垫,Session对象就容易多了。它与Application对象类似,只不过是仅仅用来记录单个用户的相关信息,它面向单个用户,因此我们可以使用Session对象存储某单个用户的信息。

与Application对象一样,Session对象也有两个事件:Session_OnStart事件和Session_OnEnd事件。使用语法与Application对象类似。

值得一提的是,使用Session对象前,必须确认浏览器的Cookie功能已启用(默认设置就可以了)。

下面举一个实例,文件global.asa的要求同上,因此上例中的global.asa将被本例中的global.asa覆盖。

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

' global.asa - wuf20.asp 在下载包中文件名为20global.asa

Sub Session_OnStart

Session("In") = Now ‘函数Now取得当前时间

End Sub

Sub Session_OnEnd

Session("Out") = Now

Application.Lock

Application("Out") = Session("Out")

Application("In") = Session("In")

Application(“Out”).UnLock

End Sub

</SCRIPT>

文件wuf20.asp:

<%@ Language=VBScript %>

<HTML>

<BODY>

<% 'wuf20.asp

Response.Write "默认Timeout设置:" & Session.Timeout & "分钟<Br>"

Session.Timeout = 1

Response.Write "您进入本站的时间:" & Session("In") & "<Br>"

Response.Write "请在 1 分钟后刷新本页" & "<Br><Br>"

if Not IsEmpty(Application("Out")) then

Response.Write "您上次进入本站的时间:" & Application("In") & "<Br>"

Response.Write "您上次离开本站的时间:" & Application("Out") & "<Br>"

Response.Write "浏览时间(分钟):" &_

Datediff("n",Application("In"),Application("Out")) & "<Br><Br>"

End If

if IsEmpty(Session("Out")) then

Response.Write "刷新前和刷新后Session(""Out"")的值都为空" & "<Br>"

End If

%>

</BODY>

</HTML>

当用户第一次浏览网页时,发生Session_OnStart事件,程序记录用户本次进入网页的时间,而此时不会发生Session_OnEnd事件,故Application("Out")值为空,程序不会显示浏览时间。

我们知道,Application对象的生存期为第一个用户浏览网页直至服务器关闭。而Session对象的生存期为用户第一次浏览网页(会话开始)直至会话结束。那什么时候会话结束呢?具体到本例中,Session.Timeout = 1设置会话超时为1分钟,即如果长达1分钟没有向Web服务器提供请求,则会话超时,导致会话结束,发生Session_OnEnd事件,程序执行Session_OnEnd内的代码。在这里我们将进入和离开时间分别放入Application("In")和Application("Out"),因为会话结束后,Session对象将不复存在,这点我们在代码的最后做了验证。

从这个例程,可以看出:

1. Application对象和Session对象的生存期不同。

2. Session对象是针对单个用户的,它的值存放在客户端,其他用户的浏览对该单用户的Session对象没有任何影响。单个用户只能读写自己Session对象的值(如:Session("In"))。

3. 注意在Response.Write中显示双引号的表示方法:(""Out"")。

4. 特别提醒:该程序没有实用性,仅供调试用(仅适用于只有一个用户浏览的情况),请思考这是为什么?答案见本文末。

提示:请注意Application对象的特性。

三、一个经典的实例:如何在网页上显示在线人数

在下面的例子中,用Application("Online")来存放在线人数,用Application("CountAll")存放总访问人数。

原理:当一个新用户浏览网页时,发生Session_OnStart事件,在线人数加1,访问用户数也加1。当某用户离开时,会话超时后会发生Session_OnEnd事件,在线人数减1。

Global.asa代码如下:

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

' Global.asa - wuf21.asp

Sub Application_OnStart

Application.Lock

'在这里读出Application("CountAll")的初始值

Application.UnLock

End Sub

Sub Session_OnStart

Application.Lock

Application("Online") = Application("Online") + 1

Application("CountAll") = Application("CountAll") + 1

Application.UnLock

End Sub

Sub Session_OnEnd

Application.Lock

Application("Online") = Application("Online") - 1

Application.UnLock

End Sub

Sub Application_OnEnd

Application.Lock

'应该在这里将Application("CountAll")保存到文件中

Application.UnLock

End Sub

</SCRIPT>

Wuf21.asp代码如下:

<%@ Language=VBScript %>

<HTML>

<BODY>

<%Session.Timeout = 5%>

<P>在线人数: <%= Application("Online")%></P>

<P>访问总人数: <%= Application("CountAll")%></P>

</BODY>

</HTML>

请注意将本例程与wuf17.asp对比,后者是计算点击数,而前者是计算访问人数。

答案:由于Applicaton对象适用于所有用户,所以在多用户的情况下,其他用户的浏览也会改变Application(“In”)和Application(“Out”)的值。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有