9.1 课前导读
9.2 课堂教学
9.3 上机练习
9.4 课后作业第 9课 Application对象与
Session对象
9.1 课前导读
Application对象与 Session对象的关系类似于高级语言中全局变量与局部变量的关系 。
Application对象是服务器硬盘上的一组应用程序,也就是虚拟目录及其子目录下的一组主页及 ASP
文件 。 Application对象的所有数据可以在整个应用程序内部共享,并且对所有用户都是可见的;在一个
Application 中创建的变量或对象可以为整个
Application所用; Application对象包括任何类型,
甚至可以是队列 。
Session对象存储特定用户的信息 。 不同用户的
Session不同,用户之间不能共享 Session,这与
Application不同 。
当用户浏览 Web站点时,使用 Session可以为每一个用户保存指定信息 。 任何存储在用户 Session中的信息可以在用户调用下一个页面时取得 。 这就像是 C语言里的局部变量和函数之间的关系一样,一个 Session的值对于一个用户是相同的,对于不同的用户是不同的 。
使用 Session可以在 ASP文件之间传递数值,字符串,
数组和对象 。 当用户在应用程序的页间跳转时,存储在 Session对象中的变量不会清除 。
Session对象在很多方面与 Application对象有着相似性及可比性 。 虽然很相似,但是在本质上有着很大的差别 。 比如对于同一个页面,不同的访问者可以创建不同的 Session,但是 Application的值是相同的,
只被创建一次 。
Application对象主要被用于:
① 统计网站访问的人数;
② 统计广告点击的次数;
③ 创建聊天室;
④ 读取数据库中的数据等 。
而 Session对象则常被用在:
① 存储用户的首选项;
② 保存用户的身份标记,实现用户的身份认证和用户权限管理等 。
9.2 课堂教学
9.2.1 Application对象及其使用
9.2.2 Session对象及其使用
9.2.3 Global文件
9.2.1 Application对象及其使用
1,Application对象的集合
2,Application对象的方法
3,Application对象的事件
1,Application对象的集合
ASP的 Application对象有两个集合,Contents集合和 StaticObject集合 。 Contents集合是由所有通过脚本语言添加到应用程序的变量和对象组成的集合,
可以使用这个集合来获取给定的应用程序作用域的变量列表或指定某个变量为操作对象 。 StaticObjects
集合包含所有的在 Application对象的指定范围内,
在 Global.asa文件中由 <Object>标记创建的对象 。 可以通过该集合来确定某个对象的指定属性或遍历所有对象的所有属性 。
(1) Contents集合
Contents集合是 Application对象所记录的所有非对象变量,这是 Application对象默认的集合,因此下述两种格式是等价的:
Application.Contents("变量名 ")
Application("变量名 ")
其中,,变量名,是需要操作的 Application变量名称 。
【 例 9-1】 使用 Application对象编写计数器程序 。
程序 9_1.asp的代码如下:
<HTML>
<HEAD><TITLE>使用 Application变量 </TITLE></HEAD>
<BODY>
<P><FONT size=4 face=方正舒体 color= blue>
使用 Application变量 <P>
<%
Application.Contents("counter")=
Application.Contents("counter")+1
%>
<FONT size=6>
您是第 <%=Application.Contents("counter")%>位来客
</FONT>
</BODY>
</HTML>
可以在一般变量与 Application变量之间互相赋值 。
上述代码可以改写为:
<HTML>
<HEAD><TITLE>使用 Application变量 </TITLE></HEAD>
<BODY>
<P><FONT size=4 face=方正舒体 color= blue>
使用 Application变量 <P>
<%
counter=Application("counter")+1
Application("counter")=counter
%>
<FONT size=6>您是第 <%=counter%>位来客 </FONT>
</BODY>
</HTML>
说明:
① 多次打开浏览器,运行程序 9_1.asp,可以看到 Application变量值的改变 。
② Application对象的生命周期是服务器运行期间,因此当虚拟服务器 ( 你的 PC) 关机后,
Application变量将丢失 。 要想保留变量的值,需要用到文件系统 ( 第 10课介绍 ) 的概念 。
在 Contents 集 合 中,有 三 种 方 式 读 取
Application变量的值 。
① 以 Application.Contents("变量名 ")的形式;
② 以 Application("变量名 ")的形式;
③ 以所定义的 Application变量序号读取,即
Application.Contents(i)的形式读取,其中,i” 为变量的序号 。
【 例 9-2】 使用 Application 变量序号读取
Application变量的值,运行结果 。
程序 9_2.asp的代码如下:
<html>
<head></head>
<body>
<h3>Application实例 </h3><hr>
<%
name=Request.Form("visitor")
i=Request.Form("chatno")
if name<>"" then
if i=0 then
Application("chinese")=Application("chinese")+1
chat="中文 "
elseif i=1 then
Application("english")=Application("english")+1
chat="英文 "
end if
Response.write "欢迎 <b>" & name & "</b>,你是来到 "
Response.write "<b>" & chat & "</b>讨论区的第 "
Response.write Application.Contents(i+1) & "位客人 <p>"
Response.write "<a href=9_2.asp>返回 </a>"
Response.end
end if
%>
<form METHOD=POST>
<table><tr><td>名字:
<td><input type=text name="visitor" size=12>
<tr><td>讨论区,<td><Select name=Chatno>
<option value=0>中文 </option>
<option value=1>英文 </option>
</select>
<input TYPE=SUBMIT value="确定 ">
</table>
</form>
</body>
</html>
说明:
① 对于 Contents集合中的 Application变量,若要遍历所有的值,还可以采用循环结构进行读取 。 可以采用 For Each In的形式,也可以采用 For To Next
的形式,但 是 这 样 可 能 将 服 务 器 中 的 所 有
Application变量读出,因此一般不提倡使用 。
② 如果 Application对象保存有数组等项目,若采用循环结构来遍历,则会出现错误,故要慎用 。
③ Application对象中不能保存 ASP的内置对象 。
下述代码将引发,内部服务器错误,,
Set Application.Contents("对象 ")="Request"
(2) StaticObjects集合
Application对象的 SaticObjects集合是通过
<Object>标记 在 Global.asa文 件中 创建的 。 在
StaticObjects集合中保存着所有在 Application对象范围内的由 <Object>标记创建的变量和对象,通过该集合,可以检索和读取这些变量和对象 。 在
Global.asa文件中,使用如下的代码可以建立一个
Application级的对象:
<OBJECT runat=Server Scope=Application
ID=Priconn ProgID="Adodb.Connection">
说明,Contents 集 合 中 可 以 使 用 的 对
Application变量的操作方法,在这里都可以使用 。
(3) 存储数组在 Application对象中可以存储数组,但是不能直接更改存储在数组中的元素,这 是 因 为
Application对象是作为集合实现的 。 如果将数组存放在 Application对象中,则对该数组进行操作时,
应先建立数组的一个副本,对该副本操作完毕,再将其存放到 Application对象中 。
【 例 9-3】 使用 Application对象存储数组,运行结果 。
程序 9_3.asp的代码如下:
<HTML>
<HEAD><TITLE>创建并使用 Application数组变量 </TITLE></HEAD>
<BODY>
<P align="center">创建并使用 Application数组变量 <hr>
<% Dim book()
redim book(3)
' 创建数组 book
book(0)="高等数学习题及解答 "
book(1)="高等数学复习指导 "
book(2)="政治经济学习题及解答 "
book(3)="电路习题及解答 "
Application("复习指导书 ")=book
' 将 book存放到 Application变 量:复习指导书
%>
<table><tr><td colspan=2>复习指导书
<% bk=Application("复习指导书 ") %>
' 创建“复习指导书”的副本
<tr><td>1.<td><%=(bk(0))%>
<tr><td>2.<td><%=(bk(1))%>
<tr><td>3.<td><%=(bk(2))%>
<tr><td>4.<td><%=(bk(3))%>
</table>
</BODY>
</HTML>
2,Application对象的方法
Application对象共有两个方法,它们分别是
Lock方法和 Unlock方法 。
在一个 ASP应用程序中,如果同时访问的用户很多,就 可 能 会 出 现 很 多 用 户 同 时 修 改 某 个
Application变量,这时如果没有一个良好的机制来确保同一时刻仅有一个用户修改和存取 Application
变量,后果将是无法想像的 。
Lock和 Unlock方法正是为此而设计的,在使用
Lock 以后,可 以 防 止 其 他 用 户 修 改 存 储 在
Application对象中的变量,直到用户使用 Unlock方法或超时,才解开 Application对象,这样就确保在同一时刻只有一个用户可以修改和存储 Application
对象中的变量 。 Lock方法和 Unlock方法的语法格式分别如下:
Application.Lock
Application.Unlock
【 例 9-4】 在例 9-2中使用 Lock方法和 Unlock方法确保同一时刻只有一个用户可以修改和存储
Application对象中的变量,运行结果 。
程序 9_2.asp改为如下的代码:
<html>
<head></head>
<body>
<h3>Application实例 </h3><hr>
<%
name=Request.Form("visitor")
i=Request.Form("chatno")
if name<>"" then
Application.Lock
if i=0 then
Application("chinese")=Application("chinese")+1
chat="中文 "
elseif i=1 then
Application("english")=Application("english")+1
chat="英文 "
end if
Response.write "欢迎 <b>" & name & "</b>,你是来到 "
Response.write "<b>" & chat & "</b>讨论区的第 "
Response.write Application.Contents(i+1) & "位客人 <p>"
Response.write "<a href=9_2.asp>返回 </a>"
Application.Unlock
Response.end
end if
%>
<form METHOD=POST>
<table><tr><td>名字,<td>
<input type=text name="visitor" size=12>
<tr><td>讨论区,<td><Select name=Chatno>
<option value=0>中文 </option>
<option value=1>英文 </option>
</select>
<input TYPE=SUBMIT value="确定 ">
</table>
</form>
</body>
</html>
3,Application对象的事件
Application对象有两个事件,OnStart事件和
OnEnd 事件 。 Application_OnStart 事件是在
Application对象开始时被触发,并且只在第一个用户的第一次请求时触发一次 。 它主要用于初始化变量,
创建对象和运行其它代码 。 Application_OnEnd事件是在整个 Application对象结束时才被触发的 。 当它被触发时应用程序的所有变量也相应被取消 。
Application 对 象 的 Application_OnStart 和
Application_OnEnd事件过程只能在 Global.asa文件中创建 。
9.2.2 Session对象及其使用
1,Session对象的集合
2,Session对象的属性
3,Session对象的方法
4,Session对象的事件
5,Session对象与 Cookie的关系
9.2.2 Session对象及其使用
Session对象是 ASP技术中非常重要的对象,是实现用户会话管理的重要手段,是编写有关应用 Web程序的常用工具 。 Session其实指的就是用户从到达某个站点直到离开为止的那段时间内,服务器端分配给用户的一个存储信息的全局变量的集合,这些变量可以是自动生成的,也可以是编程者在服务器端脚本程序中定义的 。
当用户在应用程序的 Web页面之间跳转时,存储在 Session对象中的变量将不会丢失,而且在整个用户会话中会一直存在下去 。
当用户请求 ASP应用程序的某个页面时,若用户尚未建立 Session对象,服务器端就会自动创建一个
Session对象,并指定一个唯一的 Session ID,这个
ID只允许此 Session ID的拥有者使用,不同的用户的
Session存储着各自特定的信息,如用户姓名,性别,
浏览器类型,显示器分辨率,访问时间等,这将有利于服务器对用户身份的鉴别,从而实现 Web页面的个性化 。
Session对象有两种结束方法:一种是隐式方式,
另一种是显式方式 。 隐式方式是当用户访问 Web服务器的时间间隔超过 Session对象的 TimeOut属性设置的时间限制时,Session对象自动结束;显式方式则是利用 Session对象的 Abandon方法来中止 Session。 当
Session结束之后,Session对象的变量也将被释放,
其值不可再用 。
1,Session对象的集合与 Application对象一样,Session对象也有两个集合,Contents集合和 StaticObjects集合 。 其中,
Contents集合保存所有非对象的 Session变量,而
StaticObjects集合则保存所有的 Session对象变量 。
(1) Contents集合
Contents集合是使用 Session对象定义的在 ASP应用程序中的一组变量 。 这些变量的作用域为用户层,
并且在整个 ASP应用程序都是可用的 。 这是 Session对象默认的集合,因此下述两种格式是等价的:
Session.Contents("变量名 ")
Session ("变量名 ")
其中,,变量名,是需要操作的 Session变量名称 。
【 例 9-5】 使用 Session对象编写例 9-1中的 计数器 程序 。 程序 9_5.asp的代码如下:
<HTML>
<HEAD><TITLE>使用 Session变量 </TITLE></HEAD>
<BODY>
<P>使用 Session变量 <P>
<%
Session.Contents("counter")=Session.Contents("counter")+1
%>
<FONT size=6 face=方正舒体 color= blue>
您是第 <%=Session.Contents("counter")%>次来访 !
</FONT>
</BODY>
</HTML>
打开浏览器,执行程序 9_5.asp,显示,您是第 1
次来访 !,,单击,刷新,按钮,可以看到来访次数增加 。 重新打开一个浏览器,再次执行程序 9_5.asp,
仍然显示,您是第 1次来访 !,。 这是因为每个浏览器都有自己的 Session对象 。
Session对象的 Contents集合除了可以创建,调用变量,还可以创建对象,但是由于对象所占用的资源很多,所以在使用 Session对象的 Contents集合创建对象要慎重,但是你一旦建立一个 Session对象,则可以在整个 ASP应用程序中都可以调用 。
Session 对象也可以存放数组,其方法与
Application对象一样,不再赘述 。
与 Application对象一样,在 Contents集合中,
无论是一般的 Session变量,还是 Session对象,或者是数组,都可以采取以下三种方式读取 Session值 。
① 以 Session.Contents("变量名 ")的形式;
② 以 Session("变量名 ")的形式;
③ 以所定义的 Session变量或对象序号读取 。
以上三种方式虽然方法不同,但所得结果是一致的 。
(2) SaticObjects集合
Session 对象的 SaticObjects 集 合 是 通 过
<Object> 标记在 Global.asa 文件中创建的 。 在
StaticObjects集合中保存着所有在 Session对象范围内的由 <Object>标记创建的变量和对象,通过该集合,
可以检索和读取这些变量和对象 。
在 Global.asa文件中,使用如下代码可以建立一个 Session级的对象:
<Object RunAt=Server Scope=Session ID=Priconn
ProgID="Adodb.Connection">
然后即可以使用 Session对象的 SaticObjects集合来引用了 。 当然,Session对象的 Contents集合可以使用的方法,在这里都可以使用 。
(3) 与 Application对象的比较从上述例子来看,Application对象和 Session对象的使用似乎一样,其实它们是由区别的 。 它们的区别就在于 Application对象的变量是多用户共享的,
而 Session对象的变量是针对某一特定用户的 。 随着一次会话的结束,Session对象的变量也就取消了 。
但是 Application对象的变量不会因为某一个甚至全部用户的离开而消失,它一旦被建立,直到网站关闭或者这个 Application被卸载才被取消 。
考虑例 9_1中的计数器,该计数器有一个缺点:
只要浏览者反复单击,刷新,按钮,访客人数就会一直累计 。 这是不合理的,有时网站举办赠奖活动:第
10万位上站者可以获得奖品,那么投机者就会连续单击,刷新,按钮,直到成为获奖者 。 为了避免这种现象,可以结合 Session变量,改写如下 。
【 例 9-6】 结合使用 Session对象改写例 9-1中的计数器程序 。
<HTML>
<HEAD><TITLE>使用 Application与 Session变量 </TITLE></HEAD>
<BODY>
<P>使用 Application与 Session变量 <hr>
<%
if Session("counter")="" then
counter=Application("counter")+1
Application("counter")=counter
Session("counter")=counter
end if
%>
<FONT size=6 face=方正舒体 color= blue>
您是第 <%=Session("counter")%>位来客
</FONT>
</BODY>
</HTML>
程序 9_6.asp的 运行结果 如图 9-4所示 。 现在,只有重新打开浏览器运行该程序,才能使访客人数增加了 。
2,Session对象的属性
Session对象共有四种属 性,它们分别 是:
SessionID属性,TimeOut属性,LCID属性和 CodePage
属性 。 通过对这些属性的设置,可以实现对用户身份的标识,刷新时间的限定,日期,时间,货币显示格式的控制等 。
(1) SessionID属性
SessionlD属性返回 Session的标识 ID。 在每一个
Web站点,Web服务器的 IIS为了能够跟踪访问者,在每一个用户刚登录时,服务器给用户分配的唯一的标识号 ID,该 ID以长整型数据表示 。
SessionlD惟一地标识了一个特定的用户,在新的 Session开始前,Web服务器将 SessionlD存储在客户端的浏览器中,以便下次访问服务器时提交给 Web
处理程序,Web处理程序根据这个 SessionID找到服务器中以前储存的信息并使用它 。
Session对象的 SessionID属性是一个只读的属性,
它一般在是 IIS在内部使用,以识别在 Session中的访问者,也可用于 Web页面的注册统计 。
语法格式:
Session.SessionID
可以使用下面的方法来访问 SessionID的值,
<%=Session.SessionID%>
或是
<%Response.Write(Session.SessionID)%>
(2) TimeOut属性对于一个登录到 ASP应用程序的用户,如果用户在系统默认的时间内未进行其它任何操作时,当设置的时间一到便自动撤销这个用户的 Session,这样就可以防止系统的资源被浪费 。
Session对象的 TimeOut属性可以用来设置,过期时间,,当浏览器在 TimeOut属性设置的时间段里没有提出任何请求,Web服务器就会中断与该使用者间的连线 。 属性的设置格式为:
Session.TimeOut=MaxTime
其中,MaxTime是会话超时的时间,以分钟计 。
(3) LCID属性
Session对象 LCID属性可以用来设置动态的文本内容显示时所使用的格式,如时间,日期,数字,货币等等 。 这个属性主要是针对不同国家的用户在访问时,时间,日期,数字,货币等等显示格式的不同习惯而做相应的设置,一经设定,在整个 ASP应用程序中都依照此设定来显示 。 其语法格式如下:
Session.LCID=LocalID
其中,LocalID是所设定的区域码,它是一个整型数字 。 如
Session.LCID=1033
表示按照美国的习惯显示 。 通过这个属性,可以制作一个国际化的 Web站点 。
(4) CodePage属性
Session对象的 CodePage属性可以用来设置 ASP应用程序所使用的字库,在不同的字库中,所包含的字符是不同的,每一个国家都有不同的字库,即使同一国家也有着不同的字库,它包含有不同的数字,字母和其它字符 。 这个属性主要是针对不同国家的用户在访问时,显示所用字符的不同而做相应的设置,一经设定,在整个 ASP应用程序中都依照此设定来显示 。
其语法格式如下:
Session.CodePage=CodeID
其中,CodeID是所设定的区域码,它是一个整型数字 。 如
Session.CodePage=936
表示使用汉字国标字库显示 。
3,Session对象的方法
Session对象的方法见表 9-1。
表 9-1 Session对象的方法方法名 功能
Abandon 完成目前的网页之后便结束 Session对象。
Contents.Remov
e(item)
从 Contents集合内删除 Item所指定的变量,Item可以是字符串或整数,若 Item为整数,那么这个整数所代表的是索引值。
Contents.Remov
eAll
删除 Contents集合内的所有变量。
我们知道,Session对象默认的生命周期起始于浏览器第一次与服务器联机时,终止于浏览器结束联机时,或浏览器超过 20分钟没有存取网页 。 由于
Session对象存储在服务器的内存,所以一旦联机的浏览器越多,网页的执行效能就越低,为了不影响执行效能,最好在确定不需要用到 Session对象的时候
( 例如浏览者注销网页 ),便以手动的方式结束
Session对象,这需要调用 Session对象的 Abandon方法:
Session.Abandon
说明,Session对象的 Abandon方法只是用来取消
Session变量,并不取消 Session对象本身,Session
变量的清除亦是在本脚本执行完以后才进行的 。
4,Session对象的事件
Session 对象有 Session_OnStart 和
Session_OnEnd两个事件,它们分别用于 Session对象的启动和结束时的运行过程 。 在一个 Session开始时,
Session_OnStart事件被触发;而在一个 Session结束时,Session_OnEnd事件被触发 。
5,Session对象与 Cookie的关系
Session数据存储在服务器上,Cookie数据是存储在浏览器本机里的 。 没有人可以通过查看 Cookie来得到你的 Session里的内容,这是因为,每一个
Session都对应一个由 Web服务器指定的唯一识别符
SessionlD,在浏 览 器中 使用 Cookie来存 储 这 个
SessionID,真正的数据还是存储在 Web服务器上的 。
如果浏览器不支持使用 Cookie,或者浏览器设置为不接受 Cookie,那么将不能使用 Session。
当用户第一次请求 ASP应用程序中的某个页面时,
ASP要检查 HTTP请求头信息,查看是否有名为
ASPSESSIONID的 Cookie发送过来 。 如果有,则服务器会启动新的对话,并为该对话生成一个全局唯一的值,
即 SessionID,再把这个值作为新的 ASPSESSIONID
Cookie值发送给客户端 。 使用这种 Cookie,可以防问存储在服务器上的属于客户程序的有关信息 。
Session对象最常见的作用就是存储用户的首选项 。 例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session对象中 。 另外 Session还经常被用在判别客户身份的程序中 。 要注意的是,对话状态仅在支持 Cookie的浏览器中保留,如果客户关闭了
Cookie选项,Session也就不能发挥作用了 。
在 IE6.0中,点击,工具,菜单中的,Intenet选项,菜单项,打开,Intenet选项,对话框,选择
,隐私,选项卡,单击其中的,高级,按钮,如图 9-
5左所示 。
图 9-5 关闭 cookie
在打开的,高级隐私策略设置,对话框中选中
,覆盖自动 cookie处理,复选框,然后选择,拒绝,
选项,如图 9-5右所示 。 单击,确定,按钮返回浏览器 。 此时,已经关闭了 cookie,不仅第 5课中有关
cookies的例题不能正常运行,再次运行例 9-5,看到
Session变量也不能发挥作用了 。
9.2.3 Global文件
1,Global.asa文件
2,Global.asa文件的结构
3,一个 Global.asa文件的实例
9.2.3 Global文件
Global文件是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象 。 该文件的内容不是用来给用户显示的,
而是用来存储事件信息和由应用程序全局使用的对象 。
Global文件的名称必须是 Global.asa且必须存放在应用程序的根目录中,并且每个应用程序只能有一个 Global.asa文件 。
1,Global.asa文件
Global.asa文件是 ASP应用程序中使用到的一个特殊的文件,它是一个纯文本的文件 。 Global.asa文件中存放着 ASP应用程序运行期间所需的 Application
对象和 Session对象的事件,即 Application_OnStart
事件,Application_OnEnd事件,Session_OnStart事件和 Session_OnEnd事件 。 另外,在 Global.asa文件中还存放有 <Object>标记声明的对象 。
可以用任何支持脚本的语言编写 Global.asa文件中包含的脚本 。 如果多个事件使用同一种脚本语言,
就可以将它们组织在一组 <SCRIPT>标记中 。
在 Global.asa文件中,如果包含的脚本没有用
<SCRIPT>标记封装,或定义的对象没有指定作用域为会话或应用程序,则服务器将返回错误 。
在 Global.asa文件中声明的过程只能从一个或多个与 Application_OnStart,Application_OnEnd,
Session_OnStart和 Session_OnEnd事件相关的脚本中调用 。 在基于 ASP的应用程序的 ASP页中,它们是不可用的 。 如果要在应用程序之间共享过程,可在单独的文件中声明这些过程,然后使用服务器端包容 (SSI)
语句将该文件包含在调用该过程的 ASP程序中 。 通常,
包含文件的扩展名应为,inc。
2,Global.asa文件的结构在 Global.asa 文件中,所有的代码必须用
<Script>和 </Script>标记来界定,而不能使用 <%和
%>标记 。 在 <Script>和 </Script>标记间可以使用任何脚本语言来书写,当然要安装相应的脚本引擎 。 并且要用诸如 <Script Language=VbScript
RunAt=Server>注明 。 下面给出 Global.asa文件的基本结构 。
<Object RunAt=Server Scope=范围 ID=名称 ProgID=类名 > </Object>
<Script Language="VBScript" RunAt="Server">
Sub Application_OnStart

