asp

位置:IT落伍者 >> asp >> 浏览文章

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


发布日期:2021年03月18日
 
ASP讲座之三:Application对象与Session对象

了解Application对象

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

先编辑一个文件

<html>

<body>

记录某个页面的点击数示例<a >wufasp</a>

</body>

</html>

wufasp的代码如下

<% @ LANGUAGE = VBScript %>

<% wufasp 记录某一页面的访问数(计数器原理)

Option Explicit

Dim CountWeb

CountWeb = RequestServerVariables(SCRIPT_NAME)

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

%>

<HTML><BODY>

<%

ResponseWrite CountWeb & <Br><Br> & vbcrlf

ApplicationLock 请看讲解

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

ApplicationUnLock

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

%>

</BODY></HTML>

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

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

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

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_OnEnd

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

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

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

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

End Sub

Sub Application_OnStart

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

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

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

End Sub

</SCRIPT>

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

文件wufasp的代码(站点内其他页面文件与这个文件类似)

<% @ LANGUAGE = VBScript %>

<% Option Explicit

站内所有页面文件都应包括这句<!#include file=wufasp>%>

<!#include file=wufasp>

<HTML><BODY>

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

</BODY></HTML>

文件wufasp的代码

<% wufasp

ApplicationLock

Application(CountAll) = Application(CountAll) +

ApplicationUnLock

%>

文件wufasp与wufasp放在同一目录下文件globalasa的代码

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

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

globalasa wufasp 在下载包中的文件名为globalasa使用时要改名

Sub Application_OnStart

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

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

ApplicationLock

Application(CountAll) =

ApplicationUnLock

End Sub

</SCRIPT>

浏览wufasp查看运行结果看来仅仅学会使用Application对象并不难

认识Session对象

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

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

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

下面举一个实例文件globalasa的要求同上因此上例中的globalasa将被本例中的globalasa覆盖

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

globalasa wufasp 在下载包中文件名为globalasa

Sub Session_OnStart

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

End Sub

Sub Session_OnEnd

Session(Out) = Now

ApplicationLock

Application(Out) = Session(Out)

Application(In) = Session(In)

Application(Out)UnLock

End Sub

</SCRIPT>

文件wufasp

<%@ Language=VBScript %>

<HTML>

<BODY>

<% wufasp

ResponseWrite 默认Timeout设置: & SessionTimeout & 分钟<Br>

SessionTimeout =

ResponseWrite 您进入本站的时间: & Session(In) & <Br>

ResponseWrite 请在 分钟后刷新本页 & <Br><Br>

if Not IsEmpty(Application(Out)) then

ResponseWrite 您上次进入本站的时间: & Application(In) & <Br>

ResponseWrite 您上次离开本站的时间: & Application(Out) & <Br>

ResponseWrite 浏览时间(分钟): &_

Datediff(nApplication(In)Application(Out)) & <Br><Br>

End If

if IsEmpty(Session(Out)) then

ResponseWrite 刷新前和刷新后Session(Out)的值都为空 & <Br>

End If

%>

</BODY>

</HTML>

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

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

从这个例程可以看出

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

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

. 注意在ResponseWrite中显示双引号的表示方法(Out)

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

提示请注意Application对象的特性

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

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

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

Globalasa代码如下

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Globalasa wufasp

Sub Application_OnStart

ApplicationLock

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

ApplicationUnLock

End Sub

Sub Session_OnStart

Applic

上一篇:ASP基础教程之ASPAdRotator组件的使用

下一篇:ASP错误全集错误