下载第 3章 ASP应用程序与会话在前面的章节中介绍了 A S P提供的访问一个客户请求和产生响应的方法,本章将讨论 A S P
的另两个对象。就是 A p p l i c a t i o n和 S e s s i o n对象。这两个对象不是直接地与请求和响应的管理有关,而是更多地与 A S P网页运行环境的管理相关。
与建立 We b站点或 We b应用程序有关的共同问题之一,是使用 H T T P协议时没有状态。状态提供了与一个指定用户有关的变量值、对象和其他资源,并且应用程序中的任意例程都能使用它;以一种像 V B或 C + +这样的程序设计语言编写一般的基于客户的应用程序时,使用状态可以完成一些相应的工作。然而,We b并不提供这种能力。在本章中,读者将看到为什么和如何避免这个问题。
本章还涉及到一些术语和技术问题。它迄今为止,本书中已经简单地讨论了,We b应用程序”,但没有真正确切地理解或准确定义它们到底是什么。本书也涉及到了“用户会话”,
也没有相应的比较完全的描述。前面有意地省略这方面的内容,因为它们与 A S P的应用程序和会话密切相关。下面将介绍 A S P的 A p p l i c a t i o n和 S e s s i o n对象。
本章研究的主要内容:
We b应用程序是什么,以及它们如何与 ASP Application对象相联系。
用户会话是什么,以及它们如何与 ASP Session对象相联系。
ASP如何自动地创建和管理应用程序和会话。
Application和 S e s s i o n对象提供的功能。
如何把 A p p l i c a t i o n和 S e s s i o n对象放入 A S P网页中。
首先研究整个内容的核心问题:状态。
3.1 We b上的状态管理许多开发人员把应用程序传送到 We b之前从来没有考虑状态的概念。正如前面说过的,
We b是一个无状态的环境。因此应该探讨一下状态是什么,了解能够避免产生问题的方法。
3.1.1 状态的准确定义在单用户程序中,创建一个可执行的应用程序时,例如使用 V B建立的一个,e x e文件,可以声明一个全局 (或 P u b l i c )变量,然后在代码中任何地方可对其进行访问。在应用程序运行的所有时刻,该变量的值一直是有效,并且是可访问的。
对于一个传统的客户机 /服务器解决方案,例如一个基于客户机的应用程序对一个基于服务器的数据库引擎进行访问的系统,每个客户端建立了一个与服务器和数据库应用程序的连接。这种连接通常是通过验证用户的方法来建立的。
验证过程是典型的识别用户身份的过程,通过一个用户名和口令组合来证明是否为合法的用户。
一旦通过验证,在客户端和基于服务器的应用程序之间就建立了连接,该连接在用户使用该应用程序的所有时间内一直保持有效。当用户注册到本地 Windows 2000服务器上时,这一切便会发生。无论何时,管理员使用,Active Directory Users and Computers”实用程序 (单击,S t a r t”菜单的,Administrative To o l s”选项中的,Directory Management”项 )都可以观察到活动的用户连接。这个过程在许多系统中都相同,例如 Microsoft SQL Server。
这种永久的连接意味着:当用户发送指令或请求到服务器上时,服务器会很容易地识别每个用户。同样服务器的响应或任何其他用户的信息也能直接返回用户。要进一步指出的是服务器可以比较容易地存储与每个客户相关的值和信息,并在需要的时候提供给相应的客户。
当然,服务器应用程序能够拥有主全局变量,以便于用户在需要的时候进行访问。
这种识别每个客户端的请求并在内存中保存相关用户的值的能力构成状态。可以认为状态代表应用程序的值、环境以及用户的内部变量,并贯穿于应用程序和用户连接的整个过程。
3.1.2 状态的重要性如果打算创建与用户进行交互的基于 We b站点的应用程序,而不是仅显示独立页面的 We b
网站,必须能够为每个用户提供独立的状态。这可能只是记住他们的名字,也可能要为每个用户存储对象引用或不同的记录集。如果不能这样做,A S P网页就不能做更多的事情,因为该页面执行完成时,页面中的变量和其他相关资料都破坏了。当用户请求下一个页面时,这个页面提供的所有信息将全部失去。
因此,需要找到一种方法,保存每个访问者的状态。能够存储对所有用户而言的全局值是非常重要。例如,一个 We b风格的访问或页面点击计数器,它不为每个用户提供自己的计数器,用户们通常想要看到访问者的总数,而不仅仅是他们自己访问的次数。访问者的数目需要与应用程序级状态一起存储,而不是与用户级状态一起存储。
这不是一个刚出现的问题,自从商用站点占据了 We b,就已经存在,甚至更早些。所以已有许多在 We b上存储状态的传统的解决方案。 We b站点管理员想要了解访问者以前是否曾访问过他们的网站,如果访问过,访问过多少次?是否经常访问?还定期访问其他什么网站等。
这样可以更好地制定其广告目标。所有这些都要求一种方法来存储有关用户在访问时所产生的网页请求或每次访问间的信息。
3.1.3 在 We b上创建状态在页面请求和站点访问之间提供状态常用的方法是通过 c o o k i e。我们在前面的章节中已经看到,如何在客户端的计算机中存放相应的值,这些值与每个页面请求一起发送给对此 c o o k i e
有效的域。通过用 A S P检查和更新 c o o k i e,在某种程度上能够保持一个状态。可以使用所包含的信息来识别用户,然后把用户连接到一个已存储相应值的集合。
例如,可以检测一个用户请求是否包含一个站点指定的 c o o k i e。如果不包含,则为该用户分配一个某种类型的标识,指明一个数量,并存储在带有一个长有效期的 c o o k i e中。以后该用户对这个站点的每一次访问,都能够检测到 c o o k i e并更新所包含的信息。同时可以收集有关访问的次数和持续时间的数据,并存储在服务器上,以备将来使用。
但是,如果用户转移到另一个计算机,或删除了 c o o k i e,或者他们的浏览器拒绝接收发送给他们的 c o o k i e,会发生什么事情呢?在这种情况下,不能维持状态,因为下一次不能识别他第 3章 A S P应用程序与会话 计计 71下载们现在,We b上有许多 c o o k i e,大多数人会接受它们,而不加理会。如果打开浏览器中的
,Warn before accepting cookies”选项,接着漫游几个大的站点,你就会明白其中的含意。
1,匿名访问者与授权的访问者如果认为 c o o k i e是一个有点草率的解决方案,可以使用更直接的方法。许多站点采用的一种方法是,在访问者点击一个站点时,或者点击一个要求验证身份的页面时,弹出一个进行登录的对话框。访问者首先必须进行注册,获得一个某种类型的用户名 /口令的组合,才能允许访问相应的站点或页面。
为了证实访问者是一个已知的并且合法的用户,在访问者的计算机上放置的一个 c o o k i e,
它或者保存注册的详细数据,或者是一把表明已验证过身份的“钥匙 ( k e y )” 。同时,访问者的详细数据永久地保存在服务器上,准备再次访问时使用。如果访问者的浏览器中有了这样一个 c o o k i e,他就可以自由地访问该网站,因为已经验证过了。
如果 c o o k i e没有有效期限 ( E x p i r e s ),c o o k i e的值在关闭浏览器时自动消失,在下一次访问时必须重新登册和再次验证。当然,如果拒绝接收 c o o k i e或删除了 c o o k i e,就只能再次得到登册对话框。这样的话,如果不被识别,就不能访问该站点。
通过强制用户就像登册到自己的网络一样登册到 We b服务器,Windows 2000整体安全性能为 I I S提供更强和更安全的验证功能。但是,这只能与 Internet Explorer
3,0和之上版本的浏览器一起工作。 I I S也可以使用 B A S I C验证允许非 M i c r o s o f t浏览器注册 We b服务器。
2,不再有匿名访问者在 IIS We b服务器上使用 A S P时,除非用户离开该站点到另一个网站或者关闭了浏览器,
否则能在当前会话中跟踪用户。在本章的后面,将看到如何使用这个功能来标识一个访问者、
存储用户的本地信息和提供状态。下面与已经讨论过的解决方案相比较,讨论其工作方式。
A S P和 I I S共同提出了一个用户会话的概念,通过 ASP Session对象进行交互。在每个访问者第一次访问服务器上的一个 A S P网页时,为他创建一个新的并且独立的会话对象,分配给该会话一个会话标识号,并把包含会话标识符的特殊加密版本的一个 c o o k i e发送给客户。
c o o k i e的路径 (参看前面的章节有关 c o o k i e属性的描述 )设置为运行在服务器上的 A S P应用程序的根路径。这很可能是缺省的 We b网站的根目录 (即,/” ),但也可能会是另外一个值 (稍后会看到 )。在 c o o k i e中没有提供 E x p i r e s值,所以当浏览器关闭时,c o o k i e值也就消失。
每当这个用户访问这个 A S P网页,A S P都会查找这个 c o o k i e。命名为 A S P S E S S I O N I Dx x x x x x x x,
其中每个 x是一个字母字符。从第 2章图 2 - 7所示的 S e r v e r Va r i a b l e s集合,能够在 H T T P报头中看到它。这里高亮地显示 ASP cookie,如图 3 - 1所示。
图 3-1 显示的 cookie 值
72计计 ASP 3 高级编程 下载但是,这个 c o o k i e不会出现在 R e q u e s t,C o o k i e s或 R e s p o n s e,C o o k i e s集合中,A S P把它隐藏起来,但仍保存在浏览器上。对于每个 A S P网页的请求,A S P都要查看该值。这个 c o o k i e包含的值,指明了这个用户的会话。因此,相应的 S e s s i o n对象 (该对象在内存中已被处理,并且一直包含所有在前一页面请求过程中进行操作的值 )的内容可以移交给 A S P网页中的脚本。
当然,如前所述,如果客户浏览器不接收或不支持这些 c o o k i e,这个处理将失败。在这种情况下,不能创建 A S P会话,对这个访问者的状态也不进行自动维护。
3.2 We b应用程序的定义前面的章节中已经多次使用过 We b应用程序 ( Web Application)术语,所指的既不是一个真正意义上的 We b网站,又不是一个传统的应用程序。换句话说,而是认为它是一些 We b网页和用来完成某些任务的其他资源的一个集合。它隐含这样一层意思:有一个预定义的路线贯穿于网页之中,用户可做出选择或提供信息使任务能够完成。
例如,一个在线商店,你为了购买货物,进行反复的观察和选择,浏览一系列网页,收集所需要的信息,支付相应的费用,最后发出定单。也可能是一个“软件升级向导”,指导用户完成下载和安装新软件的过程,或者可能是一个基于 I n t r a n e t的报价单或销售报告的生成工具。
所有这些不同于“标准”的 We b网站,一般的 We b站点使用一系列菜单或导航栏以预先未定义的路径漫游该站点。但是一个 We b应用程序远不只是受控制的导航器。自由地漫游于一个 We b网站时,可以进行无状态的和匿名的访问,但 We b应用程序一般不接受。
3.2.1 ASP应用程序的定义上述内容可以认为是术语,We b应用程序”的一个合理的一般定义,但遗憾的是,在谈论有关,A S P应用”时,仅这些还不够。回答什么是,We b应用”可以是主观的,而回答什么是,A S P应用”则需要从技术上的解释。在 A S P中术语“应用程序”有自己特定的含义,在讨论如何实现之前,弄懂这个概念至关重要。
A S P应用程序与两个主要的内容有关:
全局范围的规定,具有一个全局可访问的变量存储区域。
通过 C O M +与 I I S的集成,可更好地管理组件。
下面讨论这些内容。第二个内容涉及到其他 A S P对象,其覆盖范围相当广泛。在下一章研究 ASP Server对象时,将对这部分内容进行详细地讨论。
1,提供 We b应用程序的全局范围
A S P提供一个 A p p l i c a t i o n对象,基本上与前面讨论的 S e s s i o n对象相当。但是,这是在应用程序层而不是在用户层。换句话说,该对象是全局的,不是对单独用户的,而是对应用程序的所有用户,其作用域不限制为单独用户的访问。这与在一个正常的可执行应用程序中的全局 (或 P u b l i c )变量相同。 A p p l i c a t i o n对象可用于在全局环境中存储变量和信息 (即状态 ),该应用程序内的任何 A S P网页中运行的脚本都可访问这些值,而不管是哪个访问者发出的请求。
但是,这没有回答主要问题:什么是一个 A S P应用程序?为此,需要研究 A S P内部的一些情况。
当用户请求一个 A S P网页时,I I S通过实例化 a s p,d l l (用来实现 A S P )创建一个环境 (如第 1章第 3章 A S P应用程序与会话 计计 73下载所述 )。将该页面解释为服务器端脚本,相应的脚本引擎的实例用来执行该脚本。
实例化的 a s p,d l l初始事件启动一个 A S P应用程序,创建一个 A p p l i c a t i o n对象。然后,为这个用户启动一个会话,并创建单独的 S e s s i o n对象。当更多的会话启动时,这个 A p p l i c a t i o n对象保留在作用域中 (即已经实例化和可用 )。一旦最后保持活动的会话结束,该应用程序就结束,
并取消相应的 A p p l i c a t i o n对象。因此,当站点上还有活动会话时,将会有一个单独的
A p p l i c a t i o n对象提供给所有用户使用。
(1) 缺省的 A S P应用
Windows 2000在安装 I I S和 A S P时,创建了一个缺省的 We b站点。它被配置成一个 A S P应用程序,涉及到在 P r o p e r t i e s对话框中针对站点根目录文件夹 (缺省为 C,\ I n e t p u b \ W W W R o o t )
的一些设置。图 3 - 2所示是缺省 We b站点的 P r o p e r t i e s对话框的屏幕。
图 3-2 缺省 We b网站的 P r o p e r t i e s对话框涉及到 A S P应用程序的文件之一是 g l o b a l,a s a。这个文件用于定制应用程序行为的方式。
放置在应用程序的根目录下,可用于该目录下的所有子目录。因此,如果它放置在整个 We b
站点的根目录下,则定义整个网站作为缺省的 A S P应用程序的一部分。
在本章后面有关应用程序和会话事件的部分中,将看到这个文件及其使用方法。
(2) ASP虚拟应用程序如同在设置过程中创建缺省的应用程序一样,可以在该 We b网站的任何子目录中创建属于自己的 A S P虚拟应用程序。这个应用程序包含作为“应用程序目录”而定义的目录中所有的子目录。并且,这个目录和子文件夹也都是缺省应用程序的一部分,共享由缺省的
A p p l i c a t i o n对象创建的全局空间。
事实上,在缺省的应用程序中存储的所有变量在子目录中的应用程序中也都是可用的。
然而,如果该子目录应用程序中的一个 A S P网页把一个值写入 A p p l i c a t i o n对象,而 A p p l i c a t i o n
对象与缺省 (根 )应用程序中已存在的一个值有相同的名字,那么,原先的值在子目录应用程序
74计计 ASP 3 高级编程 下载中就不能再用。但是在其他的应用程序或 A S P网页中,将保留原有的值,因为根目录的应用程序不能访问子目录应用中的值。
从一个子程序或函数的变量的角度考虑这个问题。如果定义一个变量 i n t M y Va l u e为 P u b l i c
或全局的变量,可以从任何的子程序或函数内部访问该变量。但是,如果又声明一个具有相同名字的局部变量,并在该子程序或函数内对该变量进行引用,则得到此变量的局部值。不能再访问原先的值。当子程序或函数结束,局部值被撤消,全局变量原有的值仍然保留着:
(3) 创建自己的 A S P虚拟应用程序为了建立一个新的虚拟应用程序,使用 Internet Services Manager应用程序或具有相同功能的 HTML Web Manager网页。在 Internet Services Manager中,在要创建的虚拟应用程序的目录上单击右键,并选择 N e w,接着选择 Virtual Directory,屏幕如图 3 - 3所示。
图 3-3 创建 A S P虚拟应用程序的屏幕这个操作启动 New Virtual Directory Wi z a r d,该向导的开始屏幕提供有关向导的操作信息。
单击 N e x t,在第二页中键入新的虚拟应用程序的名字 (或别名 )。这个名字与在 Internet Services
M a n a g e r中选择的目录的路径联合起来,将成为该应用程序的 U R L。屏幕如图 3 - 4所示。
为了把一个现有的目录转换为与该目录具有相同名字的一个应用程序,选择包含想要转换的目录的目录,并在向导的 Virtual Directory Alias页中使用该目录名。例如把已有的 t e s t目录转换为一个虚拟应用程序,应该在 Internet Services Manager中选择 Default Web Site条目,并提供一个别名,t e s t” 。
第 3章 A S P应用程序与会话 计计 75下载图 3-4 New Virtual Directory Wi z a r d的屏幕再单击 N e x t,指定包含该应用程序的内容 (页面 )的路径。单击 B r o w s e选择一个已有目录。
这个目录是新的虚拟应用指向的目录。屏幕如图 3 - 5所示。
图 3-5 指定路径时的屏幕单击 N e x t打开 Access Permissions页,选择给予这个应用程序的所有用户的权限。缺省值是 R e a d和 Run Scripts,对大多数用户而言是适合的。屏幕如图 3 - 6所示。
图 3-6 设置用户许可权限时的屏幕如果想编写用户可直接执行的、定制的编译的 C G I应用程序,只选择,E x e c u t e”,
例如,用户通过在请求的 U R L中指定相应名字的方法执行的一个,e x e文件,像" h t t p:
/ / m y s i t e,c o m /.,,/ Test Application/ create_user,e x e? u s e r = J J o n e s"。
单击 N e x t,向导创建该虚拟应用程序。在图 3 - 7所示的屏幕中,可在左边的列表栏中看到带有一个包含一些填充物的打开的小盒子图标。
76计计 ASP 3 高级编程 下载图 3-7 虚拟应用 程序 创建完成后的屏幕如果现在用右键单击新的应用程序并选择 P r o p e r t i e s,可以看到向导已经选择的设置。在这里可根据需要修改访问权限,,Local Path”和,Application Settings” 。同时会看到一个
R e m o v e按钮,可以用来删除该虚拟应用程序,如图 3 - 8所示。
图 3-8 虚拟应用程序属性设置的屏幕第 3章 A S P应用程序与会话 计计 77下载
(4) 删除虚拟应用程序单击,R e m o v e”按钮不会真正地删除 Internet Services Manager中的该条目。而是把现有的虚拟应用程序转换为一个虚拟目录。这个目录有一个带有蓝色球的“文件夹”图标,该图标表示这并不是 We b网站中一个真正的目录,而是对磁盘上另一个文件夹的一个重定向。对它进行的访问方式与创建它的虚拟应用程序相同 (即使用相同的 U R L ),但是不作为一个应用程序。换句话说,它不支持自己的 A p p l i c a t i o n对象,而是继承缺省 We b网站的 A p p l i c a t i o n对象,
或者是在该目录的父目录中的另一个应用程序的 A p p l i c a t i o n对象。
为了删除一个虚拟应用程序,可简单地在 Internet Services Manager中的对象上单击右键,
在弹出的菜单中选择 D e l e t e。
(5) 应用程序存储的内容
ASP Application对象提供的全局存储空间可以用来存储下列内容:
简单变量,例如字符串和数字 (存储为 Va r i a n t,类似于 A S P脚本变量 )。
Va r i a n t类型数组,一维或多维。
对一个 C O M对象实例的变量引用 (类似于 Va r i a n t )。
(6) Va r i a n t的定义
Va r i a n t是在 V B S c r i p t脚本引擎中为 A S P (和 Internet Explorer)提供的唯一变量类型,与在
V B和 V B A中定义的数据类型 Va r i a n t相类似。与大多数常用的基本数据类型 (例如字符串或整数 )相比,尽管它不能使存储单元最高效地存储变量,需要进行额外的处理,但 Va r i a n t提供许多用处。
从内部来讲,Va r i a n t数据类型存储数值作为独立的子类型。它能自动地处理隐含的类型转换,允许使用如下的代码:
隐含的数据类型转换允许忽略 H T M L文本的值和列表控件是字符串的情况,并且如果需要的话可以把它们当成数字 (假设字符串确实包含一个有效的数字 )。也可以随意地做一些其他的事情,诸如使用 V B S c r i p t的 L e n方法检查 R e q u e s t,F o r m集合中并不存在的一个值的长度。
L e n函数试图把从 R e q u e s t,F o r m的调用的值转换成一个字符串。如果该值丢失,返回空
( E m p t y ),转换为带有 " "的一个字符串,因此长度是零。
(7) VBScript数据类型及转换也可以进行显式的数据类型转换。在 V B S c r i p t中,Va r Ty p e方法返回一个整数,表明
Va r i a n t当前保存的子类型:
78计计 ASP 3 高级编程 下载还有一些函数,如 I s A r r a y,I s D a t e,I s E m p t y,I s N u l l,I s N u m e r i c和 I s O b j e c t,对特定的子类型返回一个 B o o l e a n结果。一旦知道了数据的子类型,如果包含的数据合适的话,就可以将之转换成不同的 Va r i a n t子类型。这对代码的透明性和检查变量是否包含合法值都是有用的,
非法的转换将导致运行期错误,转换如下所示:
(8) JScript数据类型及转换在 J S c r i p t中,其他一些变量类型类似于 V B S c r i p t,但是没有代表对象的 Va r i a n t。所有值都是对象,类型是下列六种数据类型之一:
u n d e f i n e d:只有单个值? u n d e f i n e d?,用于表明请求中的变量没有声明和创建,或者若是隐含创建但还未分配任何值。类似于 V B S c r i p t的 E m p t y。
N u l l:变量不包含一个有效的值。类似于 V B S c r i p t的 N o t h i n g。
Boolean。
String。
Number。
Object。
J S c r i p t提供了一个 t y p e o f函数,返回表示数据的类型的字符串,例如:
每种数据类型都有 t o S t r i n g方法和 v a l u e O f方法,t o S t r i n g方法将变量的值转换为一个字符串返回,v a l u e O f方法把变量的值作为它的原有数据类型返回。
(9) JScript的级联和加法问题
J S c r i p t在许多方面不同于 V B S c r i p t,在一定程度上是因为没有,&”级联运算符可用。当使用加法运算符时,它先检查变量的数据类型以决定要做什么。如果两个变量都是数值,结果是数值的和。如果一个或两个是字符串,结果是字符串的级联:
如果进行加法的值超过两个,要看执行的顺序。下面的代码行进行相应的示范:
第 3章 A S P应用程序与会话 计计 79下载在第一种情况下,两个数相加,结果被转换为一个字符串并与 " < P > "字符串进行级联。在第二种情况下,第一个运算符是一个字符串和一个数的级联,所以数被转换为一个字符串。
而后,所有的运算符都是级联运算符。为了避免这个问题,可以使用括号强制第一个运算符是两个数值的加法:
2,We b应用程序中的组件管理在 A S P中使用虚拟应用程序的第二个主要方面是:具有较好的对在脚本代码内实例化和执行的组件进行管理的能力。先不讨论有关它怎样进行工作以及为什么会如此有用的详细情况,在学习 A S P组件的部分时再讨论相关内容。
这里非常简要地介绍在 A S P网页 (此 A S P网页在该应用程序中 )中使用组件时,如何对一个虚拟应用程序在 P r o p e r t i e s对话框 (在 Internet Services Manager中 )进行设置。
在一个虚拟应用程序的 P r o p e r t i e s对话框的 Home Directory页的底部,有两个组合框,为
Execute Permissions和 Application Protection,如图 3 - 9所示。
图 3-9 Execute Permissions和 Application Protection组合框应用的保护和执行设置因为在本章中,不讨论在一个 We b网页内如何创建组件的实例,因此这里先列出这些选项,在创建应用程序时可能要对此进行设置。 Execute Permissions选项如表 3 - 1所示。
表 3-1 Execute Permissions 的选项及说明选 项 说 明
N o n e 在这个虚拟应用程序中不能运行脚本或可执行文件。实际上,提供了禁止一个应用程序的快速和简单的方法
S c r i p t s O n l y 只允许脚本文件 (例如 A S P,I D C或其他的 )在这个虚拟应用程序中运行,不能运行可执行文件
Scriptsand Executables 允许任何的脚本和可执行文件在这个虚拟应用程序内运行
Execute Permissions选项控制可在该虚拟应用程序中执行的类型,而 A p p l i c a t i o n
P r o t e c t i o n”选项影响可执行文件和组件运行的方式。在第 1章中已经讨论过可用的选项,但是在这里再重复一次,Application Protection选项如表 3 - 2所示。
M i c r o s o f t推荐一个配置是:关键性应用程序运行在自己的进程中,即 H i g h ( I s o l a t e d );其他的应用程序运行在共享的进程中,即 M e d i u m ( P o o l e d)。
现在,已经讨论了 A S P应用程序涉及到的相关内容,现在详细地讨论 ASP Session对象方
80计计 ASP 3 高级编程 下载面的内容。
表 3-2 Application Protection的选项及说明选 项 说 明
Low(IIS Process) 带有这种设置的 A S P虚拟应用程序的所有可执行文件和组件运行在 We b服务器的可执行文件 ( I n e t i n f o,e x e )的进程 (即内存空间 )中。因此,如果可执行文件或组件之一失败的话,We b服务器处于危险状态。这提供了最快和以最少的资源执行的选项
M e d i u m ( P o o l e d ) (缺省 )带有这种设置的 A S P虚拟应用程序的所有应用程序的可执行文件和组件是运行在 D L L H o s t,e x e的单个共享实例的进程 (即内存空间 )中。这就防止了 We b服务器可执行文件 ( I n e t i n f o,e x e )受可执行文件或组件失败的影响。然而,一个失败的可执行文件或组件可能引起 D L L H o s t,e x e进程失败,以及所有其他驻留其中的可执行文件和组件失败
H i g h ( I s o l a t e d ) 带有这种设置的 A S P虚拟应用程序的所有应用程序的可执行部分和组件是运行在 D L L H o s t,e x e的单个共享实例的进程 (即内存空间 )中,但是每个 A S P应用程序都有自己的 D L L H o s t,e x e实例,该实例对该应用程序是独占的。这就防止了 We b
服务器可执行文件 ( I n e t i n f o,e x e )受可执行文件或组件失败的影响,并防止虚拟应用的单个共享实例受另一个虚拟应用程序的一个可执行文件或组件失败的影响。
M i c r o s o f t建议最多有十个这样的虚拟应用程序驻留在一个 We b服务器上
3.2.2 ASP会话的定义
A S P会话引入了一个 We b应用程序中粒度的下一层。 A S P的 A p p l i c a t i o n对象可用来存储对于“正在运行此应用程序”的所有用户都是全局的和可访问的状态 (即简单变量、对象、数组等 )。换句话说,用于响应这个应用程序内所有访问者的请求的全部 A S P代码能够对这些值进行访问 (假设已经建立了一个有效的会话,稍后将看到 )。
但是在多数情况下这还不够。需要具备存储指定给每个用户的值的能力,而不必通过给这些值分配名字指明其隶属于哪个用户。例如,下列值很可能弄乱应用程序的全局存储空间:
从载入系统资源和要求一些代码访问每个用户的相应会话的角度来看,还有另外的不足之处。只要有访问者,该应用程序就一直存在,这意味着应用程序的全局存储空间需要不断增大,除非在用户离开该网站时采取步骤删除这些值。
在 We b应用程序中提供用户层作用域除了使用全局变量的存储以外,应该为每个访问者分配他们自己的私有变量存储空间,
使其对指定访问者载入的所有页面都可用的。这种情况下,可以对每个变量使用相同的名字,
使 A S P代码非常简单地得以实现。这些相同的代码对每个用户将透明地进行工作,因为访问的只是访问者拥有的私有存储区域:
这就是 S e s s i o n对象产生的地方。
第 3章 A S P应用程序与会话 计计 81下载
(1) 会话存储的内容会话存储的内容对指定的访问者是全局的,而对其他访问者来讲是私有的,这使得 A S P
的会话非常有用。可以用来存储在 ASP Application对象中存储的相同类型的数据,即:
简单变量,例如字符串和数值 (像所有的 A S P脚本变量一样存储为 Va r i a n t )。
Va r i a n t数组,一维或多维。
对一个 C O M对象的实例的变量引用 (如同 Va r i a n t )。
(2) 会话带来的问题会话提供了一个存储每个用户特定的值的方法。然而有几个意想不到的问题要注意:
记住一些浏览器和 We b服务器对 U R L、路径和文件名的大小写形式是敏感的 (例如 N a v i g a t o r
和基于 UN I X/ L i n u x的服务器 )。如果把一个超级链接放置在网页的一个 U R L上,并且它们不是同样的书写形式,则在浏览器中被认为是不相同的。同样,如果路径和文件名的书写形式不是相同的,则浏览器认为是不同的路径或文件。对于在服务器上的定位资源来讲,
这并不重要,因为 I I S对书写形式不敏感,可以接受大写形式和小写形式的任何组合,并返回书写形式不同的具有相同字符的文件。然而,如果一个 c o o k i e已经指定了一个路径,
而且与在超级链接中所指定的路径在书写形式上不同,浏览器可能不会把它以及相应目录的页面一起返回给服务器。这有可能找不到依赖于这个 c o o k i e的一个用户会话,并且
S e s s i o n对象将不会在作用域中 (即其中的任何变量都是不可用的 )。因此,在所有的目录和网页名字中,坚持都采用小写形式或者是比较明显的混合字母形式,是一个好办法。
在 I I S和 A S P的早期版本中,对于嵌套的应用程序还有一些小的,B u g”,有时,当用户离开嵌套的 A S P虚拟应用程序并返回到缺省的 A S P应用程序层时,与嵌套应用程序内部已经定义的局部变量相同名字的任何全局变量不能重新显现。还有,当会话使用
S e s s i o n,A b a n d o n方法 (稍后将会看到 )终止时,g l o b a l,a s p文件中的代码将执行失败。在
ASP 3.0中已经解决了这些问题。
记住会话依赖于 c o o k i e。如果访问者已经禁止使用 c o o k i e或者浏览器不支持 c o o k i e,将不能启动一个会话,并且不能访问 S e s s i o n对象。
(3) 禁止会话虽然状态提供了有益环境,但让用户门户大开。如果不需要保留状态,可以禁止会话以节约计算机的处理时间。例如,在一个不需要跟踪访问者或不需要为访问者保留全局值的
We b网站上,可以防止会话启动,通过在
Internet Services Manager中设置属性,或为不需要状态的独立网页增加代码 (稍后将看到 )。
为了禁止整个 We b网站的所有会话,可编辑缺省 We b网站应用程序的属性。为了禁止一个指定应用程序的会话,可编辑相应虚拟应用程序的属性。打开相应的应用程序的 P r o p e r t i e s
对 话 框,在 Home Directory页 上 单 击
C o n f i g u r a t i o n按钮,如图 3 - 1 0所示。
82计计 ASP 3 高级编程 下载图 3-10 Home Directory页在出现的 C o n f i g u r a t i o n对话框中,打开 App Option。这里可以允许或禁止整个应用程序的会话 (在本例中是整个缺省 We b站点 ),也可以修改缺省的会话 Ti m e o u t值。在图 3 -
11中可以看到 Ti m e o u t设置为 2 0 m i n。在
A S P的早期的版本中这是缺省值,可根据要求设置相应的值 (在 ASP 3.0中,缺省值是 1 0 m i n )。
如果要禁止一个指定网页的会话,同时允许它们在同一个应用程序的其他网页中创建和使用,可为该页面增加一条 A S P
处理指令。它跟在指定缺省语言的语句后
(如果没指定一个缺省语言,可单独使用该指令 ):
到此为止,大致介绍了 A S P应用程序和 S e s s i o n对象的一些情况,下面详细地进行讨论。
3.3 ASP的 A p p l i c a t i o n对象和 S e s s i o n对象本章已经讨论了两个 A S P对象,A p p l i c a t i o n对象和 S e s s i o n对象,因此能够访问 A p p l i c a t i o n
对象和 S e s s i o n对象提供的集合、方法、属性和事件。本节将从程序设计的角度对这两个对象进行研究。
图 3-12 ASP对象关系第 3章 A S P应用程序与会话 计计 83下载图 3 - 11 App Options页客户请求
Server对象服务器
ASPError
对象
Session对象
Application对象
Request对象
R e s p o n s e对象
Session对象
Request对象
R e s p o n s e对象客户请求客户客户服务器响应服务器响应
当载入 ASP DLL并响应对一个 A S P网页的第一个请求时,创建 Application 对象。该对象提供一个存储场所,用来存储对于所有访问者打开的所有网页都可用的变量和对象。
当访问者首次从站点请求一个 A S P页面时,为他创建一个 S e s s i o n对象,并保持有效直到缺省的超时周期 (或由脚本确定的超时周期 )。该对象提供一个存储场所,用来存储仅仅对该访问者在会话的活动期间打开的网页可用的变量和对象。
图 3 - 1 2 (即图 1 - 2 0 )给出了用户的请求和服务器的响应在会话中的分布情况。所有的会话都在 A S P应用程序中。
3.3.1 ASP的 A p p l i c a t i o n对象成员概述本节说明 A p p l i c a t i o n对象的集合、方法和事件 ( A p p l i c a t i o n对象没有属性 )。在下一节对
S e s s i o n对象 (具有属性 )进行同样的说明。然后将继续探讨使用这些对象所完成的任务,更详细地说明每个对象的各成员如何进行工作。
1,Application对象的集合
A p p l i c a t i o n对象提供了两个集合,可以用来访问存储于全局应用程序空间中的变量和对象。集合及说明如表 3 - 3所示。
表 3-3 Application 对象的集合及说明集 合 说 明
C o n t e n t s 没有使用 < O B J E C T >元素定义的存储于 A p p l i c a t i o n对象中的所有变量 (及它们的值 )的一个集合。包括 Va r i a n t数组和 Va r i a n t类型对象实例的引用
S t a t i c O b j e c t s 使用 < O B J E C T >元素定义的存储于 A p p l i c a t i o n对象中的所有变量 (及它们的值 )的一个集合
2,Application对象的方法
A p p l i c a t i o n对象的方法允许删除全局应用程序空间中的值,控制在该空间内对变量的并发访问。方法及说明如表 3 - 4所示。
表 3-4 Application对象的方法及说明方 法 说 明
C o n t e n t s,R e m o v e ( "v a r i a b l e _ n a m e" ) 从 A p p l i c a t i o n,C o n t e n t集合中删除一个名为 v a r i a b l e _ n a m e的变量
C o n t e n t s,R e m o v e A l l ( ) 从 A p p l i c a t i o n,C o n t e n t集合中删除所有变量
L o c k ( ) 锁定 A p p l i c a t i o n对象,使得只有当前的 A S P页面对内容能够进行访问。用于确保通过允许两个用户同时地读取和修改该值的方法而进行的并发操作不会破坏内容
U n l o c k ( ) 解除对在 A p p l i c a t i o n对象上的 A S P网页的锁定注意,在运行期间不能从 A p p l i c a t i o n,S t a t i c O b j e c t s集合中删除变量。
3,Application对象的事件
A p p l i c a t i o n对象提供了在它启动和结束时触发的两个事件,如表 3 - 5所示。
表 3-5 Application对象的事件及说明事 件 说 明
O n S t a r t 当 A S P启动时触发,在用户请求的网页执行之前和任何用户创建 S e s s i o n对象之前。
用于初始化变量、创建对象或运行其他代码
O n E n d 当 A S P应用程序结束时触发。在最后一个用户会话已经结束并且该会话的 O n E n d事件中的所有代码已经执行之后发生。其结束时,应用程序中存在的所有变量被取消
84计计 ASP 3 高级编程 下载
3.3.2 ASP的 S e s s i o n对象成员概述本节概述 S e s s i o n对象的所有成员。
1,Session对象的集合
S e s s i o n对象提供了两个集合,可以用来访问存储于用户的局部会话空间中的变量和对象。
这些集合及说明如表 3 - 6所示。
表 3-6 Session 对象的集合及说明集 合 说 明
C o n t e n t s 存储于这个特定 S e s s i o n对象中的所有变量和其值的一个集合,并且这些变量和值没有使用 < O B J E C T >元素进行定义。包括 Va r i a n t数组和 Va r i a n t类型对象实例的引用
S t a t i c O b j e c t s 通过使用 < O B J E C T >元素定义的、存储于这个 S e s s i o n对象中的所有变量的一个集合
2,Session对象的特性
S e s s i o n对象提供了四个属性。这些属性及说明如表 3 - 7所示。
表 3-7 Session 对象的属性及说明属 性 说 明
C o d e P a g e 读 /写。整型。定义用于在浏览器中显示页内容的代码页 (Code Page)。代码页是字符集的数字值,不同的语言和场所可能使用不同的代码页。例如,A N S I代码页 1 2 5 2用于美国英语和大多数欧洲语言。代码页 9 3 2用于日文字
L C I D 读 /写。整型。定义发送给浏览器的页面地区标识 ( L C I D )。 L C I D是唯一地标识地区的一个国际标准缩写,例如,2 0 5 7定义当前地区的货币符号是 '£ '。 L C I D也可用于
F o r m a t C u r r e n c y等语句中,只要其中有一个可选的 L C I D参数。 L C I D也可在 A S P处理指令
< %,,,% >中设置,并优先于会话的 L C I D属性中的设置。本章后面提供一个 A S P处理指令的列表
S e s s i o n I D 只读。长整型。返回这个会话的会话标识符,创建会话时,该标识符由服务器产生。
只在父 A p p l i c a t i o n对象的生存期内是唯一的,因此当一个新的应用程序启动时可重新使用
Ti m e o u t 读 /写。整型。为这个会话定义以分钟为单位的超时周期。如果用户在超时周期内没有进行刷新或请求一个网页,该会话结束。在各网页中根据需要可以修改。缺省值是
1 0 m i n,在使用率高的站点上该时间应更短
3,Session对象的方法
S e s s i o n对象允许从用户级的会话空间删除指定值,并根据需要终止会话。 S e s s i o n对象的方法及说明如表 3 - 8所示。
表 3-8 Session对象的方法及说明方 法 说 明
C o n t e n t s,R e m o v e ( "v a r i a b l e _ n a m e" ) 从 S e s s i o n,C o n t e n t集合中删除一个名为 v a r i a b l e _ n a m e的变量
C o n t e n t s,R e m o v e A l l ( ) 从 S e s s i o n,C o n t e n t集合中删除所有变量
A b a n d o n ( ) 当网页的执行完成时,结束当前用户会话并撤消当前 S e s s i o n对象。
但即使在调用该方法以后,仍可访问该页中的当前会话的变量。当用户请求下一个页面时将启动一个新的会话,并建立一个新的 S e s s i o n对象 (如果存在的话 )
注意,在运行期间不能从 S e s s i o n,S t a t i c O b j e c t s集合中删除变量。
第 3章 A S P应用程序与会话 计计 85下载
4,Session对象的事件
S e s s i o n对象提供了在启动和结束时触发的两个事件,如表 3 - 9所示。
表 3-9 Session 对象的事件及说明事 件 说 明
O n S t a r t 当 A S P用户会话启动时触发,在用户请求的网页执行之前。用于初始化变量、创建对象或运行其他代码
O n E n d 当 A S P用户会话结束时触发。从用户对应用程序的最后一个页面请求开始,如果已经超出预定的会话超时周期则触发该事件。当会话结束时,取消该会话中的所有变量。在代码中使用 A b a n d o n方法结束 A S P用户会话时,也触发该事件
3.3.3 使用 Application 和 S e s s i o n的事件
A S P的 A p p l i c a t i o n和 S e s s i o n对象体现了其他 A S P内置对象所没有的特征 — 事件。然而,
正像在前面的对象成员表中看到的那样,这些都是与 A S P会话和应用程序的工作相联系的事件。
1,Application 和 S e s s i o n的事件处理器每当一个应用程序或会话启动或结束时,A S P触发一个事件。可以通过在一个特殊的文件中编写普通的脚本代码来检测和应答这些事件,这个文件名为 g l o b a l,a s a,位于一个应用程序的根目录中 (对于缺省的 We b网站是 \ I n e r P u b \ W W W R o o t目录,或是作为一个实际应用程序定义的一个文件夹 )。这个文件可以包含一个或多个 H T M L的 < O B J E C T >元素,用于创建将在该应用程序或用户会话内使用的组件实例。
在第 4章中将详细地介绍如何创建组件实例。下面的代码是 g l o b a l,a s a文件的一个例子。我们只关注 < O B J E C T >元素以及以 S e t关键字开始的那些代码行:
86计计 ASP 3 高级编程 下载因为这个 g l o b a l,a s a文件用于本章中的示例页面,所以将需要将该文件放到 We b
网站的根目录中,或者放到已配置为一个虚拟应用程序的目录中,并且在该目录中包含有其他示例文件。
读取和存储值注意上面的例子怎样读取和存储 A p p l i c a t i o n和 S e s s i o n的变量,与在 R e q u e s t和 R e s p o n s e对象的集合中所采取的方式相同。设置这些变量的值:
获取这些变量的值:
当然,对于 S e s s i o n对象可采取同样的方法。
可以看到,当从一个 S e s s i o n事件处理器访问时,怎样“锁定” ( L o c k )和“解锁” ( U n l o c k )
该 A p p l i c a t i o n对象;当从一个 A S P网页访问时,需要进行相同的处理。用 A p p l i c a t i o n事件内的代码访问 A p p l i c a t i o n对象中的值时,不要求这么做。这是因为在任何应用程序中只有一个
A p p l i c a t i o n对象的实例,并且其事件处理器的代码只在没有活动的用户会话时运行。
也可看到一个基本的用户会话计数器是如何实现的。这里使用一个应用程序级的变量
Vi s i t _ c o u n t,当新的会话启动时它就自动增加。
一般也不限制简单地把值保存到 A p p l i c a t i o n或 S e s s i o n对象中。例如,We b开发者的 We b站点在 h t t p / /,w e b d e v,w r o x,c o,u k上,有相应的一个 g l o b a l,a s a文件,当一个新的会话启动时该文件就在服务器上的数据库中写入相应的条目,数据细节从 R e q u e s t,S e r v e r Va r i a b l e s集合中获取。
这提供了一个基本的方法统计访问者的数量,并收集访问者的一些基本信息。
第 3章 A S P应用程序与会话 计计 87下载
2,创建 Va r i a n t数组在 S e s s i o n和 A p p l i c a t i o n对象中创建和使用一个 Va r i a n t数组来存储值的方法目前尚未讨论,
在这里作为一个非常有用的技术进行讨论。正如已经看到的那样,一个 Va r i a n t数据类型可以包含一个数组,而不仅仅是一个值。
一个数组只是在内存的一个连续区域中以指定的次序存储二进制值的一个长行。
要安排 Va r i a n t,需要指向首项,并给出有关大小和结构的信息,脚本引擎可以做余下的事情。
可在一个 Va r i a n t变量中创建一维、二维或多维数组,然后把该数组分配给一个应用程序层或用户会话层的变量,并保证整个数组可在相应的地方使用。下面代码演示了一个简单的一维数组的使用技术:
3,应用程序和会话在何时启动和结束在介绍 A S P应用程序和会话如何进行工作时提到过这个内容。以最基本的术语概述如下:
当第一个用户请求应用程序作用域内 (即 We b网站的缺省根目录内 ),或者在该网站的一个子目录内的一个用户定义的虚拟应用程序的一个 A S P网页时,启动该应用程序。在任何用户会话启动之前发生。
当任意用户第一次请求在缺省应用程序或一个虚拟应用程序内的一个 A S P网页时,启动一个会话 (如果还没一个活动的会话 )。
当用户在会话指定的超时周期内没有下载一个 A S P网页时,会话结束。超时时间可以在脚本代码中使用 S e s s i o n,Ti m e o u t属性进行设置,可在 P r o p e r t i e s对话框中对各个应用程序单独设置,或者通过 Active Directory的 I I S:部分修改 I I S元数据库中的缺省值进行设置。
调用 S e s s i o n,A b a n d o n方法的一个网页完成执行以后,会话也会结束。
在一个应用程序中的最后一个活动会话结束以后,该应用程序立即结束。
4,ASP处理指令正如在第 1章中所看到的,可以把一条处理指令增加到一个 A S P网页。处理指令可以根据需要包含一个以上的条目。可以在语句中使用的关键字及其说明如表 3 - 1 0所示。
表 3-10 ASP指令关键字及说明指令关键字 说 明
L A N G U A G E = "l a n g u a g e _ n a m e" 设置该网页的缺省的脚本语言,如,<%@ LANGUA G E
="VBScript" %>
E N A B L E S E S S I O N S TAT E = " Tr u e " | " F a s l e " 当设置为,Tr u e”时,防止一个会话的 c o o k i e发送到浏览器,
因此将不会创建新的 S e s s i o n对象,任何现有会话的内容将不再可用
C O D E PA G E = "c o d e _ p a g e" 设置该网页的代码页,如 < % @ C O D E PA G E = " 1 2 5 2 " % >
L C I D = " l o c a l e _ i d e n t i f i e r " 设置该网页的位置标识符,如 < % @ L C I D = " 2 0 5 7 " % >
T R A N S A C T I O N = " t r a n s a c t i o n _ t y p e " 指明该网页文件将在一个事务环境下运行。有效值是:
,R e q u i r e d”,如果已有可用的事务,脚本将在其中运行;如果没有可用的事务,启动一个新的事务。
88计计 ASP 3 高级编程 下载
(续 )
指令关键字 说 明
,R e q u i r e s _ N e w”,脚本将初始化一个新的事务。
,S u p p o r t e d”,如果已有可用的事务,脚本将在其中运行;而且不启动一个新的事务。
,Not_ Supported”,脚本将不运行于任何已有的事务中,
并且不初始化一个新的事务。
在第 1 8章中详细介绍事务。
在一个网页上只能允许有一条处理指令,并且应该放在第一行。在处理指令中可以包含不止一个这样的条目,但必须用空格进行分隔,等号两端不能有空格,例如:
3.3.4 活动中的 ASP Application对象我们提供一些简单的网页,这些网页示范了使用过程中的 ASP Application和 S e s s i o n对象。
为了能够正常使用,必须把它们放到服务器上的一个虚拟应用程序内,并且把所提供的
g l o b a l,a s a文件放到该应用程序的根目录中。最简单的办法是把 g l o b a l,a s a文件放到缺省 We b网站的根目录 (缺省情况下是 C,/ I n e t P u b / W W W R o o t )中。
对任何已有的 g l o b a l,a s a文件重命名是一个好方法,可以在以后对该文件进行恢复。
本书的所有例子文件都可以从我们的 We b网站上得到,在例子的 C h a p t e r 0 3子目录中还有本章的所有其余示例网页。
在 C h a p t e r 0 3子目录中,D e f a u l t,a s p网页是一个简单的菜单,该菜单允许运行 A p p l i c a t i o n
和 S e s s i o n示例网页,运行屏幕如图 3 - 1 3所示。
图 3-13 Default.asp运行屏幕
1,显示 A p p l i c a t i o n集合的内容单击第一个链接,打开名为 s h o w _ a p p l i c a t i o n,a s p
的 A p p l i c a t i o n对象示例页面。它显示了虚拟应用程序当前的 A p p l i c a t i o n对象的内容,如图 3 - 1 4所示。
注意到 A S P C o u n t e r对象是 S t a t i c O b j e c t s集合的一个成员 (通过 < O B J E C T >元素进行定义 ),但是其余部分
(由 S e r v e r,C r e a t e O b j e c t实例化 )是 C o n t e n t s集合的成员。
第 3章 A S P应用程序与会话 计计 89下载图 3-14 Application对象的内容屏幕可以看到使用 g l o b a l,a s a例子网页放到这些集合中的值,这在前面已经看到:
(1) 遍历 C o n t e n t s集合的代码为了遍历 C o n t e n t s集合,可使用一个 For Each,.,N e x t结构。集合中的每一项可以是一个简单的 Va r i a n t类型变量、一个 Va r i a n t数组或者一个对象的引用。因为需要对每种类型的值进行不同的处理,所以就不得不对每一个进行检查来判别其类型。
在 V B S c r i p t中可使用 Va r Ty p e函数完成这个工作。这里使用 I s O b j e c t和 I s A r r a y函数代替:
注意程序如何从 A p p l i c a t i o n对象检索该数组。将其分配给一个局部 ( Va r i a n t )变量,使用下面的语句:
使用 U B o u n d函数可以查找出数组的大小 (元素的数量 ),这个值可以作为遍历的终止条件:
90计计 ASP 3 高级编程 下载这个例子是一维数组,并将只显示这样的一个数组的内容。可根据需要编辑代码以处理多维数组,例如:
(2) 遍历 S t a t i c O b j e c t s集合的代码
S t a t i c O b j e c t s集合包含了所有在 g l o b a l,a s a中使用 < O B J E C T >元素声明的对象引用。因为每个条目都是一个对象变量,可用简单些的代码对这个数组进行遍历。我们将输出对象的名字
(在 I D属性中原有的定义 ):
2,增加值到 C o n t e n t s集合增加值到 C o n t e n t s集合的方法,与在
g l o b a l,a s a网页的脚本代码中使用过的方法相同。示例网页允许把一个新的 Va r i a n t值增加到 A p p l i c a t i o n对象中,并已有建议的名字和值 (可根据需要进行编辑 ),如图 3 - 1 5所示。
单击按钮,重新载入这个网页,把值增加到 A p p l i c a t i o n,C o n t e n t s集合中,并且在列表中显示,如图 3 - 1 6所示。
增加新的 C o n t e n t s条目的代码所有的按钮和其他 H T M L控件放置在示例网页中的一个窗体上。 A C T I O N设置了当前网页的路径,提交该窗体时,重新装入。
M E T H O D属性为,P O S T”,所以控件中的值出现在 R e q u e s t,F o r m集合中。在以前的章节中采用过这两种技术:
该窗体上的按钮都是普通的 H T M L I N P U T控件,具有相同的标题 (三个空格 )但名字不同。
例如,创建第一个按钮 (把值增加到 A p p l i c a t i o n对象中 )的代码是:
重新载入该网页时,检查 R e q u e s t,F o r m集合,判定单击的是哪个 S U B M I T按钮,并进行相第 3章 A S P应用程序与会话 计计 91下载图 3-15 增加值到 C o n t e n t s集合的屏幕图 3-16 显示 C o n t e n t s集合内容的屏幕应的处理。如果是增加一个值到 A p p l i c a t i o n对象的按钮 (该按钮在 H T M L的 < I N P U T >元素中被命名为 c m d A d d ),使用下面的程序段:
注意程序如何使用 A p p l i c a t i o n,L o c k和 A p p l i c a t i o n,U n l o c k方法,确保这些值不会因两个用户并发地访问而产生混乱。如果只是对一个特定的值进行设置,一般不可能发生这种情况。
但一直使用 L o c k和 U n l o c k方法是明智的。
3,从 C o n t e n t s集合中删除值在例子网页的底部有两个按钮,如图 3 - 1 7所示。这两个按钮允许从 A p p l i c a t i o n,C o n t e n t s集合中删除值。第一个按钮从集合中删除单个的指定值,下拉列表框显示的是 C o n t e n t s集合 值 的 名 字 的 列 表 ( 记 住,不 能 从
S t a t i c O b j e c t s集合中删除值,因为它们是静态的 )。
通过遍历 C o n t e n t s集合 (如前面我们所做的 )执行 A S P网页时,创建该列表。但是,我们仅收集每项的名字并把它们放到 < S E L E C T >列表元素内的 < O P T I O N >元素中:
该 A S P代码执行以后,在浏览器中看到的结果是:
(1) 删除单个的值当单击按钮删除单个值时,该窗体再次提交给相同的网页,但是这一次将查找名为
c m d R e m o v e T h i s的 S U B M I T按钮。如果存在 (即单击了这个按钮 ),则使用列表框的值,调用
A p p l i c a t i o n,C o n t e n t s集合的 R e m o v e方法:
92计计 ASP 3 高级编程 下载图 3-17 显示在网页底部的两个按钮注意这是 C o n t e n t s集合的一个方法,而不是 A p p l i c a t i o n对象的。语法是
A p p l i c a t i o n,C o n t e n t s,R e m o v e,而不是 A p p l i c a t i o n,R e m o v e。
从 C o n t e n t s集合中删除 S t a r t _ Ti m e值的结果如图 3 - 1 8所示。
(2) 删除所有的值如果单击三个 S U B M I T类型按钮中的最后一个
(如图 3 - 1 8所示 ),该网页中的代码将检测到单击的按钮为 c m d R e m o v e A l l,将执行 A p p l i c a t i o n,C o n t e n t s
集合的 R e m o v e A l l方法:
再次提醒,这是 C o n t e n t s集合的一个方法,而 不 是 A p p l i c a t i o n 。 语 法 是
A p p l i c a t i o n,C o n t e n t s,R e m o v e A l l,而不是
A p p l i c a t i o n,R e m o v e A l l。
图 3 - 1 9所示的是从 C o n t e n t s集合中删除所有值的结果 (记住在运行时间不能从 S t a t i c O b j e c t s集合删除项 )。
图 3-19 删除 C o n t e n t集合中所有值的屏幕
3.3.5 活动中的 ASP Session对象示例网页的第二个示例页面 s h o w _ s e s s i o n,a s p,示范了如何使用 S e s s i o n对象。可在
C h a p t e r 0 3子目录中的开始菜单页面 ( D e f a u l t,a s p )中打开它。
第 3章 A S P应用程序与会话 计计 93下载图 3-18 删除 S t a r t _ Ti m e值后的屏幕
1,显示和更新 S e s s i o n集合
S e s s i o n对象示例页面看起来与刚刚使用过的 A p p l i c a t i o n对象示例页面相似。它遍历
S e s s i o n对象的 C o n t e n t s和 S t a t i c O b j e c t s集合,显示其名字和 (可能的话 )相应的值。如果把这些值与 A p p l i c a t i o n对象页面进行比较,将会看到不同之处。
这里还能够看到客户端 I P地址的一些其他值。这是当会话启动时 g l o b a l,a s a中的代码从
R e q u e s t,S e r v e r Va r i a b l e s集合中得到的。这个页面还显示四个会话属性的值,如图 3 - 2 0所示。
图 3-20 Session对象显示属性的屏幕下面是例子中使用的 g l o b a l,a s a文件的相关段落,它把缺省值增加到图 3 - 2 0所示的屏幕上所看到的会话中:
94计计 ASP 3 高级编程 下载遍历 C o n t e n t s和 S t a t i c O b j e c t s集合的代码与前面在 A p p l i c a t i o n对象示例网页中使用的代码一 样,只 不 过 这 里 引 用 了 S e s s i o n,C o n t e n t s和 Session,StaticObjects集 合,而 不 是
A p p l i c a t i o n,C o n t e n t s和 Application,StaticObjects集合。
靠近页面底部的按钮的功能是把值增加到 S e s s i o n,C o n t e n t s集合和从 S e s s i o n,C o n t e n t s集合删除值。这些按钮与在 A p p l i c a t i o n对象示例页面中相应的按钮工作方式相同,这里访问的是
S e s s i o n,C o n t e n t s集合,以及相应的 R e m o v e和 R e m o v e A l l方法。我们不再重复解释。
2,终止一个用户会话在 S e s s i o n对象页面的底部有一个按钮,该按钮终止当前的用户会话,这通过调用 S e s s i o n
对象的 A b a n d o n方法实现。它与其余的 H T M L控件在相同的窗体上,名为 c m d A b a n d o n。当该窗体再次被提交给这个网页时,在 R e q u e s t,F o r m集合中查找这个值 (如同在 A p p l i c a t i o n对象例子中做的一样 )。如发现这个值,则将该用户重定向到另一个网页:
新的页面名为 a b a n d o n,a s p,十分简单,除了创建消息的文本和 H T M L以外只有如下的代码:
该网页的其余部分只是一个包含单个 S U B M I T按钮的窗体。注意如何使用来自
R e q u e s t,S e r v e r Va r i a b l e s集合的引用网页 ( H T T P _ R E F E R E R )的 U R L的值,以确保重新载入前一个网页 ( S e s s i o n对象例子网页 ):
第 3章 A S P应用程序与会话 计计 95下载结果如图 3 - 2 1所示。这时,当前的用户会话已经被终止 (放弃 ),并且该用户不能引用原先的 S e s s i o n集合或属性的内容。
图 3-21 终止一个用户会话后的屏幕然而,记住这一切是在调用 A b a n d o n方法的网页已经执行完毕后发生的。调用 A b a n d o n
方法的网页执行时,甚至在对该方法的调用已经完成以后,仍能够从 S e s s i o n对象中获得用户的会话内容。当此网页结束时,会话才结束。
当然,当返回到显示会话内容的 S e s s i o n对象示例网页时,将启动一个新的 A S P会话。它将有一个不同的 S t a r t _ Ti m e值和通过执行 g l o b a l,a s a中的代码创建的其他缺省的会话值,如图 3 -
2 2所示。
注意,S e s s i o n,S e s s i o n I D属性值没有改变。 A S P试图重新分配相同的会话 I D,因此不能依靠该值来判定一个新的会话已经启动。
3.4 小结本章介绍了两个 A S P内置对象,A p p l i c a t i o n和 S e s s i o n对象。这些对象引入了 A S P的应用程序和用户会话的概念 (两者都是特定的术语,并且不是通常谈话时的意义 )。 A S P应用程序允许分配专门的属性给页面集,定义了 I I S和 A S P如何管理这些网页及所使用的其他组件。
然而,使用 A S P应用程序和会话的主要原因是需要自动地获得状态。换句话说,存储信息和变量引用的能力,要么对用户装载的所有网页是全局和可用的 (即在一个应用程序中 ),
要么仅仅对一个指定的用户的所有网页是可用的 (在一个会话中 )。这使建立 We b应用程序变得非常简单 (即应用程序在 We b上工作,但能够像传统的编译的应用程序一样能完成指定的任务 )。
本章通过一些示例页面,详细介绍如何使用 ASP 的 A p p l i c a t i o n和 S e s s i o n对象。这些页面示范了这两个对象可用的所有技术。
96计计 ASP 3 高级编程 下载图 3-22 重新建立一个用户会话后的屏幕本章的内容为:
We b应用程序是什么,以及它们如何与 ASP Application对象相联系。
用户会话是什么,以及它们如何与 A S P S e s s i o n对象相联系。
ASP如何自动地创建和管理应用程序和会话。
Application和 S e s s i o n对象提供的功能。
如何把 A p p l i c a t i o n和 S e s s i o n对象放入 A S P网页中。
下一章研究另一个 A S P内置对象,S e r v e r对象,你将会发现 ASP 3.0的许多令人兴奋的新特性。
第 3章 A S P应用程序与会话 计计 97下载
的另两个对象。就是 A p p l i c a t i o n和 S e s s i o n对象。这两个对象不是直接地与请求和响应的管理有关,而是更多地与 A S P网页运行环境的管理相关。
与建立 We b站点或 We b应用程序有关的共同问题之一,是使用 H T T P协议时没有状态。状态提供了与一个指定用户有关的变量值、对象和其他资源,并且应用程序中的任意例程都能使用它;以一种像 V B或 C + +这样的程序设计语言编写一般的基于客户的应用程序时,使用状态可以完成一些相应的工作。然而,We b并不提供这种能力。在本章中,读者将看到为什么和如何避免这个问题。
本章还涉及到一些术语和技术问题。它迄今为止,本书中已经简单地讨论了,We b应用程序”,但没有真正确切地理解或准确定义它们到底是什么。本书也涉及到了“用户会话”,
也没有相应的比较完全的描述。前面有意地省略这方面的内容,因为它们与 A S P的应用程序和会话密切相关。下面将介绍 A S P的 A p p l i c a t i o n和 S e s s i o n对象。
本章研究的主要内容:
We b应用程序是什么,以及它们如何与 ASP Application对象相联系。
用户会话是什么,以及它们如何与 ASP Session对象相联系。
ASP如何自动地创建和管理应用程序和会话。
Application和 S e s s i o n对象提供的功能。
如何把 A p p l i c a t i o n和 S e s s i o n对象放入 A S P网页中。
首先研究整个内容的核心问题:状态。
3.1 We b上的状态管理许多开发人员把应用程序传送到 We b之前从来没有考虑状态的概念。正如前面说过的,
We b是一个无状态的环境。因此应该探讨一下状态是什么,了解能够避免产生问题的方法。
3.1.1 状态的准确定义在单用户程序中,创建一个可执行的应用程序时,例如使用 V B建立的一个,e x e文件,可以声明一个全局 (或 P u b l i c )变量,然后在代码中任何地方可对其进行访问。在应用程序运行的所有时刻,该变量的值一直是有效,并且是可访问的。
对于一个传统的客户机 /服务器解决方案,例如一个基于客户机的应用程序对一个基于服务器的数据库引擎进行访问的系统,每个客户端建立了一个与服务器和数据库应用程序的连接。这种连接通常是通过验证用户的方法来建立的。
验证过程是典型的识别用户身份的过程,通过一个用户名和口令组合来证明是否为合法的用户。
一旦通过验证,在客户端和基于服务器的应用程序之间就建立了连接,该连接在用户使用该应用程序的所有时间内一直保持有效。当用户注册到本地 Windows 2000服务器上时,这一切便会发生。无论何时,管理员使用,Active Directory Users and Computers”实用程序 (单击,S t a r t”菜单的,Administrative To o l s”选项中的,Directory Management”项 )都可以观察到活动的用户连接。这个过程在许多系统中都相同,例如 Microsoft SQL Server。
这种永久的连接意味着:当用户发送指令或请求到服务器上时,服务器会很容易地识别每个用户。同样服务器的响应或任何其他用户的信息也能直接返回用户。要进一步指出的是服务器可以比较容易地存储与每个客户相关的值和信息,并在需要的时候提供给相应的客户。
当然,服务器应用程序能够拥有主全局变量,以便于用户在需要的时候进行访问。
这种识别每个客户端的请求并在内存中保存相关用户的值的能力构成状态。可以认为状态代表应用程序的值、环境以及用户的内部变量,并贯穿于应用程序和用户连接的整个过程。
3.1.2 状态的重要性如果打算创建与用户进行交互的基于 We b站点的应用程序,而不是仅显示独立页面的 We b
网站,必须能够为每个用户提供独立的状态。这可能只是记住他们的名字,也可能要为每个用户存储对象引用或不同的记录集。如果不能这样做,A S P网页就不能做更多的事情,因为该页面执行完成时,页面中的变量和其他相关资料都破坏了。当用户请求下一个页面时,这个页面提供的所有信息将全部失去。
因此,需要找到一种方法,保存每个访问者的状态。能够存储对所有用户而言的全局值是非常重要。例如,一个 We b风格的访问或页面点击计数器,它不为每个用户提供自己的计数器,用户们通常想要看到访问者的总数,而不仅仅是他们自己访问的次数。访问者的数目需要与应用程序级状态一起存储,而不是与用户级状态一起存储。
这不是一个刚出现的问题,自从商用站点占据了 We b,就已经存在,甚至更早些。所以已有许多在 We b上存储状态的传统的解决方案。 We b站点管理员想要了解访问者以前是否曾访问过他们的网站,如果访问过,访问过多少次?是否经常访问?还定期访问其他什么网站等。
这样可以更好地制定其广告目标。所有这些都要求一种方法来存储有关用户在访问时所产生的网页请求或每次访问间的信息。
3.1.3 在 We b上创建状态在页面请求和站点访问之间提供状态常用的方法是通过 c o o k i e。我们在前面的章节中已经看到,如何在客户端的计算机中存放相应的值,这些值与每个页面请求一起发送给对此 c o o k i e
有效的域。通过用 A S P检查和更新 c o o k i e,在某种程度上能够保持一个状态。可以使用所包含的信息来识别用户,然后把用户连接到一个已存储相应值的集合。
例如,可以检测一个用户请求是否包含一个站点指定的 c o o k i e。如果不包含,则为该用户分配一个某种类型的标识,指明一个数量,并存储在带有一个长有效期的 c o o k i e中。以后该用户对这个站点的每一次访问,都能够检测到 c o o k i e并更新所包含的信息。同时可以收集有关访问的次数和持续时间的数据,并存储在服务器上,以备将来使用。
但是,如果用户转移到另一个计算机,或删除了 c o o k i e,或者他们的浏览器拒绝接收发送给他们的 c o o k i e,会发生什么事情呢?在这种情况下,不能维持状态,因为下一次不能识别他第 3章 A S P应用程序与会话 计计 71下载们现在,We b上有许多 c o o k i e,大多数人会接受它们,而不加理会。如果打开浏览器中的
,Warn before accepting cookies”选项,接着漫游几个大的站点,你就会明白其中的含意。
1,匿名访问者与授权的访问者如果认为 c o o k i e是一个有点草率的解决方案,可以使用更直接的方法。许多站点采用的一种方法是,在访问者点击一个站点时,或者点击一个要求验证身份的页面时,弹出一个进行登录的对话框。访问者首先必须进行注册,获得一个某种类型的用户名 /口令的组合,才能允许访问相应的站点或页面。
为了证实访问者是一个已知的并且合法的用户,在访问者的计算机上放置的一个 c o o k i e,
它或者保存注册的详细数据,或者是一把表明已验证过身份的“钥匙 ( k e y )” 。同时,访问者的详细数据永久地保存在服务器上,准备再次访问时使用。如果访问者的浏览器中有了这样一个 c o o k i e,他就可以自由地访问该网站,因为已经验证过了。
如果 c o o k i e没有有效期限 ( E x p i r e s ),c o o k i e的值在关闭浏览器时自动消失,在下一次访问时必须重新登册和再次验证。当然,如果拒绝接收 c o o k i e或删除了 c o o k i e,就只能再次得到登册对话框。这样的话,如果不被识别,就不能访问该站点。
通过强制用户就像登册到自己的网络一样登册到 We b服务器,Windows 2000整体安全性能为 I I S提供更强和更安全的验证功能。但是,这只能与 Internet Explorer
3,0和之上版本的浏览器一起工作。 I I S也可以使用 B A S I C验证允许非 M i c r o s o f t浏览器注册 We b服务器。
2,不再有匿名访问者在 IIS We b服务器上使用 A S P时,除非用户离开该站点到另一个网站或者关闭了浏览器,
否则能在当前会话中跟踪用户。在本章的后面,将看到如何使用这个功能来标识一个访问者、
存储用户的本地信息和提供状态。下面与已经讨论过的解决方案相比较,讨论其工作方式。
A S P和 I I S共同提出了一个用户会话的概念,通过 ASP Session对象进行交互。在每个访问者第一次访问服务器上的一个 A S P网页时,为他创建一个新的并且独立的会话对象,分配给该会话一个会话标识号,并把包含会话标识符的特殊加密版本的一个 c o o k i e发送给客户。
c o o k i e的路径 (参看前面的章节有关 c o o k i e属性的描述 )设置为运行在服务器上的 A S P应用程序的根路径。这很可能是缺省的 We b网站的根目录 (即,/” ),但也可能会是另外一个值 (稍后会看到 )。在 c o o k i e中没有提供 E x p i r e s值,所以当浏览器关闭时,c o o k i e值也就消失。
每当这个用户访问这个 A S P网页,A S P都会查找这个 c o o k i e。命名为 A S P S E S S I O N I Dx x x x x x x x,
其中每个 x是一个字母字符。从第 2章图 2 - 7所示的 S e r v e r Va r i a b l e s集合,能够在 H T T P报头中看到它。这里高亮地显示 ASP cookie,如图 3 - 1所示。
图 3-1 显示的 cookie 值
72计计 ASP 3 高级编程 下载但是,这个 c o o k i e不会出现在 R e q u e s t,C o o k i e s或 R e s p o n s e,C o o k i e s集合中,A S P把它隐藏起来,但仍保存在浏览器上。对于每个 A S P网页的请求,A S P都要查看该值。这个 c o o k i e包含的值,指明了这个用户的会话。因此,相应的 S e s s i o n对象 (该对象在内存中已被处理,并且一直包含所有在前一页面请求过程中进行操作的值 )的内容可以移交给 A S P网页中的脚本。
当然,如前所述,如果客户浏览器不接收或不支持这些 c o o k i e,这个处理将失败。在这种情况下,不能创建 A S P会话,对这个访问者的状态也不进行自动维护。
3.2 We b应用程序的定义前面的章节中已经多次使用过 We b应用程序 ( Web Application)术语,所指的既不是一个真正意义上的 We b网站,又不是一个传统的应用程序。换句话说,而是认为它是一些 We b网页和用来完成某些任务的其他资源的一个集合。它隐含这样一层意思:有一个预定义的路线贯穿于网页之中,用户可做出选择或提供信息使任务能够完成。
例如,一个在线商店,你为了购买货物,进行反复的观察和选择,浏览一系列网页,收集所需要的信息,支付相应的费用,最后发出定单。也可能是一个“软件升级向导”,指导用户完成下载和安装新软件的过程,或者可能是一个基于 I n t r a n e t的报价单或销售报告的生成工具。
所有这些不同于“标准”的 We b网站,一般的 We b站点使用一系列菜单或导航栏以预先未定义的路径漫游该站点。但是一个 We b应用程序远不只是受控制的导航器。自由地漫游于一个 We b网站时,可以进行无状态的和匿名的访问,但 We b应用程序一般不接受。
3.2.1 ASP应用程序的定义上述内容可以认为是术语,We b应用程序”的一个合理的一般定义,但遗憾的是,在谈论有关,A S P应用”时,仅这些还不够。回答什么是,We b应用”可以是主观的,而回答什么是,A S P应用”则需要从技术上的解释。在 A S P中术语“应用程序”有自己特定的含义,在讨论如何实现之前,弄懂这个概念至关重要。
A S P应用程序与两个主要的内容有关:
全局范围的规定,具有一个全局可访问的变量存储区域。
通过 C O M +与 I I S的集成,可更好地管理组件。
下面讨论这些内容。第二个内容涉及到其他 A S P对象,其覆盖范围相当广泛。在下一章研究 ASP Server对象时,将对这部分内容进行详细地讨论。
1,提供 We b应用程序的全局范围
A S P提供一个 A p p l i c a t i o n对象,基本上与前面讨论的 S e s s i o n对象相当。但是,这是在应用程序层而不是在用户层。换句话说,该对象是全局的,不是对单独用户的,而是对应用程序的所有用户,其作用域不限制为单独用户的访问。这与在一个正常的可执行应用程序中的全局 (或 P u b l i c )变量相同。 A p p l i c a t i o n对象可用于在全局环境中存储变量和信息 (即状态 ),该应用程序内的任何 A S P网页中运行的脚本都可访问这些值,而不管是哪个访问者发出的请求。
但是,这没有回答主要问题:什么是一个 A S P应用程序?为此,需要研究 A S P内部的一些情况。
当用户请求一个 A S P网页时,I I S通过实例化 a s p,d l l (用来实现 A S P )创建一个环境 (如第 1章第 3章 A S P应用程序与会话 计计 73下载所述 )。将该页面解释为服务器端脚本,相应的脚本引擎的实例用来执行该脚本。
实例化的 a s p,d l l初始事件启动一个 A S P应用程序,创建一个 A p p l i c a t i o n对象。然后,为这个用户启动一个会话,并创建单独的 S e s s i o n对象。当更多的会话启动时,这个 A p p l i c a t i o n对象保留在作用域中 (即已经实例化和可用 )。一旦最后保持活动的会话结束,该应用程序就结束,
并取消相应的 A p p l i c a t i o n对象。因此,当站点上还有活动会话时,将会有一个单独的
A p p l i c a t i o n对象提供给所有用户使用。
(1) 缺省的 A S P应用
Windows 2000在安装 I I S和 A S P时,创建了一个缺省的 We b站点。它被配置成一个 A S P应用程序,涉及到在 P r o p e r t i e s对话框中针对站点根目录文件夹 (缺省为 C,\ I n e t p u b \ W W W R o o t )
的一些设置。图 3 - 2所示是缺省 We b站点的 P r o p e r t i e s对话框的屏幕。
图 3-2 缺省 We b网站的 P r o p e r t i e s对话框涉及到 A S P应用程序的文件之一是 g l o b a l,a s a。这个文件用于定制应用程序行为的方式。
放置在应用程序的根目录下,可用于该目录下的所有子目录。因此,如果它放置在整个 We b
站点的根目录下,则定义整个网站作为缺省的 A S P应用程序的一部分。
在本章后面有关应用程序和会话事件的部分中,将看到这个文件及其使用方法。
(2) ASP虚拟应用程序如同在设置过程中创建缺省的应用程序一样,可以在该 We b网站的任何子目录中创建属于自己的 A S P虚拟应用程序。这个应用程序包含作为“应用程序目录”而定义的目录中所有的子目录。并且,这个目录和子文件夹也都是缺省应用程序的一部分,共享由缺省的
A p p l i c a t i o n对象创建的全局空间。
事实上,在缺省的应用程序中存储的所有变量在子目录中的应用程序中也都是可用的。
然而,如果该子目录应用程序中的一个 A S P网页把一个值写入 A p p l i c a t i o n对象,而 A p p l i c a t i o n
对象与缺省 (根 )应用程序中已存在的一个值有相同的名字,那么,原先的值在子目录应用程序
74计计 ASP 3 高级编程 下载中就不能再用。但是在其他的应用程序或 A S P网页中,将保留原有的值,因为根目录的应用程序不能访问子目录应用中的值。
从一个子程序或函数的变量的角度考虑这个问题。如果定义一个变量 i n t M y Va l u e为 P u b l i c
或全局的变量,可以从任何的子程序或函数内部访问该变量。但是,如果又声明一个具有相同名字的局部变量,并在该子程序或函数内对该变量进行引用,则得到此变量的局部值。不能再访问原先的值。当子程序或函数结束,局部值被撤消,全局变量原有的值仍然保留着:
(3) 创建自己的 A S P虚拟应用程序为了建立一个新的虚拟应用程序,使用 Internet Services Manager应用程序或具有相同功能的 HTML Web Manager网页。在 Internet Services Manager中,在要创建的虚拟应用程序的目录上单击右键,并选择 N e w,接着选择 Virtual Directory,屏幕如图 3 - 3所示。
图 3-3 创建 A S P虚拟应用程序的屏幕这个操作启动 New Virtual Directory Wi z a r d,该向导的开始屏幕提供有关向导的操作信息。
单击 N e x t,在第二页中键入新的虚拟应用程序的名字 (或别名 )。这个名字与在 Internet Services
M a n a g e r中选择的目录的路径联合起来,将成为该应用程序的 U R L。屏幕如图 3 - 4所示。
为了把一个现有的目录转换为与该目录具有相同名字的一个应用程序,选择包含想要转换的目录的目录,并在向导的 Virtual Directory Alias页中使用该目录名。例如把已有的 t e s t目录转换为一个虚拟应用程序,应该在 Internet Services Manager中选择 Default Web Site条目,并提供一个别名,t e s t” 。
第 3章 A S P应用程序与会话 计计 75下载图 3-4 New Virtual Directory Wi z a r d的屏幕再单击 N e x t,指定包含该应用程序的内容 (页面 )的路径。单击 B r o w s e选择一个已有目录。
这个目录是新的虚拟应用指向的目录。屏幕如图 3 - 5所示。
图 3-5 指定路径时的屏幕单击 N e x t打开 Access Permissions页,选择给予这个应用程序的所有用户的权限。缺省值是 R e a d和 Run Scripts,对大多数用户而言是适合的。屏幕如图 3 - 6所示。
图 3-6 设置用户许可权限时的屏幕如果想编写用户可直接执行的、定制的编译的 C G I应用程序,只选择,E x e c u t e”,
例如,用户通过在请求的 U R L中指定相应名字的方法执行的一个,e x e文件,像" h t t p:
/ / m y s i t e,c o m /.,,/ Test Application/ create_user,e x e? u s e r = J J o n e s"。
单击 N e x t,向导创建该虚拟应用程序。在图 3 - 7所示的屏幕中,可在左边的列表栏中看到带有一个包含一些填充物的打开的小盒子图标。
76计计 ASP 3 高级编程 下载图 3-7 虚拟应用 程序 创建完成后的屏幕如果现在用右键单击新的应用程序并选择 P r o p e r t i e s,可以看到向导已经选择的设置。在这里可根据需要修改访问权限,,Local Path”和,Application Settings” 。同时会看到一个
R e m o v e按钮,可以用来删除该虚拟应用程序,如图 3 - 8所示。
图 3-8 虚拟应用程序属性设置的屏幕第 3章 A S P应用程序与会话 计计 77下载
(4) 删除虚拟应用程序单击,R e m o v e”按钮不会真正地删除 Internet Services Manager中的该条目。而是把现有的虚拟应用程序转换为一个虚拟目录。这个目录有一个带有蓝色球的“文件夹”图标,该图标表示这并不是 We b网站中一个真正的目录,而是对磁盘上另一个文件夹的一个重定向。对它进行的访问方式与创建它的虚拟应用程序相同 (即使用相同的 U R L ),但是不作为一个应用程序。换句话说,它不支持自己的 A p p l i c a t i o n对象,而是继承缺省 We b网站的 A p p l i c a t i o n对象,
或者是在该目录的父目录中的另一个应用程序的 A p p l i c a t i o n对象。
为了删除一个虚拟应用程序,可简单地在 Internet Services Manager中的对象上单击右键,
在弹出的菜单中选择 D e l e t e。
(5) 应用程序存储的内容
ASP Application对象提供的全局存储空间可以用来存储下列内容:
简单变量,例如字符串和数字 (存储为 Va r i a n t,类似于 A S P脚本变量 )。
Va r i a n t类型数组,一维或多维。
对一个 C O M对象实例的变量引用 (类似于 Va r i a n t )。
(6) Va r i a n t的定义
Va r i a n t是在 V B S c r i p t脚本引擎中为 A S P (和 Internet Explorer)提供的唯一变量类型,与在
V B和 V B A中定义的数据类型 Va r i a n t相类似。与大多数常用的基本数据类型 (例如字符串或整数 )相比,尽管它不能使存储单元最高效地存储变量,需要进行额外的处理,但 Va r i a n t提供许多用处。
从内部来讲,Va r i a n t数据类型存储数值作为独立的子类型。它能自动地处理隐含的类型转换,允许使用如下的代码:
隐含的数据类型转换允许忽略 H T M L文本的值和列表控件是字符串的情况,并且如果需要的话可以把它们当成数字 (假设字符串确实包含一个有效的数字 )。也可以随意地做一些其他的事情,诸如使用 V B S c r i p t的 L e n方法检查 R e q u e s t,F o r m集合中并不存在的一个值的长度。
L e n函数试图把从 R e q u e s t,F o r m的调用的值转换成一个字符串。如果该值丢失,返回空
( E m p t y ),转换为带有 " "的一个字符串,因此长度是零。
(7) VBScript数据类型及转换也可以进行显式的数据类型转换。在 V B S c r i p t中,Va r Ty p e方法返回一个整数,表明
Va r i a n t当前保存的子类型:
78计计 ASP 3 高级编程 下载还有一些函数,如 I s A r r a y,I s D a t e,I s E m p t y,I s N u l l,I s N u m e r i c和 I s O b j e c t,对特定的子类型返回一个 B o o l e a n结果。一旦知道了数据的子类型,如果包含的数据合适的话,就可以将之转换成不同的 Va r i a n t子类型。这对代码的透明性和检查变量是否包含合法值都是有用的,
非法的转换将导致运行期错误,转换如下所示:
(8) JScript数据类型及转换在 J S c r i p t中,其他一些变量类型类似于 V B S c r i p t,但是没有代表对象的 Va r i a n t。所有值都是对象,类型是下列六种数据类型之一:
u n d e f i n e d:只有单个值? u n d e f i n e d?,用于表明请求中的变量没有声明和创建,或者若是隐含创建但还未分配任何值。类似于 V B S c r i p t的 E m p t y。
N u l l:变量不包含一个有效的值。类似于 V B S c r i p t的 N o t h i n g。
Boolean。
String。
Number。
Object。
J S c r i p t提供了一个 t y p e o f函数,返回表示数据的类型的字符串,例如:
每种数据类型都有 t o S t r i n g方法和 v a l u e O f方法,t o S t r i n g方法将变量的值转换为一个字符串返回,v a l u e O f方法把变量的值作为它的原有数据类型返回。
(9) JScript的级联和加法问题
J S c r i p t在许多方面不同于 V B S c r i p t,在一定程度上是因为没有,&”级联运算符可用。当使用加法运算符时,它先检查变量的数据类型以决定要做什么。如果两个变量都是数值,结果是数值的和。如果一个或两个是字符串,结果是字符串的级联:
如果进行加法的值超过两个,要看执行的顺序。下面的代码行进行相应的示范:
第 3章 A S P应用程序与会话 计计 79下载在第一种情况下,两个数相加,结果被转换为一个字符串并与 " < P > "字符串进行级联。在第二种情况下,第一个运算符是一个字符串和一个数的级联,所以数被转换为一个字符串。
而后,所有的运算符都是级联运算符。为了避免这个问题,可以使用括号强制第一个运算符是两个数值的加法:
2,We b应用程序中的组件管理在 A S P中使用虚拟应用程序的第二个主要方面是:具有较好的对在脚本代码内实例化和执行的组件进行管理的能力。先不讨论有关它怎样进行工作以及为什么会如此有用的详细情况,在学习 A S P组件的部分时再讨论相关内容。
这里非常简要地介绍在 A S P网页 (此 A S P网页在该应用程序中 )中使用组件时,如何对一个虚拟应用程序在 P r o p e r t i e s对话框 (在 Internet Services Manager中 )进行设置。
在一个虚拟应用程序的 P r o p e r t i e s对话框的 Home Directory页的底部,有两个组合框,为
Execute Permissions和 Application Protection,如图 3 - 9所示。
图 3-9 Execute Permissions和 Application Protection组合框应用的保护和执行设置因为在本章中,不讨论在一个 We b网页内如何创建组件的实例,因此这里先列出这些选项,在创建应用程序时可能要对此进行设置。 Execute Permissions选项如表 3 - 1所示。
表 3-1 Execute Permissions 的选项及说明选 项 说 明
N o n e 在这个虚拟应用程序中不能运行脚本或可执行文件。实际上,提供了禁止一个应用程序的快速和简单的方法
S c r i p t s O n l y 只允许脚本文件 (例如 A S P,I D C或其他的 )在这个虚拟应用程序中运行,不能运行可执行文件
Scriptsand Executables 允许任何的脚本和可执行文件在这个虚拟应用程序内运行
Execute Permissions选项控制可在该虚拟应用程序中执行的类型,而 A p p l i c a t i o n
P r o t e c t i o n”选项影响可执行文件和组件运行的方式。在第 1章中已经讨论过可用的选项,但是在这里再重复一次,Application Protection选项如表 3 - 2所示。
M i c r o s o f t推荐一个配置是:关键性应用程序运行在自己的进程中,即 H i g h ( I s o l a t e d );其他的应用程序运行在共享的进程中,即 M e d i u m ( P o o l e d)。
现在,已经讨论了 A S P应用程序涉及到的相关内容,现在详细地讨论 ASP Session对象方
80计计 ASP 3 高级编程 下载面的内容。
表 3-2 Application Protection的选项及说明选 项 说 明
Low(IIS Process) 带有这种设置的 A S P虚拟应用程序的所有可执行文件和组件运行在 We b服务器的可执行文件 ( I n e t i n f o,e x e )的进程 (即内存空间 )中。因此,如果可执行文件或组件之一失败的话,We b服务器处于危险状态。这提供了最快和以最少的资源执行的选项
M e d i u m ( P o o l e d ) (缺省 )带有这种设置的 A S P虚拟应用程序的所有应用程序的可执行文件和组件是运行在 D L L H o s t,e x e的单个共享实例的进程 (即内存空间 )中。这就防止了 We b服务器可执行文件 ( I n e t i n f o,e x e )受可执行文件或组件失败的影响。然而,一个失败的可执行文件或组件可能引起 D L L H o s t,e x e进程失败,以及所有其他驻留其中的可执行文件和组件失败
H i g h ( I s o l a t e d ) 带有这种设置的 A S P虚拟应用程序的所有应用程序的可执行部分和组件是运行在 D L L H o s t,e x e的单个共享实例的进程 (即内存空间 )中,但是每个 A S P应用程序都有自己的 D L L H o s t,e x e实例,该实例对该应用程序是独占的。这就防止了 We b
服务器可执行文件 ( I n e t i n f o,e x e )受可执行文件或组件失败的影响,并防止虚拟应用的单个共享实例受另一个虚拟应用程序的一个可执行文件或组件失败的影响。
M i c r o s o f t建议最多有十个这样的虚拟应用程序驻留在一个 We b服务器上
3.2.2 ASP会话的定义
A S P会话引入了一个 We b应用程序中粒度的下一层。 A S P的 A p p l i c a t i o n对象可用来存储对于“正在运行此应用程序”的所有用户都是全局的和可访问的状态 (即简单变量、对象、数组等 )。换句话说,用于响应这个应用程序内所有访问者的请求的全部 A S P代码能够对这些值进行访问 (假设已经建立了一个有效的会话,稍后将看到 )。
但是在多数情况下这还不够。需要具备存储指定给每个用户的值的能力,而不必通过给这些值分配名字指明其隶属于哪个用户。例如,下列值很可能弄乱应用程序的全局存储空间:
从载入系统资源和要求一些代码访问每个用户的相应会话的角度来看,还有另外的不足之处。只要有访问者,该应用程序就一直存在,这意味着应用程序的全局存储空间需要不断增大,除非在用户离开该网站时采取步骤删除这些值。
在 We b应用程序中提供用户层作用域除了使用全局变量的存储以外,应该为每个访问者分配他们自己的私有变量存储空间,
使其对指定访问者载入的所有页面都可用的。这种情况下,可以对每个变量使用相同的名字,
使 A S P代码非常简单地得以实现。这些相同的代码对每个用户将透明地进行工作,因为访问的只是访问者拥有的私有存储区域:
这就是 S e s s i o n对象产生的地方。
第 3章 A S P应用程序与会话 计计 81下载
(1) 会话存储的内容会话存储的内容对指定的访问者是全局的,而对其他访问者来讲是私有的,这使得 A S P
的会话非常有用。可以用来存储在 ASP Application对象中存储的相同类型的数据,即:
简单变量,例如字符串和数值 (像所有的 A S P脚本变量一样存储为 Va r i a n t )。
Va r i a n t数组,一维或多维。
对一个 C O M对象的实例的变量引用 (如同 Va r i a n t )。
(2) 会话带来的问题会话提供了一个存储每个用户特定的值的方法。然而有几个意想不到的问题要注意:
记住一些浏览器和 We b服务器对 U R L、路径和文件名的大小写形式是敏感的 (例如 N a v i g a t o r
和基于 UN I X/ L i n u x的服务器 )。如果把一个超级链接放置在网页的一个 U R L上,并且它们不是同样的书写形式,则在浏览器中被认为是不相同的。同样,如果路径和文件名的书写形式不是相同的,则浏览器认为是不同的路径或文件。对于在服务器上的定位资源来讲,
这并不重要,因为 I I S对书写形式不敏感,可以接受大写形式和小写形式的任何组合,并返回书写形式不同的具有相同字符的文件。然而,如果一个 c o o k i e已经指定了一个路径,
而且与在超级链接中所指定的路径在书写形式上不同,浏览器可能不会把它以及相应目录的页面一起返回给服务器。这有可能找不到依赖于这个 c o o k i e的一个用户会话,并且
S e s s i o n对象将不会在作用域中 (即其中的任何变量都是不可用的 )。因此,在所有的目录和网页名字中,坚持都采用小写形式或者是比较明显的混合字母形式,是一个好办法。
在 I I S和 A S P的早期版本中,对于嵌套的应用程序还有一些小的,B u g”,有时,当用户离开嵌套的 A S P虚拟应用程序并返回到缺省的 A S P应用程序层时,与嵌套应用程序内部已经定义的局部变量相同名字的任何全局变量不能重新显现。还有,当会话使用
S e s s i o n,A b a n d o n方法 (稍后将会看到 )终止时,g l o b a l,a s p文件中的代码将执行失败。在
ASP 3.0中已经解决了这些问题。
记住会话依赖于 c o o k i e。如果访问者已经禁止使用 c o o k i e或者浏览器不支持 c o o k i e,将不能启动一个会话,并且不能访问 S e s s i o n对象。
(3) 禁止会话虽然状态提供了有益环境,但让用户门户大开。如果不需要保留状态,可以禁止会话以节约计算机的处理时间。例如,在一个不需要跟踪访问者或不需要为访问者保留全局值的
We b网站上,可以防止会话启动,通过在
Internet Services Manager中设置属性,或为不需要状态的独立网页增加代码 (稍后将看到 )。
为了禁止整个 We b网站的所有会话,可编辑缺省 We b网站应用程序的属性。为了禁止一个指定应用程序的会话,可编辑相应虚拟应用程序的属性。打开相应的应用程序的 P r o p e r t i e s
对 话 框,在 Home Directory页 上 单 击
C o n f i g u r a t i o n按钮,如图 3 - 1 0所示。
82计计 ASP 3 高级编程 下载图 3-10 Home Directory页在出现的 C o n f i g u r a t i o n对话框中,打开 App Option。这里可以允许或禁止整个应用程序的会话 (在本例中是整个缺省 We b站点 ),也可以修改缺省的会话 Ti m e o u t值。在图 3 -
11中可以看到 Ti m e o u t设置为 2 0 m i n。在
A S P的早期的版本中这是缺省值,可根据要求设置相应的值 (在 ASP 3.0中,缺省值是 1 0 m i n )。
如果要禁止一个指定网页的会话,同时允许它们在同一个应用程序的其他网页中创建和使用,可为该页面增加一条 A S P
处理指令。它跟在指定缺省语言的语句后
(如果没指定一个缺省语言,可单独使用该指令 ):
到此为止,大致介绍了 A S P应用程序和 S e s s i o n对象的一些情况,下面详细地进行讨论。
3.3 ASP的 A p p l i c a t i o n对象和 S e s s i o n对象本章已经讨论了两个 A S P对象,A p p l i c a t i o n对象和 S e s s i o n对象,因此能够访问 A p p l i c a t i o n
对象和 S e s s i o n对象提供的集合、方法、属性和事件。本节将从程序设计的角度对这两个对象进行研究。
图 3-12 ASP对象关系第 3章 A S P应用程序与会话 计计 83下载图 3 - 11 App Options页客户请求
Server对象服务器
ASPError
对象
Session对象
Application对象
Request对象
R e s p o n s e对象
Session对象
Request对象
R e s p o n s e对象客户请求客户客户服务器响应服务器响应
当载入 ASP DLL并响应对一个 A S P网页的第一个请求时,创建 Application 对象。该对象提供一个存储场所,用来存储对于所有访问者打开的所有网页都可用的变量和对象。
当访问者首次从站点请求一个 A S P页面时,为他创建一个 S e s s i o n对象,并保持有效直到缺省的超时周期 (或由脚本确定的超时周期 )。该对象提供一个存储场所,用来存储仅仅对该访问者在会话的活动期间打开的网页可用的变量和对象。
图 3 - 1 2 (即图 1 - 2 0 )给出了用户的请求和服务器的响应在会话中的分布情况。所有的会话都在 A S P应用程序中。
3.3.1 ASP的 A p p l i c a t i o n对象成员概述本节说明 A p p l i c a t i o n对象的集合、方法和事件 ( A p p l i c a t i o n对象没有属性 )。在下一节对
S e s s i o n对象 (具有属性 )进行同样的说明。然后将继续探讨使用这些对象所完成的任务,更详细地说明每个对象的各成员如何进行工作。
1,Application对象的集合
A p p l i c a t i o n对象提供了两个集合,可以用来访问存储于全局应用程序空间中的变量和对象。集合及说明如表 3 - 3所示。
表 3-3 Application 对象的集合及说明集 合 说 明
C o n t e n t s 没有使用 < O B J E C T >元素定义的存储于 A p p l i c a t i o n对象中的所有变量 (及它们的值 )的一个集合。包括 Va r i a n t数组和 Va r i a n t类型对象实例的引用
S t a t i c O b j e c t s 使用 < O B J E C T >元素定义的存储于 A p p l i c a t i o n对象中的所有变量 (及它们的值 )的一个集合
2,Application对象的方法
A p p l i c a t i o n对象的方法允许删除全局应用程序空间中的值,控制在该空间内对变量的并发访问。方法及说明如表 3 - 4所示。
表 3-4 Application对象的方法及说明方 法 说 明
C o n t e n t s,R e m o v e ( "v a r i a b l e _ n a m e" ) 从 A p p l i c a t i o n,C o n t e n t集合中删除一个名为 v a r i a b l e _ n a m e的变量
C o n t e n t s,R e m o v e A l l ( ) 从 A p p l i c a t i o n,C o n t e n t集合中删除所有变量
L o c k ( ) 锁定 A p p l i c a t i o n对象,使得只有当前的 A S P页面对内容能够进行访问。用于确保通过允许两个用户同时地读取和修改该值的方法而进行的并发操作不会破坏内容
U n l o c k ( ) 解除对在 A p p l i c a t i o n对象上的 A S P网页的锁定注意,在运行期间不能从 A p p l i c a t i o n,S t a t i c O b j e c t s集合中删除变量。
3,Application对象的事件
A p p l i c a t i o n对象提供了在它启动和结束时触发的两个事件,如表 3 - 5所示。
表 3-5 Application对象的事件及说明事 件 说 明
O n S t a r t 当 A S P启动时触发,在用户请求的网页执行之前和任何用户创建 S e s s i o n对象之前。
用于初始化变量、创建对象或运行其他代码
O n E n d 当 A S P应用程序结束时触发。在最后一个用户会话已经结束并且该会话的 O n E n d事件中的所有代码已经执行之后发生。其结束时,应用程序中存在的所有变量被取消
84计计 ASP 3 高级编程 下载
3.3.2 ASP的 S e s s i o n对象成员概述本节概述 S e s s i o n对象的所有成员。
1,Session对象的集合
S e s s i o n对象提供了两个集合,可以用来访问存储于用户的局部会话空间中的变量和对象。
这些集合及说明如表 3 - 6所示。
表 3-6 Session 对象的集合及说明集 合 说 明
C o n t e n t s 存储于这个特定 S e s s i o n对象中的所有变量和其值的一个集合,并且这些变量和值没有使用 < O B J E C T >元素进行定义。包括 Va r i a n t数组和 Va r i a n t类型对象实例的引用
S t a t i c O b j e c t s 通过使用 < O B J E C T >元素定义的、存储于这个 S e s s i o n对象中的所有变量的一个集合
2,Session对象的特性
S e s s i o n对象提供了四个属性。这些属性及说明如表 3 - 7所示。
表 3-7 Session 对象的属性及说明属 性 说 明
C o d e P a g e 读 /写。整型。定义用于在浏览器中显示页内容的代码页 (Code Page)。代码页是字符集的数字值,不同的语言和场所可能使用不同的代码页。例如,A N S I代码页 1 2 5 2用于美国英语和大多数欧洲语言。代码页 9 3 2用于日文字
L C I D 读 /写。整型。定义发送给浏览器的页面地区标识 ( L C I D )。 L C I D是唯一地标识地区的一个国际标准缩写,例如,2 0 5 7定义当前地区的货币符号是 '£ '。 L C I D也可用于
F o r m a t C u r r e n c y等语句中,只要其中有一个可选的 L C I D参数。 L C I D也可在 A S P处理指令
< %,,,% >中设置,并优先于会话的 L C I D属性中的设置。本章后面提供一个 A S P处理指令的列表
S e s s i o n I D 只读。长整型。返回这个会话的会话标识符,创建会话时,该标识符由服务器产生。
只在父 A p p l i c a t i o n对象的生存期内是唯一的,因此当一个新的应用程序启动时可重新使用
Ti m e o u t 读 /写。整型。为这个会话定义以分钟为单位的超时周期。如果用户在超时周期内没有进行刷新或请求一个网页,该会话结束。在各网页中根据需要可以修改。缺省值是
1 0 m i n,在使用率高的站点上该时间应更短
3,Session对象的方法
S e s s i o n对象允许从用户级的会话空间删除指定值,并根据需要终止会话。 S e s s i o n对象的方法及说明如表 3 - 8所示。
表 3-8 Session对象的方法及说明方 法 说 明
C o n t e n t s,R e m o v e ( "v a r i a b l e _ n a m e" ) 从 S e s s i o n,C o n t e n t集合中删除一个名为 v a r i a b l e _ n a m e的变量
C o n t e n t s,R e m o v e A l l ( ) 从 S e s s i o n,C o n t e n t集合中删除所有变量
A b a n d o n ( ) 当网页的执行完成时,结束当前用户会话并撤消当前 S e s s i o n对象。
但即使在调用该方法以后,仍可访问该页中的当前会话的变量。当用户请求下一个页面时将启动一个新的会话,并建立一个新的 S e s s i o n对象 (如果存在的话 )
注意,在运行期间不能从 S e s s i o n,S t a t i c O b j e c t s集合中删除变量。
第 3章 A S P应用程序与会话 计计 85下载
4,Session对象的事件
S e s s i o n对象提供了在启动和结束时触发的两个事件,如表 3 - 9所示。
表 3-9 Session 对象的事件及说明事 件 说 明
O n S t a r t 当 A S P用户会话启动时触发,在用户请求的网页执行之前。用于初始化变量、创建对象或运行其他代码
O n E n d 当 A S P用户会话结束时触发。从用户对应用程序的最后一个页面请求开始,如果已经超出预定的会话超时周期则触发该事件。当会话结束时,取消该会话中的所有变量。在代码中使用 A b a n d o n方法结束 A S P用户会话时,也触发该事件
3.3.3 使用 Application 和 S e s s i o n的事件
A S P的 A p p l i c a t i o n和 S e s s i o n对象体现了其他 A S P内置对象所没有的特征 — 事件。然而,
正像在前面的对象成员表中看到的那样,这些都是与 A S P会话和应用程序的工作相联系的事件。
1,Application 和 S e s s i o n的事件处理器每当一个应用程序或会话启动或结束时,A S P触发一个事件。可以通过在一个特殊的文件中编写普通的脚本代码来检测和应答这些事件,这个文件名为 g l o b a l,a s a,位于一个应用程序的根目录中 (对于缺省的 We b网站是 \ I n e r P u b \ W W W R o o t目录,或是作为一个实际应用程序定义的一个文件夹 )。这个文件可以包含一个或多个 H T M L的 < O B J E C T >元素,用于创建将在该应用程序或用户会话内使用的组件实例。
在第 4章中将详细地介绍如何创建组件实例。下面的代码是 g l o b a l,a s a文件的一个例子。我们只关注 < O B J E C T >元素以及以 S e t关键字开始的那些代码行:
86计计 ASP 3 高级编程 下载因为这个 g l o b a l,a s a文件用于本章中的示例页面,所以将需要将该文件放到 We b
网站的根目录中,或者放到已配置为一个虚拟应用程序的目录中,并且在该目录中包含有其他示例文件。
读取和存储值注意上面的例子怎样读取和存储 A p p l i c a t i o n和 S e s s i o n的变量,与在 R e q u e s t和 R e s p o n s e对象的集合中所采取的方式相同。设置这些变量的值:
获取这些变量的值:
当然,对于 S e s s i o n对象可采取同样的方法。
可以看到,当从一个 S e s s i o n事件处理器访问时,怎样“锁定” ( L o c k )和“解锁” ( U n l o c k )
该 A p p l i c a t i o n对象;当从一个 A S P网页访问时,需要进行相同的处理。用 A p p l i c a t i o n事件内的代码访问 A p p l i c a t i o n对象中的值时,不要求这么做。这是因为在任何应用程序中只有一个
A p p l i c a t i o n对象的实例,并且其事件处理器的代码只在没有活动的用户会话时运行。
也可看到一个基本的用户会话计数器是如何实现的。这里使用一个应用程序级的变量
Vi s i t _ c o u n t,当新的会话启动时它就自动增加。
一般也不限制简单地把值保存到 A p p l i c a t i o n或 S e s s i o n对象中。例如,We b开发者的 We b站点在 h t t p / /,w e b d e v,w r o x,c o,u k上,有相应的一个 g l o b a l,a s a文件,当一个新的会话启动时该文件就在服务器上的数据库中写入相应的条目,数据细节从 R e q u e s t,S e r v e r Va r i a b l e s集合中获取。
这提供了一个基本的方法统计访问者的数量,并收集访问者的一些基本信息。
第 3章 A S P应用程序与会话 计计 87下载
2,创建 Va r i a n t数组在 S e s s i o n和 A p p l i c a t i o n对象中创建和使用一个 Va r i a n t数组来存储值的方法目前尚未讨论,
在这里作为一个非常有用的技术进行讨论。正如已经看到的那样,一个 Va r i a n t数据类型可以包含一个数组,而不仅仅是一个值。
一个数组只是在内存的一个连续区域中以指定的次序存储二进制值的一个长行。
要安排 Va r i a n t,需要指向首项,并给出有关大小和结构的信息,脚本引擎可以做余下的事情。
可在一个 Va r i a n t变量中创建一维、二维或多维数组,然后把该数组分配给一个应用程序层或用户会话层的变量,并保证整个数组可在相应的地方使用。下面代码演示了一个简单的一维数组的使用技术:
3,应用程序和会话在何时启动和结束在介绍 A S P应用程序和会话如何进行工作时提到过这个内容。以最基本的术语概述如下:
当第一个用户请求应用程序作用域内 (即 We b网站的缺省根目录内 ),或者在该网站的一个子目录内的一个用户定义的虚拟应用程序的一个 A S P网页时,启动该应用程序。在任何用户会话启动之前发生。
当任意用户第一次请求在缺省应用程序或一个虚拟应用程序内的一个 A S P网页时,启动一个会话 (如果还没一个活动的会话 )。
当用户在会话指定的超时周期内没有下载一个 A S P网页时,会话结束。超时时间可以在脚本代码中使用 S e s s i o n,Ti m e o u t属性进行设置,可在 P r o p e r t i e s对话框中对各个应用程序单独设置,或者通过 Active Directory的 I I S:部分修改 I I S元数据库中的缺省值进行设置。
调用 S e s s i o n,A b a n d o n方法的一个网页完成执行以后,会话也会结束。
在一个应用程序中的最后一个活动会话结束以后,该应用程序立即结束。
4,ASP处理指令正如在第 1章中所看到的,可以把一条处理指令增加到一个 A S P网页。处理指令可以根据需要包含一个以上的条目。可以在语句中使用的关键字及其说明如表 3 - 1 0所示。
表 3-10 ASP指令关键字及说明指令关键字 说 明
L A N G U A G E = "l a n g u a g e _ n a m e" 设置该网页的缺省的脚本语言,如,<%@ LANGUA G E
="VBScript" %>
E N A B L E S E S S I O N S TAT E = " Tr u e " | " F a s l e " 当设置为,Tr u e”时,防止一个会话的 c o o k i e发送到浏览器,
因此将不会创建新的 S e s s i o n对象,任何现有会话的内容将不再可用
C O D E PA G E = "c o d e _ p a g e" 设置该网页的代码页,如 < % @ C O D E PA G E = " 1 2 5 2 " % >
L C I D = " l o c a l e _ i d e n t i f i e r " 设置该网页的位置标识符,如 < % @ L C I D = " 2 0 5 7 " % >
T R A N S A C T I O N = " t r a n s a c t i o n _ t y p e " 指明该网页文件将在一个事务环境下运行。有效值是:
,R e q u i r e d”,如果已有可用的事务,脚本将在其中运行;如果没有可用的事务,启动一个新的事务。
88计计 ASP 3 高级编程 下载
(续 )
指令关键字 说 明
,R e q u i r e s _ N e w”,脚本将初始化一个新的事务。
,S u p p o r t e d”,如果已有可用的事务,脚本将在其中运行;而且不启动一个新的事务。
,Not_ Supported”,脚本将不运行于任何已有的事务中,
并且不初始化一个新的事务。
在第 1 8章中详细介绍事务。
在一个网页上只能允许有一条处理指令,并且应该放在第一行。在处理指令中可以包含不止一个这样的条目,但必须用空格进行分隔,等号两端不能有空格,例如:
3.3.4 活动中的 ASP Application对象我们提供一些简单的网页,这些网页示范了使用过程中的 ASP Application和 S e s s i o n对象。
为了能够正常使用,必须把它们放到服务器上的一个虚拟应用程序内,并且把所提供的
g l o b a l,a s a文件放到该应用程序的根目录中。最简单的办法是把 g l o b a l,a s a文件放到缺省 We b网站的根目录 (缺省情况下是 C,/ I n e t P u b / W W W R o o t )中。
对任何已有的 g l o b a l,a s a文件重命名是一个好方法,可以在以后对该文件进行恢复。
本书的所有例子文件都可以从我们的 We b网站上得到,在例子的 C h a p t e r 0 3子目录中还有本章的所有其余示例网页。
在 C h a p t e r 0 3子目录中,D e f a u l t,a s p网页是一个简单的菜单,该菜单允许运行 A p p l i c a t i o n
和 S e s s i o n示例网页,运行屏幕如图 3 - 1 3所示。
图 3-13 Default.asp运行屏幕
1,显示 A p p l i c a t i o n集合的内容单击第一个链接,打开名为 s h o w _ a p p l i c a t i o n,a s p
的 A p p l i c a t i o n对象示例页面。它显示了虚拟应用程序当前的 A p p l i c a t i o n对象的内容,如图 3 - 1 4所示。
注意到 A S P C o u n t e r对象是 S t a t i c O b j e c t s集合的一个成员 (通过 < O B J E C T >元素进行定义 ),但是其余部分
(由 S e r v e r,C r e a t e O b j e c t实例化 )是 C o n t e n t s集合的成员。
第 3章 A S P应用程序与会话 计计 89下载图 3-14 Application对象的内容屏幕可以看到使用 g l o b a l,a s a例子网页放到这些集合中的值,这在前面已经看到:
(1) 遍历 C o n t e n t s集合的代码为了遍历 C o n t e n t s集合,可使用一个 For Each,.,N e x t结构。集合中的每一项可以是一个简单的 Va r i a n t类型变量、一个 Va r i a n t数组或者一个对象的引用。因为需要对每种类型的值进行不同的处理,所以就不得不对每一个进行检查来判别其类型。
在 V B S c r i p t中可使用 Va r Ty p e函数完成这个工作。这里使用 I s O b j e c t和 I s A r r a y函数代替:
注意程序如何从 A p p l i c a t i o n对象检索该数组。将其分配给一个局部 ( Va r i a n t )变量,使用下面的语句:
使用 U B o u n d函数可以查找出数组的大小 (元素的数量 ),这个值可以作为遍历的终止条件:
90计计 ASP 3 高级编程 下载这个例子是一维数组,并将只显示这样的一个数组的内容。可根据需要编辑代码以处理多维数组,例如:
(2) 遍历 S t a t i c O b j e c t s集合的代码
S t a t i c O b j e c t s集合包含了所有在 g l o b a l,a s a中使用 < O B J E C T >元素声明的对象引用。因为每个条目都是一个对象变量,可用简单些的代码对这个数组进行遍历。我们将输出对象的名字
(在 I D属性中原有的定义 ):
2,增加值到 C o n t e n t s集合增加值到 C o n t e n t s集合的方法,与在
g l o b a l,a s a网页的脚本代码中使用过的方法相同。示例网页允许把一个新的 Va r i a n t值增加到 A p p l i c a t i o n对象中,并已有建议的名字和值 (可根据需要进行编辑 ),如图 3 - 1 5所示。
单击按钮,重新载入这个网页,把值增加到 A p p l i c a t i o n,C o n t e n t s集合中,并且在列表中显示,如图 3 - 1 6所示。
增加新的 C o n t e n t s条目的代码所有的按钮和其他 H T M L控件放置在示例网页中的一个窗体上。 A C T I O N设置了当前网页的路径,提交该窗体时,重新装入。
M E T H O D属性为,P O S T”,所以控件中的值出现在 R e q u e s t,F o r m集合中。在以前的章节中采用过这两种技术:
该窗体上的按钮都是普通的 H T M L I N P U T控件,具有相同的标题 (三个空格 )但名字不同。
例如,创建第一个按钮 (把值增加到 A p p l i c a t i o n对象中 )的代码是:
重新载入该网页时,检查 R e q u e s t,F o r m集合,判定单击的是哪个 S U B M I T按钮,并进行相第 3章 A S P应用程序与会话 计计 91下载图 3-15 增加值到 C o n t e n t s集合的屏幕图 3-16 显示 C o n t e n t s集合内容的屏幕应的处理。如果是增加一个值到 A p p l i c a t i o n对象的按钮 (该按钮在 H T M L的 < I N P U T >元素中被命名为 c m d A d d ),使用下面的程序段:
注意程序如何使用 A p p l i c a t i o n,L o c k和 A p p l i c a t i o n,U n l o c k方法,确保这些值不会因两个用户并发地访问而产生混乱。如果只是对一个特定的值进行设置,一般不可能发生这种情况。
但一直使用 L o c k和 U n l o c k方法是明智的。
3,从 C o n t e n t s集合中删除值在例子网页的底部有两个按钮,如图 3 - 1 7所示。这两个按钮允许从 A p p l i c a t i o n,C o n t e n t s集合中删除值。第一个按钮从集合中删除单个的指定值,下拉列表框显示的是 C o n t e n t s集合 值 的 名 字 的 列 表 ( 记 住,不 能 从
S t a t i c O b j e c t s集合中删除值,因为它们是静态的 )。
通过遍历 C o n t e n t s集合 (如前面我们所做的 )执行 A S P网页时,创建该列表。但是,我们仅收集每项的名字并把它们放到 < S E L E C T >列表元素内的 < O P T I O N >元素中:
该 A S P代码执行以后,在浏览器中看到的结果是:
(1) 删除单个的值当单击按钮删除单个值时,该窗体再次提交给相同的网页,但是这一次将查找名为
c m d R e m o v e T h i s的 S U B M I T按钮。如果存在 (即单击了这个按钮 ),则使用列表框的值,调用
A p p l i c a t i o n,C o n t e n t s集合的 R e m o v e方法:
92计计 ASP 3 高级编程 下载图 3-17 显示在网页底部的两个按钮注意这是 C o n t e n t s集合的一个方法,而不是 A p p l i c a t i o n对象的。语法是
A p p l i c a t i o n,C o n t e n t s,R e m o v e,而不是 A p p l i c a t i o n,R e m o v e。
从 C o n t e n t s集合中删除 S t a r t _ Ti m e值的结果如图 3 - 1 8所示。
(2) 删除所有的值如果单击三个 S U B M I T类型按钮中的最后一个
(如图 3 - 1 8所示 ),该网页中的代码将检测到单击的按钮为 c m d R e m o v e A l l,将执行 A p p l i c a t i o n,C o n t e n t s
集合的 R e m o v e A l l方法:
再次提醒,这是 C o n t e n t s集合的一个方法,而 不 是 A p p l i c a t i o n 。 语 法 是
A p p l i c a t i o n,C o n t e n t s,R e m o v e A l l,而不是
A p p l i c a t i o n,R e m o v e A l l。
图 3 - 1 9所示的是从 C o n t e n t s集合中删除所有值的结果 (记住在运行时间不能从 S t a t i c O b j e c t s集合删除项 )。
图 3-19 删除 C o n t e n t集合中所有值的屏幕
3.3.5 活动中的 ASP Session对象示例网页的第二个示例页面 s h o w _ s e s s i o n,a s p,示范了如何使用 S e s s i o n对象。可在
C h a p t e r 0 3子目录中的开始菜单页面 ( D e f a u l t,a s p )中打开它。
第 3章 A S P应用程序与会话 计计 93下载图 3-18 删除 S t a r t _ Ti m e值后的屏幕
1,显示和更新 S e s s i o n集合
S e s s i o n对象示例页面看起来与刚刚使用过的 A p p l i c a t i o n对象示例页面相似。它遍历
S e s s i o n对象的 C o n t e n t s和 S t a t i c O b j e c t s集合,显示其名字和 (可能的话 )相应的值。如果把这些值与 A p p l i c a t i o n对象页面进行比较,将会看到不同之处。
这里还能够看到客户端 I P地址的一些其他值。这是当会话启动时 g l o b a l,a s a中的代码从
R e q u e s t,S e r v e r Va r i a b l e s集合中得到的。这个页面还显示四个会话属性的值,如图 3 - 2 0所示。
图 3-20 Session对象显示属性的屏幕下面是例子中使用的 g l o b a l,a s a文件的相关段落,它把缺省值增加到图 3 - 2 0所示的屏幕上所看到的会话中:
94计计 ASP 3 高级编程 下载遍历 C o n t e n t s和 S t a t i c O b j e c t s集合的代码与前面在 A p p l i c a t i o n对象示例网页中使用的代码一 样,只 不 过 这 里 引 用 了 S e s s i o n,C o n t e n t s和 Session,StaticObjects集 合,而 不 是
A p p l i c a t i o n,C o n t e n t s和 Application,StaticObjects集合。
靠近页面底部的按钮的功能是把值增加到 S e s s i o n,C o n t e n t s集合和从 S e s s i o n,C o n t e n t s集合删除值。这些按钮与在 A p p l i c a t i o n对象示例页面中相应的按钮工作方式相同,这里访问的是
S e s s i o n,C o n t e n t s集合,以及相应的 R e m o v e和 R e m o v e A l l方法。我们不再重复解释。
2,终止一个用户会话在 S e s s i o n对象页面的底部有一个按钮,该按钮终止当前的用户会话,这通过调用 S e s s i o n
对象的 A b a n d o n方法实现。它与其余的 H T M L控件在相同的窗体上,名为 c m d A b a n d o n。当该窗体再次被提交给这个网页时,在 R e q u e s t,F o r m集合中查找这个值 (如同在 A p p l i c a t i o n对象例子中做的一样 )。如发现这个值,则将该用户重定向到另一个网页:
新的页面名为 a b a n d o n,a s p,十分简单,除了创建消息的文本和 H T M L以外只有如下的代码:
该网页的其余部分只是一个包含单个 S U B M I T按钮的窗体。注意如何使用来自
R e q u e s t,S e r v e r Va r i a b l e s集合的引用网页 ( H T T P _ R E F E R E R )的 U R L的值,以确保重新载入前一个网页 ( S e s s i o n对象例子网页 ):
第 3章 A S P应用程序与会话 计计 95下载结果如图 3 - 2 1所示。这时,当前的用户会话已经被终止 (放弃 ),并且该用户不能引用原先的 S e s s i o n集合或属性的内容。
图 3-21 终止一个用户会话后的屏幕然而,记住这一切是在调用 A b a n d o n方法的网页已经执行完毕后发生的。调用 A b a n d o n
方法的网页执行时,甚至在对该方法的调用已经完成以后,仍能够从 S e s s i o n对象中获得用户的会话内容。当此网页结束时,会话才结束。
当然,当返回到显示会话内容的 S e s s i o n对象示例网页时,将启动一个新的 A S P会话。它将有一个不同的 S t a r t _ Ti m e值和通过执行 g l o b a l,a s a中的代码创建的其他缺省的会话值,如图 3 -
2 2所示。
注意,S e s s i o n,S e s s i o n I D属性值没有改变。 A S P试图重新分配相同的会话 I D,因此不能依靠该值来判定一个新的会话已经启动。
3.4 小结本章介绍了两个 A S P内置对象,A p p l i c a t i o n和 S e s s i o n对象。这些对象引入了 A S P的应用程序和用户会话的概念 (两者都是特定的术语,并且不是通常谈话时的意义 )。 A S P应用程序允许分配专门的属性给页面集,定义了 I I S和 A S P如何管理这些网页及所使用的其他组件。
然而,使用 A S P应用程序和会话的主要原因是需要自动地获得状态。换句话说,存储信息和变量引用的能力,要么对用户装载的所有网页是全局和可用的 (即在一个应用程序中 ),
要么仅仅对一个指定的用户的所有网页是可用的 (在一个会话中 )。这使建立 We b应用程序变得非常简单 (即应用程序在 We b上工作,但能够像传统的编译的应用程序一样能完成指定的任务 )。
本章通过一些示例页面,详细介绍如何使用 ASP 的 A p p l i c a t i o n和 S e s s i o n对象。这些页面示范了这两个对象可用的所有技术。
96计计 ASP 3 高级编程 下载图 3-22 重新建立一个用户会话后的屏幕本章的内容为:
We b应用程序是什么,以及它们如何与 ASP Application对象相联系。
用户会话是什么,以及它们如何与 A S P S e s s i o n对象相联系。
ASP如何自动地创建和管理应用程序和会话。
Application和 S e s s i o n对象提供的功能。
如何把 A p p l i c a t i o n和 S e s s i o n对象放入 A S P网页中。
下一章研究另一个 A S P内置对象,S e r v e r对象,你将会发现 ASP 3.0的许多令人兴奋的新特性。
第 3章 A S P应用程序与会话 计计 97下载