End Sub
Sub Session_OnStart

End Sub
Sub Session_OnEnd

End Sub
Sub Application_OnEnd

End Sub
</Script>
说明:
① <Object>? </Object>标记用来声明对象,其中 RunAt=Server是必须的,且其值只能是 Server,它表明这个 Object只能在服务器上执行;,范围,表明本对象的使用用户,当 Scope=Session时,表明本对象只给此次登录的用户使用,若 Scope=Application,
则可以让所有联机用户使用;,名称,是为对象定义的名称;,类名,是该对象的类名称 。
② <Script Language="VBScript" RunAt="Server">指明所使用的语言为 VBScript,程序在服务器端处理 。
③ Sub Application_OnStart? End Sub指明应用程序开始时所要执行的代码 。
④ Sub Session_OnStart? End Sub 指明 一个
Session开始时所要执行的代码 。
⑤ Sub Session_OnEnd? End Sub 指 明 一 个
Session结束时所要执行的代码 。
⑥ Sub Application_OnEnd? End Sub指明一个应用程序结束时所要执行的代码 。
3,一个 Global.asa文件的实例下面代码是一个 Global.asa文件的实例:
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnStart
' 建立一个数据库连接
Set cn = Server.CreateObject("ADODB.Connection")
cn.Provider = "sqloledb"
ProvStr = "Server=Your_SQL_Server_Name;Database
=Northwind;UID=sa;PWD=;"
cn.Open ProvStr
Set Session("cnn") = cn
END Sub
Sub Session_OnEnd
' 断开数据库连接
cn.Close
END Sub
</SCRIPT>
9.3 上机练习
【 练习 9-1】 统计在线用户 。
在线用户是指当前正在网上浏览网页的用户 。
① 创建 lx9_1.asp文件 。 代码如下:
<%@Language=VBscript%>
<%Session.timeout=1 %>
<html>
<head><title>显示在线人数 </title></head>
<body><center>
欢迎光临本网站,当前共有 <%=Application("OnLine")%>人在线
</center>
</body>
</Html>
说明:代码 Session.timeout=1表示当浏览器端在 1分钟内没有提出任何请求,该次对话将被终止 。
② 创建 global.asa文件,并将其存放在虚拟目录的根目录中 。 程序如下:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_onStart
Application("OnLine")=0
‘ 当服务器启动时,
‘ 将记录在线用户的 Application("OnLine")清零
End Sub
Sub Session_onStart
Application.Lock
Application("OnLine")=Application("OnLine")+1
' 新增在线用户个数
Application.Unlock
End Sub
Sub Session_OnEnd
Application.Lock
Application("OnLine")=Application("OnLine")-1
' 减少在线用户个数
Application.Unlock
End Sub
</SCRIPT>
说明,Session_OnStart事件将在一个用户首次访问目前站点时唯一调用 。 Session_OnEnd事件将在
Session过期或用户主动释放 Session时调用 。
【 练习 9-2】 猜数游戏 。 如图 9-7所示,计算机随机产生一个 100以内的整数,等待你去猜 。
程序 lx9_2.asp的代码如下:
<SCRIPT LANGUAGE=vbscript>
Sub init()
frm1.number.Focus ' 文本框取得焦点
frm1.number.select ' 文本框内容被选中
End Sub
</SCRIPT>
<html>
<head><title>猜数游戏 </title></head>
<body onload=init>
<center><FONT size=6 face=方正舒体 color= blue>
猜数游戏 </font></center>
<hr><form name=frm1 action="lx9_2.asp">
<%
if not IsNumeric(Request("Number")) then
GuessNum=0
else
GuessNum=Cint(Request("Number"))
end if
Session("Count")=Session("Count")+1
if GuessNum=0 then
session("Count")=0
Randomize
session("Number")=Int(rnd*100+1)
end if
response.write "请输入 1-100之间的整数,"
response.write "<input type=text name=Number value=
" & GuessNum & " size=8>"
response.write "<input type=submit value=提交 >"
response.write "</form><hr>
<FONT size=5 face=方正舒体 color= blue>"
if session("Count")>0 then
if GuessNum>session("Number") then
response.write "你猜的太大了 <BR>"
elseif GuessNum<Session("Number") then
response.write "你猜的太小了 <BR>"
elseif GuessNum=session("Number") then
response.write "祝贺你,猜对了 <BR>"
end if
end if
Response.write "</font>共猜了 " & Session("Count") & "次 "
if Session("Count")=10 then
Response.write ",答案是 " & Session("Number")
end if
%>
<a href="lx9_2.asp?Number=0">重新猜 </a>
</body>
</html>
说明:其中使用了 Session对象的两个 Session变量 。 Session("Count") 变量保存猜数的个数;
Session("Number")变量保存计算机产生的随机数 。
【 练习 9-3】 显示网页的在线名单 。
执行程序,lx9_3.asp” ( 如图 9-8左 ) 并输入用户名称之后,调用另一个程序,lx9_3_1.asp”,如果有其他用户在此之前或之后执行,lx9_3.asp” 并输入用户名称,那么在线名单不仅会显示出当前用户的名称,也会显示出其他用户的名称 。 将,lx9_3_1.asp”
的自动更新时间设置为 10秒,闲置时间设置为 20秒,
换句话说,一旦中途有人加入联机或离线,网页并不一定会马上更新,但最迟会在闲置时间之内完成更新 。
程序,lx9_3.asp” 的代码如下:
<HTML>
<BODY>
<FORM name=f1 method="get" Action="lx9_3_1.asp">
请输入您的名字:
<INPUT TYPE="TEXT" NAME="UserName" SIZE="20"><BR>
<INPUT TYPE=submit VALUE="登录 " name=b1>
<INPUT TYPE="RESET" VALUE="重新输入 ">
</FORM>
</BODY>
</HTML>
程序,lx9_3_1.asp” 的代码如下:
<%
RefreshTime = 10 ' 设置网页自动更新时间为 10秒
IdleTime = RefreshTime * 2 ' 设置闲置时间为自动更新时间的 2倍
NewUser = Request("UserName") ' 读取用户输入的名称
Application.Lock ‘ name数组记录了所有连线到此网页的
‘ 用户的名称 将新用户名称放入数组的最后面
If Application(NewUser & "1") = Empty Then
If Application("Total") = Empty Then Application("Total") = 0
Session("UserName") = NewUser
num=Application("Total")
If not isarray(Application("name")) Then
redim Tmp(num)
else
Tmp=Application("name")
end if
Tmp(Num) = Session("UserName")
ReDim Preserve Tmp(num+1)
Application("Total") = Num + 1
Application("name") = Tmp
End If
Application(Session("UserName") & "1") = Timer
' 记录当前用户的最近存取时间
‘ 检查所有连线到此网页的用户的最近存取时间,
‘ 若与目前时间相差 20秒以上,表示离线
ReDim Tmp(Application("Total"))
Num = 0
For I = 0 To Application("Total") - 1
User = Application("name")(I)
If (Timer - Application(User & "1")) < IdleTime Then
Tmp(Num) = User
Num = Num + 1
Else
Application(User & "1") = Empty
End If
Next ‘ Num 表示目前在线人数,若与
‘ Application("Total")不同,表示中间有人离线
If Num <> Application("Total") Then
ReDim Preserve Tmp(Num)
Application("name") = Tmp
Application("Total") = Num
End If
Application.UnLock
%>
<HTML>
<HEAD>
<META HTTP-EQUIV=Refresh CONTENT=
"<%=RefreshTime%>,URL=lx9_3.asp?UserName=
<%=Request("UserName")%>">
</HEAD>
<BODY>
<%=Session(“UserName”)%>,
目前有 <%= Application("Total") %>人在线:
<!--'将在线名单以下拉菜单的形式显示出来 -->
<SELECT SIZE=1>
<% For I = 0 To (Application("Total") - 1) %>
<OPTION VALUE="<%= Application("name")(I) %>">
<%= Application("name")(I) %>
</OPTION>
<% Next %>
</SELECT>
</BODY>
</HTML>
说明:
① Application对象中的 Application("Total")
变量存放在线人数; Application(User & "1")变量存放在线人最后访问的时间; Application("name")
数组存放在线人名;
② Session对象的 Session("UserName")变量存放本地用户名称;
③ <META>标记设置自动刷新页面,RefreshTime
时间 ( 10秒 ) 后自动指向新网页 lx9_3.asp( 自身 ) 。