ASP Global.asa 文件
Global.asa 文件
Global.asa 文件是一个可选文件,其中可以包含 ASP 应用程序中所有页面都可以访问的对象、变量和方法的声明。
可以在 Global.asa 中使用所有有效的浏览器脚本(JavaScript、VBScript、JScript、PerlScript 等)。
Global.asa 文件只能包含以下内容:
- Application 事件
- Session 事件
- <object> 声明
- TypeLibrary 声明
- #include 指令
注意: Global.asa 文件必须存储在 ASP 应用程序的根目录中,并且每个应用程序只能有一个 Global.asa 文件。
Global.asa 中的事件
在 Global.asa 中,您可以告知应用程序和会话对象在应用程序/会话开始时做什么,以及在应用程序/会话结束时做什么。代码放置在事件处理程序中。Global.asa 文件可以包含四种类型的事件:
Application_OnStart - 当第一个用户访问 ASP 应用程序的第一个页面时发生。在 Web 服务器重启后或 Global.asa 文件编辑后发生此事件。“Session_OnStart”事件紧随此事件之后发生。Session_OnStart - 每次新用户请求 ASP 应用程序中的第一个页面时都会发生此事件。
Session_OnEnd - 每次用户结束会话时都会发生此事件。在用户未在指定时间(默认为 20 分钟)内请求页面后,用户会话即结束。
Application_OnEnd - 在最后一个用户结束会话后发生此事件。通常,在 Web 服务器停止时会发生此事件。此过程用于在应用程序停止后清理设置,例如删除记录或将信息写入文本文件。
Global.asa 文件可能看起来像这样:
<script language="vbscript" runat="server">
sub Application_OnStart
'some code
end sub
sub Application_OnEnd
'some code
end sub
sub Session_OnStart
'some code
end sub
sub Session_OnEnd
'some code
end sub
</script>
注意: 由于我们无法使用 ASP 脚本分隔符(<% 和 %>)在 Global.asa 文件中插入脚本,因此我们将子例程放在 HTML <script> 元素内。
<object> 声明
可以通过使用 <object> 标签在 Global.asa 中创建具有会话或应用程序范围的对象。
注意: <object> 标签应放在 <script> 标签之外!
语法
<object runat="server" scope="scope" id="id" {progid="progID"|classid="classID"}>
....
</object>
参数 | 描述 |
---|---|
scope | 设置对象的范围(Session 或 Application) |
id | 为对象指定一个唯一的 ID |
ProgID | 与类 ID 关联的 ID。ProgID 的格式为 [Vendor.]Component[.Version] 必须指定 ProgID 或 ClassID 中的一个。 |
ClassID | 为 COM 类对象指定一个唯一的 ID。 必须指定 ProgID 或 ClassID 中的一个。 |
示例
第一个示例使用 ProgID 参数创建了一个会话范围的对象“MyAd”。
<object runat="server" scope="session" id="MyAd" progid="MSWC.AdRotator">
</object>
第二个示例使用 ClassID 参数创建了一个应用程序范围的对象“MyConnection”。
<object runat="server" scope="application" id="MyConnection"
classid="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21">
</object>
在 Global.asa 文件中声明的对象可被应用程序中的任何脚本使用。
GLOBAL.ASA
<object runat="server" scope="session" id="MyAd" progid="MSWC.AdRotator">
</object>
您可以从 ASP 应用程序中的任何页面引用对象“MyAd”。
SOME .ASP FILE
<%=MyAd.GetAdvertisement("/banners/adrot.txt")%>
TypeLibrary 声明
TypeLibrary 是一个 DLL 文件内容的容器,该文件对应一个 COM 对象。通过在 Global.asa 文件中包含对 TypeLibrary 的调用,可以访问 COM 对象中的常量,并且 ASP 代码可以更好地报告错误。如果您的 Web 应用程序依赖于已在类型库中声明了数据类型的 COM 对象,则可以在 Global.asa 中声明类型库。
语法
<!--METADATA TYPE="TypeLib"
file="filename" uuid="id" version="number" lcid="localeid"
-->
参数 | 描述 |
---|---|
file | 指定类型库的绝对路径。 file 参数或 uuid 参数是必需的。 |
uuid | 指定类型库的唯一标识符。 file 参数或 uuid 参数是必需的。 |
version | 可选。用于选择版本。如果找不到请求的版本,则使用最新版本。 |
lcid | 可选。要用于类型库的区域设置标识符。 |
错误值
服务器可以返回以下错误消息之一:
错误代码 | 描述 |
---|---|
ASP 0222 | 无效的类型库规范 |
ASP 0223 | 找不到类型库 |
ASP 0224 | 无法加载类型库 |
ASP 0225 | 无法包装类型库 |
注意: METADATA 标签可以出现在 Global.asa 文件的任何位置(在 <script> 标签内外)。但是,建议将 METADATA 标签放在 Global.asa 文件的顶部附近。
限制
有关可以在 Global.asa 文件中包含的内容的限制
- 您不能显示在 Global.asa 文件中编写的文本。此文件无法显示信息。
- 您只能在 Application_OnStart 和 Application_OnEnd 子例程中使用 Server 和 Application 对象。在 Session_OnEnd 子例程中,您可以使用 Server、Application 和 Session 对象。在 Session_OnStart 子例程中,您可以使用任何内置对象。
如何使用子例程
Global.asa 通常用于初始化变量。
下面的示例显示了如何检测访问者首次访问网站的确切时间。时间存储在名为“started”的 Session 变量中,并且可以在应用程序中的任何 ASP 页面访问“started”变量的值。
<script language="vbscript" runat="server">
sub Session_OnStart
Session("started")=now()
end sub
</script>
Global.asa 还可用于控制页面访问。
下面的示例显示了如何将每个新访问者重定向到另一个页面,在本例中重定向到名为“newpage.asp”的页面。
<script language="vbscript" runat="server">
sub Session_OnStart
Response.Redirect("newpage.asp")
end sub
</script>
您还可以在 Global.asa 文件中包含函数。
在下面的示例中,当 Web 服务器启动时,Application_OnStart 子例程会发生。然后 Application_OnStart 子例程调用另一个名为“getcustomers”的子例程。“getcustomers”子例程打开数据库并从“customers”表中检索记录集。记录集被分配给一个数组,该数组可以在任何 ASP 页面中访问,而无需查询数据库。
<script language="vbscript" runat="server">
sub Application_OnStart
getcustomers
end sub
sub getcustomers
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open "c:/webdata/northwind.mdb"
set rs=conn.execute("select name from customers")
Application("customers")=rs.GetRows
rs.Close
conn.Close
end sub
</script>
Global.asa 示例
在此示例中,我们将创建一个 Global.asa 文件来计算当前访问者的数量。
- Application_OnStart 在服务器启动时将 Application 变量“visitors”设置为 0。
- 每次新访问者到达时,Session_OnStart 子例程会将“visitors”变量加一。
- 每次触发 Session_OnEnd 子例程时,它会从“visitors”中减一。
Global.asa 文件
<script language="vbscript" runat="server">
Sub Application_OnStart
Application("visitors")=0
End Sub
Sub Session_OnStart
Application.Lock
Application("visitors")=Application("visitors")+1
Application.UnLock
End Sub
Sub Session_OnEnd
Application.Lock
Application("visitors")=Application("visitors")-1
Application.UnLock
End Sub
</script>
要在 ASP 文件中显示当前访问者的数量:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>现在有 <%response.write(Application("visitors"))%> 位在线!</p>
</body>
</html>