我们已经知道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的标准文件格式如下:
一、Session_onStart
先看一个控制用户进入页面的代码:
1,Global.asa(放在被调试的虚拟目录的根目录下面)
然后调试当前虚拟目录下的任何文件,你会发现所有页面都跳转向htp://www.cnbruce.com/
通过此“强制进入某页”的例子,可以想象当首页需要被关注的时候是非常有必要的。
下面就以一个“在线人数”的例子来继续观察Session_OnStart和Session_OnEnd事件。
二、Session_onEnd
2,Global.asa(放在被调试的虚拟目录的根目录下面)
3,online.asp
<%
if request.querystring("logout")="true" then
session.Abandon()
response.end
end if
%>
当前共有<%=Application("OnLine")%>在线
退出
你发现在该页中只有一个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
%>
当前共有<%=Application("OnLine")%>在线
退出
注意,online.asp进行onunload的时候会打开exit.asp,那只要在exit.asp中再设置_
session.Abandon()不就OK了。
4,exit.asp
<%session.Abandon()%>
当然,加了段Script脚本,目的是进行Session的注销以后立即进行关闭本身。
那现在基本一个在线统计的Web应用就可以了。
四、深入研究Global.asa
从上面的调试中,举一反三的你,一定会提出一个问题:如何控制注册用户在线人数?
那下面几个文件一个一个看:
5,Global.asa(放在被调试的虚拟目录的根目录下面)
因为一旦有用户访问服务器而不管用户是否登录,都会产生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.Back"
response.end
end if
application.lock
application("online")=application("online")+1
application.unlock
%>
当前注册会员<%=application("online")%>人。
退出
<%else%>
<%Response.End
Else
Response.clear
dim talk
If Request.Form("nick")<>"" then
Session("nick")=Request.Form("nick")
End if
%>
离开
<%
If Request.Form("log")<>1 then
If trim(Request.Form("talk"))="" then
talk=Session("nick")&"不说一句话就想来敷衍大家"
Else
talk=trim(Request.Form("talk"))
End If
Application.lock
Application("show")="来自"&Request.ServerVariables("remote_addr")& "的_
" &Session("nick")&"在"&time& "的时候说:" &talk& "
" &Application("show")
Application.UnLock
Response.Write Application("show")
End if
%>
简单解释:
1,<%If Request.ServerVariables("Request_Method")="GET" then%>的作用就是判断当前页面接受的方式,如果为GET方式则会显示“要求输入昵称”的表单页。因为页面的默然接受方式为GET,当在URL地址栏直接敲入时,也就是没有任何信息的时候,就应该显示要求“输入昵称”。
2,和下面的If Request.Form("log")<>1 then是有关联的:显然第一次输入昵称进入,同样将log隐藏域发送。但作为第一次的进入是无任何语句发言的,所以判断接受的log值不为1,亦即非首次登录(表示已经登录)时,执行内部相关聊天显示程序。
3,trim(Request.Form("talk"))="",trim就是个函数了:删去字符串前,后的空格。初此,还有rtrim():去掉字符串后的空格;ltrim():去掉字符串前的空格。
Application.lock
Application("show")="来自"&Request.ServerVariables("remote_addr")& "的_
" &Session("nick")&"在"&time& "的时候说:" &talk& "
" &Application("show")
Application.UnLock
提取精华得:
Application.lock
Application("show")=talk& "
" &Application("show")
Application.UnLock
可以看到是Application变量的叠加功能,每次Application("show")的值都建立在原有Application变量值的基础之上,再附加上最新的聊天内容:talk变量的值。这样就保证所有用户都能看到的共享信息了。
ASP技巧累加(1)
一、On Error 语句
该语句的作用是:启用或禁用错误处理程序。一般用法如下:
On Error Resume Next
On Error GoTo 0
如果在您的代码中未使用On Error Resume Next语句,所发生的运行时错误将显示错误信息,同时,代码的执行也随之终止。
但当你采用它时,就会使程序按照产生错误的语句之后的语句继续执行,或是按照最近一次所调用的过程(该过程含有 On Error Resume Next 语句)中的语句继续运行。这个语句可以不顾运行时错误,继续执行程序,之后您可以在过程内部建立错误处理例程。
在调用另一个过程时,On Error Resume Next 语句变为非活动的。所以,如果希望在例程中进行内部错误处理,则应在每一个调用的例程中执行 On Error Resume Next 语句。
如果您已启用 On Error Resume Next 错误处理程序,则可使用On Error GoTo 0禁用错误处理程序。
附注:要在代码中生成运行时错误,请用Err对象的Raise方法。
这样的情况经常在调试程序的时候看见,比如分别调试下面两程序则会显示。
1,err1.asp
<%Err.Raise 6%>
技术信息(用于支持人员)错误类型:
Microsoft VBScript 运行时错误 (0x800A0006)
溢出
2,err2.asp
<%cnbruce.com%>
调试的时候也就是:
技术信息(用于支持人员)错误类型:
Microsoft VBScript 运行时错误 (0x800A01A8)
缺少对象: 'cnbruce'
但当你在首行添加了On Error Resume Next之后,发现不报错提示,表明内部错误处理完成。
但进行下列程序的时候发现
3,err3.asp
<%
On Error Resume Next
cnbruce.com
On Error GoTo 0
cnbruce.com
%>
这时运用了On Error GoTo 0,则会显示出错信息,只不过不是第三行,而是第五行的cnbruce.com错误对象了。
通过上面几个例子,相信你对此语句应该有所领悟了。接着再看。
二、Option Explicit 语句
该语句的作用是:强制要求显式声明脚本中的所有变量。
所谓的显式声明,就是要使用 Dim、Private、Public 或 ReDim 语句声明所有变量。如果在程序中试图使用未经声明的变量名,则会出现错误。用该语句可以避免拼错已存在的变量名称。对于作用范围不清楚的变量,使用此语句也可避免发生混淆。
当然,如果要使用 Option Explicit,该语句必须出现在脚本的任何其他语句之前。
4,err4.asp
<%
Option Explicit ' 强制显示声明变量。
Dim MyVar '声明变量。
MyVar = 10 '声明变量不产生错误。
MyInt = 10 '未声明变量产生错误。
response.write(MyInt)
%>
报错信息如下:
技术信息(用于支持人员)错误类型:
Microsoft VBScript 运行时错误 (0x800A01F4)
变量未定义: 'MyInt'
再加一句:ASP中对VBScript提供了强劲的支持,能够无缝集成VBScript的函数、方法,这样给扩展ASP的现有功能提供了很大便利。由于ASP中已经模糊了变量类型的概念,所以,在进行ASP与VBScript交互的过程中,很多程序员也惯于不声明VBScript的变量(我也是-_-!,以后注意),这样加重了服务器的解析负担,进而影响服务器的响应请求速度。
鉴于此,我们可以象在VB中强制用户进行变量声明一样在VBScript中强制用户进行变量声明。实现方法就是:在ASP程序行首放置<% option explicit%>。实践也证明,ASP文件中使用“Option Explicit”可以使得程序出错机会降到最少,并且会大大提升整体性能。
另外,声明的变量有个顺序的技巧,要么以编译时间,要么以运行时间。声明的变量都按此顺序引用。
三、<%@LANGUAGE="xxx" CODEPAGE="936"%>
一般又分为<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>和<%@LANGUAGE="javascript" CODEPAGE="936"%>两种。
LANGUAGE="VBSCRIPT"和LANGUAGE="javascript",申明ASP当前使用的编程脚本分别为VBSCRIPT和javascript。一般在程序第一行进行申明。当使用该脚本申明后,以下所有程序运用全得符合该脚本语言的所有语法,两者不能混淆使用,否则出错。我们在写ASP时,一般不做限定,因为经常会在一ASP页面写不同的脚本,当然这也是以牺牲执行效率为代价的。
CodePage:可读/可写。整型。定义用于在浏览器中显示页内容的代码页。代码页是字符集的数字值,不同的语言使用不同的代码页。例如,ANSI代码页为1252,日文代码页为932,简体中文代码页为936。一般情况下,当你上传到国外网页空间,或者提取数据库记录等出现乱码时,就采用这种方法解决。
Ad & Content Rot
ASP的强大不仅仅局限于接受和显示的交互,更多的是运用ActiveX 组件进行更强大的Web应用。
那究竟ActiveX组件为何物?它又是如何运作的呢?其实ActiveX Server Components(ActiveX 服务器组件)是一个存在于 WEB 服务器上的文件,该文件包含执行某项或一组任务的代码,组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码。很形象的一句话:运用组件直接采用别人经典的功能强大的程序。只不过这程序已被封装了的。
那具体ActiveX组件是如何产生、如何得来的呢?一般由下面三个路径获得:
1,安装完IIS服务器以后,自带的一些内置组件,如Database Access数据库连接组件。
2,从第三方开发者处获得可选的组件,或者免费或者收费的,如一些上传组件(当然现在有无组件上传)。
3,如果你是一位Web程序开发者,可以使用Visual Basic 、Java 、Visual C++ 、COBOL等程序设计语言来编写你所需要的ActiveX Server Component。这也就是所谓的ASP进行COM(Component Object Model)、COM+开发了。
当然无论是第三方还是自行开发,在使用之前都必须要进行系统的注册。不过这些都是后话。我们现在需要的,是尽快先把ASP自带的一些组件搞懂吧。
不过在使用内置组件之前,先用一个程序检测一下自己机器中的组件支持情况。
引用一段网上流行的“阿江ASP探针”,将下列代码保存为asp文件进行调试查看。
1,objcheck.asp
<%Option Explicit %>
<%
Dim filename
filename=Request.ServerVariables("SCRIPT_NAME")Dim ObjTotest(14,4)
ObjTotest(0,0) = "MSWC.AdRotator"
ObjTotest(0,1) = "广告轮显组件"
ObjTotest(1,0) = "MSWC.ContentRotator"
ObjTotest(1,1) = "内容轮显组件"
ObjTotest(2,0) = "MSWC.BrowserType"
ObjTotest(2,1) = "浏览器类型显示组件"
ObjTotest(3,0) = "MSWC.NextLink"
ObjTotest(4,0) = "MSWC.Tools"
ObjTotest(5,0) = "MSWC.Status"
ObjTotest(6,0) = "MSWC.Counters"
ObjTotest(7,0) = "MSWC.IISLog"
ObjTotest(8,0) = "MSWC.PermissionChecker"
ObjTotest(9,0) = "Microsoft.XMLDom"
ObjTotest(10,0) = "IISSample.ContentRotator"
ObjTotest(11,0) = "IISSample.PageCounter"
ObjTotest(12,0) = "Scripting.FileSystemObject"
ObjTotest(13,0) = "adodb.connection"
public IsObj,VerObj,TestObj
dim i
for i=0 to 13
on error resume next
IsObj=false
VerObj=""
TestObj=""
set TestObj=server.CreateObject(ObjTotest(i,0))
If IsObject(TestObj) then
IsObj = True
VerObj = TestObj.version
if VerObj="" or isnull(VerObj) then VerObj=TestObj.about
end if
ObjTotest(i,2)=IsObj
ObjTotest(i,3)=VerObj
next
sub ObjTest(strObj)
on error resume next
IsObj=false
VerObj=""
TestObj=""
set TestObj=server.CreateObject (strObj)
If IsObject(TestObj) then
IsObj = True
VerObj = TestObj.version
if VerObj="" or isnull(VerObj) then VerObj=TestObj.about
end if
End sub
%>
Object Check
组 件 名 称 | 相 关 信 息 |
<%For i=0 to 13%>
<%=ObjTotest(i,0) & " #888888>" & ObjTotest(i,1)%> |
<% If Not ObjTotest(i,2) Then Response.Write "不支持" Else Response.Write "支持," & left(ObjTotest(i,3),22) End If%> |
<%next%>
<%
Dim strClass
strClass = Trim(Request.Form("classname"))
If strClass <> "" then
Response.Write "
您指定的组件的检查结果:"
Dim Verobj1
ObjTest(strClass)
If Not IsObj then
Response.Write "
很遗憾,该服务_
器不支持 " & strclass & " 组件!"
Else
if VerObj="" or isnull(VerObj) then
Verobj1="无法取得该组件版本"
Else
Verobj1="该组件版本是:" & VerObj
End If
Response.Write "
恭喜!该服务_
器支持 " & strclass & " 组件。" & verobj1 & ""
End If
End if
%>
如果你可以运行该ASP文件,也就是说你拥有IIS的WEB服务了。既然有IIS,不出意外,我们今天要学的组件AdRotator相信应该也是支持的。
P.S.一般微软自带的大多是MSWC开头,我也一般戏称为Microsoft WC.
一、AdRotator组件
该组件通常又称广告轮显组件,其功能相当于在网站上建立了一个,符合广告领域标准功能的广告系统。它具有:每次访问ASP页面时,在页面上显示不同的广告内容;跟踪特定广告显示次数的能力以及跟踪客户端在广告上单击次数的能力。
AD Rotator 组件的工作原理是通过读取 AD Rotator 计划文件来完成的,该文件包括与要显示图象文件的地点有关的信息,以及每个图象的不同属性。下面就是一个标准的 AD Rotator 计划文件。
1,类型为txt文本 ,命名为myadrot.txt
redirect gourl.asp
width 88
height 31
border 1
*
UploadFiles/2004515193356734.gif
http://www.cnbruce.com/
CN-Bruce
10UploadFiles/2004515193358621.gif
http://www.it365cn.com
It365cn
10
UploadFiles/2004515193358371.gif
http://www.blueidea.com
Blue!dea
10
代码的前四行包含了广告的全局设置:
1,Redirect 指出广告将成为其热连接的URL。但其并非直接跳转的URL,它包含了两个参数的查询字符串:特定广告主页的URL和图象文件的URL。这些值从而可在gourl.asp文件中进行提取,并且与此同时gourl.asp还可以进行其他的处理工作,比如跟踪单击广告的次数、跳转到接受的的广告主页等。
2,width、height、border不用说一看就知道是连接图片的宽、高以及边框线大小。
“*”号表示了分隔符,以及“*”号下面的每四行为一个单位进行描述每个广告的细节。其中分别代表:
1,每个广告的描述包含图象文件的URL。
2,广告对象的主页URL(如果广告客户没有主页,则该行为一个连字符“-”,指出该广告没有链接)。
3,图象的替代文字。
4,及指定该页与其他页交替显示频率的数值。
该文件是用户自创建的文件。它通常用来解析由AdRotator对象发送的查询字符串的脚本,并将用户重定向到与用户所点击的广告所相关的URL。那具体怎么应用该定向文件呢?
2、adrotator.asp
该文件最主要的是连接myadrot.txt文件,并且执行myadrot.txt文件中的信息内容。很简单,两行代码。
<%set myad=Server.CreateObject("MSWC.adrotator")%>
<%=myad.getadvertisement("myadrot.txt")%>
“<%set myad=Server.CreateObject("MSWC.adrotator"%>”学过Server对象,相信还记得该对象强大的一个方法,那就是CreateObject。他可用于创建已经注册到服务器上的ActiveX组件实例。那这就表示引用组件MSWC.adrotator了。
“<%=myad.getadvertisement("myadrot.txt"%>”Ad Rotator组件支持的唯一方法也就是GetAdvertisement了,它只有一个参数:AdRotator计划文件的名称。注意指向文件的路径是当前虚拟目录的相对路径,物理路径是不允许的。也就是说当前的adrotator.asp和myadrot.txt是在同一目录下了。
然后进行执行该ASP文件,多次刷新,会发现每次的广告确实是在轮显着的。这时再注意点击图片的超级连接地址。比如:
gourl.asp?url=http://www.cnbruce.com/&image=UploadFiles/2004515193356734.gif
很明显我们还需要建立gourl.asp,并且将url参数的值进行提取,再接着跳转到该url地址上。
3、gourl.asp
该页主要功能:提取url参数值,跳转到广告主页。
<%whaturl=request.querystring("url")%>
<%response.redirect whaturl%>
功能很简单就完成。当然,刚才也说了,这个页还可以做其它一些事件:跟踪客户端在广告上单击次数,比如将接受过来的相同的url地址进行记数的累加,就能显示出该网站广告的点击次数,然后和相应广告商拿取相应的费用什么的……呵呵,在早期都要求需要实际点击率的,现在好象不管,只要广告挂那儿就行-_-!
不过,总的说来,这个组件的功能就是这样。你有多个广告商,并且是按比例单独显示,还需要计算实际点击率的时候,用Ad Rotator组件是最好不过。那也就是说视情况而定了。
最后再说下,该组件的实现需要三个文件:重定向文件、引用文件、处理转向文件。
二、Content Rotator组件
正如Ad Rotator为一广告轮显,Content Rotator组件则为内容轮显。
该组件就像一个简化了的Ad Rotator组件,所以其工作原理亦为:通过读取计划文件来完成的网页内容的显示。该计划文件也就是:内容调度文件(Content Schedule File)。
1,类型为txt文本 ,命名为context.txt
%% 3 //后面是注释
ASP编程入门进阶%% 4 //下面显示表格
%% 5
CN-Bruce
该文件的结构比Ad Rotator的调度文件简单,仅需提供要使用的各个文本字符串的列表,由前面加两个百分号(%%)的语句行说明。
为了设置每个条目的比率(决定它出现在返回页面中的频率),在双百分号的后面添加了一个数字。如果其后跟双斜杠(//)就表示为添加的注释。
接着就是通过ASP页面将这些信息按规定完整显示。
2、showcontext.asp
<%
Set MyContent = Server.CreateObject("MSWC.ContentRotator")
Content = MyContent.ChooseContent("context.txt")
Response.Write Content
%>
"Set MyContent = Server.CreateObject("MSWC.ContentRotator"",先建立和Content Rotator组件的联系。
"Content = MyContent.ChooseContent("context.txt"",表示采用Content Rotator组件的有个方法:ChooseContent,并且赋值给变量Content,到最后输出显示结果。
3、showall.asp
以上页面内容个显示是通过Content Rotator组件的ChooseContent方法实现的。此外,该组件还有一方法:GetAllContent。示例如下:
<%
Set MyContent = Server.CreateObject("MSWC.ContentRotator")
Content = MyContent.GetAllContent("context.txt")
Response.Write Content
%>
运行结果会发现context.txt所有内容被解释执行,并且分类之间会自动添加了
水平线。
当然这个方法可以用在随机图片之类的特效页面上。
本文作者:佚名 来源:5D多媒体
CIO之家 www.ciozj.com 微信公众号:imciow