分享
 
 
 

ASP编程入门进阶(十)Global.asa

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

我们已经知道Application和Session对象的OnStart、OnEnd事件的脚本,都必须是在 Global.asa 文件中声明的。那究竟Global.asa是什么样的一个文件?它的作用有何?又该如何运用呢?且听我慢慢道来。

首先.asa是文件后缀名,它是Active Server Application的首字母缩写。Global.asa文件可以管理在ASP应用中两个非常苛刻的对象:Application、Session。

它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件必须存放在应用程序的根目录内。每个应用程序只能有一个Global.asa文件。

关于Global.asa文件最常见的错误概念是它能为一般的使用的函数和子程序用作书库。Global.asa文件仅能用于创建对象的引用和俘获启动,以及结束Application对象和Session对象。

Global.asa文件主要基于会话级事件被访问,在以下三种情况下被调用:

1,当Application_OnStart或Application_OnEnd事件被触发。

2,当Session_OnStart或Session_OnEnd事件被触发。

3,当引用一个在Global.asa文件里被实例化的对象(Object)。

Global.asa的标准文件格式如下:

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub Application_OnStart

'Application_OnStart 当任何客户首次访问该应用程序的首页时运行

End Sub

Sub Session_OnStart

'Session_OnStart 当客户首次运行 ASP 应用程序中的任何一个页面时运行

End Sub

Sub Session_OnEnd

'Session_OnEnd 当一个客户的会话超时或退出应用程序时运行

End Sub

Sub Application_OnEnd

'Application_OnEnd 当该站点的 WEB 服务器关闭时运行

End Sub

</SCRIPT>

一、Session_onStart

先看一个控制用户进入页面的代码:

1,Global.asa(放在被调试的虚拟目录的根目录下面)

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub Session_OnStart '只要是用户第一次登录本站,则会跳转到首页

response.redirect("htp://www.cnbruce.com/")

End Sub

</SCRIPT>

然后调试当前虚拟目录下的任何文件,你会发现所有页面都跳转向htp://www.cnbruce.com/

通过此“强制进入某页”的例子,可以想象当首页需要被关注的时候是非常有必要的。

下面就以一个“在线人数”的例子来继续观察Session_OnStart和Session_OnEnd事件。

二、Session_onEnd

2,Global.asa(放在被调试的虚拟目录的根目录下面)

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_onStart '初始值为0

Application("OnLine") = 0

End Sub

Sub Session_onStart '一个用户访问进行记数加1

Application.Lock

Application("OnLine") = Application("OnLine") + 1

Application.Unlock

End Sub

Sub Session_OnEnd '一个用户进程的结束,记数减1 (P.S.如果没有该事件程序,则执行的就是页面访问程序了。)

Application.Lock

Application("OnLine") = Application("OnLine") - 1

Application.Unlock

End Sub

</SCRIPT>

3,online.asp

<%

if request.querystring("logout")="true" then

session.Abandon()

response.end

end if

%>

当前共有<%=Application("OnLine")%>在线

<a href="online.asp?logout=true">退出</a>

你发现在该页中只有一个Application("OnLine",而且还是被显示引用的。那么其值来自何方?这正是Global.asa文件的关键所在。

你可以在本机依次打开个窗口,进行进行关闭窗口或退出两种方法的调试。

三、继续细化一下

上面的程序你会发现:当进行“退出”连接后关闭窗口和直接关闭窗口效果是不一样的。因为Session存在时间的缘故,当直接进行关闭窗口,并不能触发Session_OnEnd事件,所以该如何实现这个几乎不可能的想法呢?

大家都知道,当网页进行关闭的时候可以连带一个onunload事件,那么该onunload只要能执行Session的注销功能不就我们需要的吗?废话少说,将online.asp进行修改。

3,online.asp

<%

if request.querystring("logout")="true" then

session.Abandon()

response.end

end if

%>

<body onunload=javascript:window.open("exit.asp")>

当前共有<%=Application("OnLine")%>在线

<a href="online.asp?logout=true">退出</a>

注意,online.asp进行onunload的时候会打开exit.asp,那只要在exit.asp中再设置_

session.Abandon()不就OK了。

4,exit.asp

<%session.Abandon()%>

<script>

self.close()

</script>

当然,加了段Script脚本,目的是进行Session的注销以后立即进行关闭本身。

那现在基本一个在线统计的Web应用就可以了。

四、深入研究Global.asa

从上面的调试中,举一反三的你,一定会提出一个问题:如何控制注册用户在线人数?

那下面几个文件一个一个看:

5,Global.asa(放在被调试的虚拟目录的根目录下面)

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub Application_OnStart

application("online")=0

End Sub

Sub Session_OnStart

End Sub

Sub Session_OnEnd

if session.contents("pass") then '判断是否为登录用户的Session_OnEnd

application.lock

application("online")=application("online")-1

application.unlock

end if

End Sub

Sub Application_OnEnd

End Sub

</SCRIPT>

因为一旦有用户访问服务器而不管用户是否登录,都会产生OnStart事件,而现在需要的只是登录用户的在线,所以不能在OnStart事件里使Applicaiton("online"加1。

又因为不管是否是登录用户的会话结束都会产生OnEnd事件(假如有访客访问了服务器但并不登录,他的会话结束后也会产生OnEnd事件),所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件,如果是才将在线人数减1。

并且值得注意的是:session.contents("pass"的使用,因为在OnEnd事件里禁止使用Session对象,但是可以用Session对象的集合来调用session变量。也就是说不能直接写session("pass",而是需要写session.contents("pass"。

6,login.asp

<%

if request.querystring("logout")="true" then

session.Abandon()

end if

submitname=request.form("submit")

if submitname="submit" then

name=request.form("name")

pwd=request.form("pwd")

if name="cnbruce" and pwd="cnrose" then

session("name")=name

session("pass")=true

else

response.write "Error Name Or Pwd.<a href='login.asp'>Back</a>"

response.end

end if

application.lock

application("online")=application("online")+1

application.unlock

%>

当前注册会员<%=application("online")%>人。

<a href="login.asp?logout=true">退出</a>

<%else%>

<form action="login.asp" method="post">

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

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

<input type="submit" name="submit" value="submit">

<%end if%>

只是简单地检测用名是cnbruce,密码是cnrose的时候,生成一个session("pass"=true,就是放在Global.asa中判断的。

五,继续发挥想象。

想想,再想想。仅仅统计有多少人在线是不够的,还要判断用户的在线状态。

可以想象办法基本,当用户登录的时候,在login.asp里将online设为1(如果有数据库则上传),但用户离线时将online设为0,要完善它,就要修改一下Session_OnEnd事件,在该事件里将online设为0(同样将为0的值上传)……

当然,Global.asa远远不止这些。不过我们现在先不着急全部掌握,当我们接触到数据库的时候再返回过来看,继续研究该文件,相信到那时一定又会感悟到很多。所以,还是先把上面的这些吃透吧:)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有