上一讲中,我们学习了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”)的值。