最新改版

Global.asa 文件

上一篇 / 下一篇  2007-03-30 23:31:14 / 个人分类:网络学习

   什么是 Global.asa 文件?它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件的名称必须是 Global.asa 且必须存放在应用程序的根目录中。每个应用程序只能有一个 Global.asa 文件。
Cv+XRK?c8n){7x0云南博客(Y} mkS0r+D*]{
   在 Global.asa 文件中,如果包含的脚本没有用 < scrīpt> 标记封装,或定义的对象没有会话或应用程序作用域,则服务器将返回错误。我们可以用任何支持脚本的语言编写 Global.asa 文件中包含的脚本。如果多个事件使用同一种脚本语言,就可以将它们组织在一组 < scrīpt> 标记中。
A4HY_U1H0云南博客;w+w n*y'H
   在 Global.asa 文件中声明的过程只能从一个或多个与 Application_OnStart、Application_OnEnd、Session_OnStart 和 Session_OnEnd 事件相关的脚本中调用。在基于 ASP 的应用程序的 ASP 页中,它们是不可用的。如果要在应用程序之间共享过程,可在单独的文件中声明这些过程,然后使用服务器端包容 (SSI) 语句将该文件包含在调用该过程的 ASP 程序中。通常,包含文件的扩展名应为 .inc。云南博客,l-OXhit+W K

&^1|R&@-\ @1?0   下面是一个很标准的 Global.asa 文件 : 云南博客 a1~ ~4i,XM0K
< scrīpt LANGUAGE="VBscrīpt" RUNAT="Server">
m*O;l4VY0'Session_OnStart 当客户首次运行 ASP 应用程序中的任何一个页面时运行
k8jo1yw y0G0'Session_OnEnd 当一个客户的会话超时或退出应用程序时运行云南博客#R+z/m!Yb3s
'Application_OnStart 当任何客户首次访问该应用程序的首页时运行
&Z I:nX/~T tS-S H&c0'Application_OnEnd 当该站点的 WEB 服务器关闭时运行
s3O ~qWY!R s M0< /scrīpt>
Hd%r&}b8Z0
;vH"@D5x6^ O0< scrīpt LANGUAGE="VBscrīpt" RUNAT="Server">云南博客 GL rS@ w0wPq
Sub Application_OnStart云南博客9Y]m_f:zo
VisitorCountFilename = Server.MapPath ("/ex2") + "\VisitCount.txt"云南博客0R'Pl C&X5e9g0o I o
Set FileObject = Server.CreateObject("scrīpting.FileSystemObject")云南博客-]v,x F Lt5q&b
Set ōut= FileObject.OpenTextFile (VisitorCountFilename, 1, FALSE, FALSE)
{&C;Zn-J7b5\0Application("visitors") = Out.ReadLine
5g?"eeU(R Jb];n0Application("VisitorCountFilename") = VisitorCountFilename云南博客i9ZNi)Sn%@j
End Sub云南博客k5~g1KjW nn
'=========================================================云南博客f!b w)K8Geu{-x
SUB Application_OnEnd
Fo/D2w0G;y0Set FileOutObject = Server.CreateObject("scrīpting.FileSystemObject")云南博客)V,r/eMr6D?D C$}
Set ōut= FileOutObject.CreateTextFile (Application("VisitorCountFilename"), TRUE,FALSE)
*O*B f4d3\@ r8OH*}P0Out.WriteLine(application("visitors"))云南博客 G@vy kH
End Sub云南博客DMau9H)j["[X*Z
'=========================================================Sub Session_OnStart
q:A6Dni0Session.Timeout = 5
X.p'?c?Rt0Application("visitors") = Application("visitors") + 1云南博客 {3Z!P3l s&R A
Session("ID")=Session.SessionID
x6Cg\R0End Sub云南博客.ZULE,WgP9[4x
< /scrīpt>云南博客3^*s}$UiT%[

+R?GY5B D-h0   在这个 Global.asa 程序中,涉及到了 ASP 的 File Access 组件,它可以提供用于访问文件系统的方法、属性和集合。这将在以后 ASP 的组件中进行展开讨论。在这里,它起到了在服务器上创建新文件并对文件进行写操作的作用。这其实是一个 ASP 页面访问记数器应用程序的 Global 文件,首先当客户首次访问该应用程序的首页时 , 过程 Application_OnStart 定义了在服务器上指定的虚拟目录下新建一个 VisitCount.txt 的文本文件,并将文件的路径和内容保存在应用程序级的变量中。而当任何一个客户访问 ASP 应用程序中的任何一个页面时,过程 Session_OnStart 定义将应用程序级的变量 visitors 的值自动加一。这样,每当有客户访问页面时,变量 visitors 都将自动加一,以起到统计点击率的作用。由于变量 visitors 的值是存储在系统内存之中,所以如果服务器关闭或重新启动,存储在变量中的数据将自动丢失,所以通过定义过程 Application_OnEnd,在服务器关闭或重启之前将数据写入事先建立的文本文件之中,这样就能确保当服务器再次启动时,Application_OnStart 过程可以从 VisitCount.txt 文件中读取以前的统计数。

    首先.asa是文件后缀名,它是Active Server Application的首字母缩写。Global.asa文件可以管理在ASP应用中两个非常苛刻的对象:Application、Session。
P m&C G+?)KZ8j0云南博客c!jYd1K*r
它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件必须存放在应用程序的根目录内。每个应用程序只能有一个Global.asa文件。 云南博客R sg(Cnz@[-D%l
云南博客 du"a7pIH%V#E
关于Global.asa文件最常见的错误概念是它能为一般的使用的函数和子程序用作书库。Global.asa文件仅能用于创建对象的引用和俘获启动,以及结束Application对象和Session对象。
9o ^N+M(Z0云南博客H3J_ Y8i,lf
Global.asa文件主要基于会话级事件被访问,在以下三种情况下被调用: 云南博客B6a z+S#o#f
1,当Application_OnStart或Application_OnEnd事件被触发。 云南博客`:^.N2O\f'}F$r
2,当Session_OnStart或Session_OnEnd事件被触发。 云南博客udd4f}
3,当引用一个在Global.asa文件里被实例化的对象(Object)。
7N0_"h0NNH;klv0Global.asa的标准文件格式如下: 云南博客F NJ5D__`
<scrīpt LANGUAGE="VBscrīpt" RUNAT="Server">
PsG#b%JU(k0Sub Application_OnStart
7\K,vv YJ(oD)?0'Application_OnStart 当任何客户首次访问该应用程序的首页时运行 云南博客n ~6L.HMG P2?
End Sub 云南博客rp:I'F,^;I\T;b4}

N}[2X%D0Sub Session_OnStart
{g+j)]v!d{+z F0'Session_OnStart 当客户首次运行 ASP 应用程序中的任何一个页面时运行
~(i:\ Vq G hx+D_0End Sub 云南博客"lHfOt"TH%a#b

$@DB&vc-x0Sub Session_OnEnd
X1z9N}St!\"I0MQ(O)m0'Session_OnEnd 当一个客户的会话超时或退出应用程序时运行 云南博客 U'[:y*`7wBH8K0t
End Sub 云南博客*~0j"[c;k3n1m*I

dyfjf:bmA0Sub Application_OnEnd 云南博客 q:ip6O_3]
'Application_OnEnd 当该站点的 WEB 服务器关闭时运行
C j/p5y4ZRt&H0End Sub 云南博客5_)p`;Awp6O
</scrīpt>
f C%P~&n{Zu0
+\N1@'z%X:W0
B5?2cp2Ex$mR6r~0云南博客{K%B'|o
云南博客(j&K[eQ"s f

.x&m B0BUz0nt0一、Session_onStart 云南博客c3b+yhvC([
先看一个控制用户进入页面的代码: 云南博客 kX8\3b P$Y"|(h`0a@
1,Global.asa(放在被调试的虚拟目录的根目录下面) 云南博客U GWm6v h
云南博客sR{Ek(J8n5~7{f/K
云南博客4R G J[)C-oP
<scrīpt LANGUAGE="VBscrīpt" RUNAT="Server">
bPC(Y3_2O7?lK0Sub Session_OnStart '只要是用户第一次登录本站,则会跳转到首页
WGDX7otw0response.redirect("htp://
www.cnbruce.com/")
&G-`/H LE:u\l0End Sub
9s^^tPP'`8ZN0</scrīpt>
5K&? Le:R#Q+I0
$}W#Awk:xLtt` @0
j DH ?1b fgwn0云南博客 H&I1h#V5D5NU Z*t
云南博客 FF#vr1F
然后调试当前虚拟目录下的任何文件,你会发现所有页面都跳转向htp://
www.cnbruce.com/ 云南博客I8R;o.uGE
通过此“强制进入某页”的例子,可以想象当首页需要被关注的时候是非常有必要的。
s:cjg3t0
Rc | q ~%f%B5G8b0下面就以一个“在线人数”的例子来继续观察Session_OnStart和Session_OnEnd事件 云南博客.u%]2g"[c,G {

(m| g:GD0二、Session_onEnd 云南博客2f}I6fm"d,BGd
2,Global.asa(放在被调试的虚拟目录的根目录下面) 云南博客0AR`qi$[Y@Z}
云南博客D G6x Fu

%sn3`y7r3MK`0<scrīpt LANGUAGE=VBscrīpt RUNAT=Server>
k L"l1b toz;D3@vV0Sub Application_onStart '初始值为0 云南博客!Bx`eMpd
Application("OnLine") = 0
I d)t#A5DJs\ ^0End Sub 云南博客9FO7^{4S:FH}:m

L4^o-eAo qT*G8p#n h0Sub Session_onStart '一个用户访问进行记数加1 云南博客M+nf\6\@6zbm
Application.Lock
3WO:D1rn2q0Application("OnLine") = Application("OnLine") + 1 云南博客3TF-Z8vo8c
Application.Unlock
!D,^;z)Z-n%E0End Sub 云南博客#f&Okq7_qV

Uv C)C|^2t3k0Sub Session_OnEnd '一个用户进程的结束,记数减1 (P.S.如果没有该事件程序,则执行的就是页面访问程序了。) 云南博客OQ/F(W3Na c0P
Application.Lock
,ui u7l.B2X0Application("OnLine") = Application("OnLine") - 1 云南博客,Mc'U~_reD-U
Application.Unlock 云南博客De4Y)@:c
End Sub
4{"Qy.^/Zf4Ph*cv0</scrīpt> 云南博客j2n QI&l xX
云南博客TyIb]8aa
云南博客T!`i/_[\*P$q
云南博客%pb3]?.E
云南博客5Ld j1\'d|2J({9?
云南博客 ]3bG3vM0G]%nSO
3,online.asp
zA/f;fr KyK0
l5X2w8}8w(_s0云南博客l!Bvk"W9d6c
<% 云南博客*d.pkV\O
if request.querystring("logout")="true" then
1zxS5g `W:a0session.Abandon()
5h]o(c)nk{0response.end
;r'X#V7b-l!aM7I y0end if 云南博客k3x$W.O*g q*Q
%> 云南博客5{.Q4E/K[ lj
当前共有<%=Application("OnLine")%>在线
f;W9g XQ4y0<a href="online.asp?logout=true">退出</a>
IN6X}D7X gF0
Q$p#Ej'}0云南博客:eq"b ~B1Y T$BAt8wt

.d}q-Yw I#]$dK2b0
jX~|c0你发现在该页中只有一个Application("OnLine"),而且还是被显示引用的。那么其值来自何方?这正是Global.asa文件的关键所在。
GX/`;A-yXI"p`0你可以在本机依次打开个窗口,进行进行关闭窗诨蛲顺隽街址椒ǖ牡魇浴?br> 云南博客*`LO9W5bp NX
三、继续细化一下
?!Ne-E7?y]^%c0上面的程序你会发现:当进行“退出”连接后关闭窗口和直接关闭窗口效果是不一样的。因为Session存在时间的缘故,当直接进行关闭窗口,并不能触发Session_OnEnd事件,所以该如何实现这个几乎不可能的想法呢?
_0Q,saA]r0云南博客6F#e"E3qNA0{
大家都知道,当网页进行关闭的时候可以连带一个onunload事件,那么该onunload只要能执行Session的注销功能不就我们需要的吗?废话少说,将online.asp进行修改 云南博客J&F"a;M;~$j+G4u
云南博客$]EM)t%`B;O
3,online.asp
#{ ^6Ot \yp4VTs0云南博客z C6HN9|

nsO6DX@0<% 云南博客jc0_s(?R'f U/mA
if request.querystring("logout")="true" then
v(|3|:M)m+e0session.Abandon()
1h0B(Rq,@5{4R M0response.end 云南博客E#EF$w9?
end if
9Vo#y"?|%Es"K0%>
'[sk:nr0<body ōnunload=javascrīpt:window.open("exit.asp")> 云南博客9Q5ho2z)Q@+f
当前共有<%=Application("OnLine")%>在线
'Hx }o^x%R0<a href="online.asp?logout=true">退出</a>
A&s[4L0t A;vs0
B:C1az7\,F0云南博客{UKc"fkH TO$s9~HW
云南博客I EyN8S
云南博客nB Y!S%o

:PJ+M2BIp%H h0注意,online.asp进行onunload的时候会打开exit.asp,那只要在exit.asp中再设置session.Abandon()不就OK了。
hUiZ{0
eMvn-X:X04,exit.asp
e#wh6R2R$R!d0
V2J.[WE Q6\'M;O8c0
b6xs5^2ud2T0<%session.Abandon()%>
nS0lyt&M0<scrīpt>
6B(u:q6n}-Mt?&E0self.close() 云南博客/G+E7{`k|6xKs}'u
</scrīpt>
,?d J5N2N0云南博客M3RFT6GT$V

&E3]o\}+Ej$t S ?0云南博客`G9GtV2kf[Iu
云南博客/I:E/q.F@(P
当然,加了段scrīpt脚本,目的是进行Session的注销以后立即进行关闭本身。 云南博客I?{9T Q5@V pZ8y
那现在基本一个在线统计的Web应用就可以了。 云南博客EM'E q!xr Gx$u
云南博客-Z.z'i s&V Cb;C as*q1P
四、深入研究Global.asa
zL&^a-F#lS-cz0从上面的调试中,举一反三的你,一定会提出一个问题:如何控制注册用户在线人数?
ZGM(Fup%]Ap0那下面几个文件一个一个看:
&XE0cg'uLv~0
M5C {2l WfR:q bK05,Global.asa(放在被调试的虚拟目录的根目录下面) 云南博客"l g?yd+eG v'e7]
云南博客Zu5?0PX L

4R5f vyq of0<scrīpt LANGUAGE="VBscrīpt" RUNAT="Server"> 云南博客,I {RD P6C'N!p-`0ds
Sub Application_OnStart 云南博客F}0R{P*y
application("online")=0
yNYz u0End Sub 云南博客i a/~9A5|TP)tQ.R7v.G
云南博客7j,m;} X}n
Sub Session_OnStart
jVh!eI_4g/c0End Sub
Qd S}b0云南博客vQxCX@T
Sub Session_OnEnd
y9w CL(T4Dw_k0if session.contents("pass") then '判断是否为登录用户的Session_OnEnd
6f;|"A*c9h0rF7_.Hl0application.lock
/b,dS4@C|v5l8s0application("online")=application("online")-1 云南博客4pB/@:M!S;m
application.unlock 云南博客x:d%O-e8t
end if 云南博客C~tqU7bT%wxc
End Sub 云南博客@yjrd

FS \2G^8UF0Sub Application_OnEnd 云南博客qP)@ eKR p7\H
End Sub
4Y'|wC+~4Z4|-v0</scrīpt> 云南博客0z%X3D]$iZV6sq s yR

7] co VTEG,n!~0
2f?jb3H0
W3RpQ%R i X0云南博客}TlR!hxn)P
注意本Global.asa中的Session_OnStart块不做任何事件。
&l]`hAMM7lL0
v~}1Y PwfC&n4H/E0因为一旦有用户访问服务器而不管用户是否登录,都会产生OnStart事件,而现在需要的只是登录用户的在线,所以不能在OnStart事件里使Applicaiton("online")加1。
#Jm?{ i_0
nfTZh*v+k0又因为不管是否是登录用户的会话结束都会产生OnEnd事件(假如有访客访问了服务器但并不登录,他的会话结束后也会产生OnEnd事件),所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件,如果是才将在线人数减1。 云南博客 z:J(z TD3s7C8HXD

*vWu ]-? ~ }h0并且值得注意的是:session.contents("pass")的使用,因为在OnEnd事件里禁止使用Session对象,但是可以用Session对象的集合来调用session变量。也就是说不能直接写session("pass"),而是需要写session.contents("pass")。 云南博客Uy(J'q%d9K9?Lc

,t1A!oH'{o+xl06,login.asp
j^5}Prk0云南博客G/Xr+eX,m

KC_CMW0<%
4`3m)Md^O0if request.querystring("logout")="true" then
zDm#O*X:C\0session.Abandon() 云南博客;] dw)R X.rt(F1M
end if
+d5V(i VK3T0submitname=request.form("submit")
6x)Plc^5b0if submitname="submit" then 云南博客&[i g[e.sU,eky
name=request.form("name") 云南博客Aw&i'd T0K J
pwd=request.form("pwd")
-XF GxEZ0^?`|#Z0if name="cnbruce" and pwd="cnrose" then 云南博客%R X;eKuw,|
session("name")=name 云南博客X u*b7VD `
session("pass")=true
h2q6S-?dwS's0else 云南博客f J|`m!`
response.write "Error Name Or Pwd.<a href='login.asp'>Back</a>"
]0Xx]!~1`$N!m0response.end 云南博客b&L.F(Hy B xS1X
end if
xwd~y&M$@3w.Y0application.lock 云南博客8Q w J/{#D
application("online")=application("online")+1
7t3I]J7vhO0application.unlock
4vw6O5Tq+U ?p0%>
KA\}^3P&NT0当前注册会员<%=application("online")%>人。 云南博客7sE;c nj
<a href="login.asp?logout=true">退出</a> 云南博客"NZ,gJj\'Ui7k
<%else%> 云南博客 oWi:VI*P6PQ
<form action="login.asp" method="post">
.E4aQ-wlP)\0<input type="text" name="name"><br> 云南博客$vTrDE~W0j
<input type="password" name="pwd"><br>
N j R JAa0<input type="submit" name="submit" value="submit"> 云南博客5u(oG~0H/K eO
<%end if%> 云南博客!e8a%A3\{8Bmt
云南博客^v4{.e5rd%`j\
云南博客D{+KmCo/at

k `&P"c(bGB?'O Z?0云南博客8U-nSq2A:pe
只是简单地检测用名是cnbruce,密码是cnrose的时候,生成一个session("pass")=true,就是放在Global.asa中判断的。 云南博客`*NTa0n~$T `
云南博客YG3d7tw?T#_h
五,继续发挥想象
F.s8Q#lto'Y!~0想想,再想想。仅仅统计有多少人在线是不够的,还要判断用户的在线状态。 云南博客M$Xe'y?(@
可以想象办法基本,当用户登录的时候,在login.asp里将online设为1(如果有数据库则上传),但用户离线时将online设为0,要完善它,就要修改一下Session_OnEnd事件,在该事件里将online设为0(同样将为0的值上传)……
&qg9lykM,D0云南博客2R'pK.L0F&fR8fe`T
当然,Global.asa远远不止这些。不过我们现在先不着急全部掌握,当我们接触到数据库的时候再返回过来看,继续研究该文件,相信到那时一定又会感悟到很多。所以,还是先把上面的这些吃透吧:)


TAG: 网络学习

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar