China°be 第3章ASP应用程序与会话 在前面的章节中介绍了ASP提供的访问一个客户请求和产生响应的方法,本章将讨论ASP 的另两个对象。就是 Application和 Session对象。这两个对象不是直接地与请求和响应的管理 有关,而是更多地与ASP网页运行环境的管理相关 与建立Web站点或Web应用程序有关的共同问题之一,是使用HTTP协议时没有状态。状 态提供了与一个指定用户有关的变量值、对象和其他资源,并且应用程序中的任意例程都能 使用它:以一种像VB或C++这样的程序设计语言编写一般的基于客户的应用程序时,使用状 态可以完成一些相应的工作。然而,web并不提供这种能力。在本章中,读者将看到为什么 和如何避免这个问题 本章还涉及到一些术语和技术问题。它迄今为止,本书中已经简单地讨论了“Web应用 程序”,但没有真正确切地理解或准确定义它们到底是什么。本书也涉及到了“用户会话”, 也没有相应的比较完全的描述。前面有意地省略这方面的内容,因为它们与ASP的应用程序 和会话密切相关。下面将介绍ASP的 Application和 Session对象 本章研究的主要内容: Web应用程序是什么,以及它们如何与 ASP Application对象相联系。 用户会话是什么,以及它们如何与 ASP Session对象相联系 ·ASP如何自动地创建和管理应用程序和会话 Application和 Session对象提供的功能 如何把 Application和 Session对象放入ASP网页中 首先研究整个内容的核心问题:状态。 3.1Web上的状态管理 许多开发人员把应用程序传送到Web之前从来没有考虑状态的概念。正如前面说过的 web是一个无状态的环境。因此应该探讨一下状态是什么,了解能够避免产生问题的方法 3.1.1状态的准确定义 在单用户程序中,创建一个可执行的应用程序时,例如使用VB建立的一个,exe文件,可 以声明一个全局(或 Public)变量,然后在代码中任何地方可对其进行访问。在应用程序运行的 所有时刻,该变量的值一直是有效,并且是可访问的 对于一个传统的客户机/服务器解决方案,例如一个基于客户机的应用程序对一个基于服 务器的数据库引擎进行访问的系统,每个客户端建立了一个与服务器和数据库应用程序的连 接。这种连接通常是通过验证用户的方法来建立的。 验证过程是典型的识别用户身份的过程,通过一个用户名和口令组合来证明是 否为合法的用户
下载 第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 )变量,然后在代码中任何地方可对其进行访问。在应用程序运行的 所有时刻,该变量的值一直是有效,并且是可访问的。 对于一个传统的客户机 /服务器解决方案,例如一个基于客户机的应用程序对一个基于服 务器的数据库引擎进行访问的系统,每个客户端建立了一个与服务器和数据库应用程序的连 接。这种连接通常是通过验证用户的方法来建立的。 验证过程是典型的识别用户身份的过程,通过一个用户名和口令组合来证明是 否为合法的用户
第3章ASP应用程序与会话71 旦通过验证,在客户端和基于服务器的应用程序之间就建立了连接,该连接在用户使 用该应用程序的所有时间内一直保持有效。当用户注册到本地 Windows2000服务器上时,这 切便会发生。无论何时,管理员使用“ Active Directory Users and Computers”实用程序(单 击“ Start”菜单的“ Administrative Tools”选项中的“ Directory Management”项)都可以观察 到活动的用户连接。这个过程在许多系统中都相同,例如 Microsoft SQL Server 这种永久的连接意味着:当用户发送指令或请求到服务器上时,服务器会很容易地识别 每个用户。同样服务器的响应或任何其他用户的信息也能直接返回用户。要进一步指出的是 服务器可以比较容易地存储与每个客户相关的值和信息,并在需要的时候提供给相应的客户。 当然,服务器应用程序能够拥有主全局变量,以便于用户在需要的时候进行访问 这种识别每个客户端的请求并在内存中保存相关用户的值的能力构成状态。可以认为状 态代表应用程序的值、环境以及用户的内部变量,并贯穿于应用程序和用户连接的整个过程 3.1.2状态的重要性 如果打算创建与用户进行交互的基于Web站点的应用程序,而不是仅显示独立页面的Web 网站,必须能够为每个用户提供独立的状态。这可能只是记住他们的名字,也可能要为每个 用户存储对象引用或不同的记录集。如果不能这样做,ASP网页就不能做更多的事情,因为 该页面执行完成时,页面中的变量和其他相关资料都破坏了。当用户请求下一个页面时,这 个页面提供的所有信息将全部失去 因此,需要找到一种方法,保存每个访问者的状态。能够存储对所有用户而言的全局 是非常重要。例如,一个Web风格的访问或页面点击计数器,它不为每个用户提供自己的计 数器,用户们通常想要看到访问者的总数,而不仅仅是他们自己访问的次数。访问者的数目 需要与应用程序级状态一起存储,而不是与用户级状态一起存储 这不是一个刚出现的问题,自从商用站点占据了Web,就已经存在,甚至更早些。所以 已有许多在web上存储状态的传统的解决方案。Web站点管理员想要了解访问者以前是否曾访 问过他们的网站,如果访问过,访问过多少次?是否经常访问?还定期访问其他什么网站等 样可以更好地制定其广告目标。所有这些都要求一种方法来存储有关用户在访问时所产生 的网页请求或每次访问间的信息。 3.13在Web上创建状态 在页面请求和站点访问之间提供状态常用的方法是通过 cookie。我们在前面的章节中已经 看到,如何在客户端的计算机中存放相应的值,这些值与每个页面请求一起发送给对此 cookie 有效的域。通过用ASP检查和更新 cookie,在某种程度上能够保持一个状态。可以使用所包含 的信息来识别用户,然后把用户连接到一个已存储相应值的集合 例如,可以检测一个用户请求是否包含一个站点指定的 如果不包含,则为该用户 配一个某种类型的标识,指明一个数量,并存储在带有一个长有效期的 cookie中。以后该用 户对这个站点的每一次访问,都能够检测到 cookie并更新所包含的信息。同时可以收集有关访 问的次数和持续时间的数据,并存储在服务器上,以备将来使用 但是,如果用户转移到另一个计算机,或删除了 cookie,或者他们的浏览器拒绝接收发送 给他们的 cookie,会发生什么事情呢?在这种情况下,不能维持状态,因为下一次不能识别他
一旦通过验证,在客户端和基于服务器的应用程序之间就建立了连接,该连接在用户使 用该应用程序的所有时间内一直保持有效。当用户注册到本地 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 下载
ASP3高级编程 China.pub. coM 们现在,Web上有许多 cookie,大多数人会接受它们,而不加理会。如果打开浏览器中的 Warn before accepting cookies”选项,接着漫游几个大的站点,你就会明白其中的含意。 1.匿名访问者与授权的访问者 如果认为 cookie是一个有点草率的解决方案,可以使用更直接的方法。许多站点采用的 种方法是,在访问者点击一个站点时,或者点击一个要求验证身份的页面时,弹出一个进行 登录的对话框。访问者首先必须进行注册,获得一个某种类型的用户名/口令的组合,才能允 许访问相应的站点或页面 为了证实访问者是一个已知的并且合法的用户,在访问者的计算机上放置的一个 cookie, 它或者保存注册的详细数据,或者是一把表明已验证过身份的“钥匙(key)”。同时,访问者的 详细数据永久地保存在服务器上,准备再次访问时使用。如果访问者的浏览器中有了这样一 个 cookie,他就可以自由地访问该网站,因为已经验证过了 如果 cookie没有有效期限( Expires), cookie的值在关闭浏览器时自动消失,在下一次访问 时必须重新登册和再次验证。当然,如果拒绝接收 cookie或删除了 cookie,就只能再次得到登 册对话框。这样的话,如果不被识别,就不能访问该站点。 通过强制用户就像登册到自己的网络一样登册到Web服务器, Windows2000整 体安全性能为IS提供更强和更安全的验证功能。但是,这只能与 Internet Explorer 3.0和之上版本的浏览器一起工作。IS也可以使用 BASIC验证允许非 Micros浏览器 注册Web服务器 2.不再有匿名访问者 在 IIS Web服务器上使用ASP时,除非用户离开该站点到另一个网站或者关闭了浏览器 否则能在当前会话中跟踪用户。在本章的后面,将看到如何使用这个功能来标识一个访问者、 存储用户的本地信息和提供状态。下面与已经讨论过的解决方案相比较,讨论其工作方式。 ASP和IS共同提出了一个用户会话的概念,通过 ASP Session对象进行交互。在每个访问 者第一次访问服务器上的一个ASP网页时,为他创建一个新的并且独立的会话对象,分配给 该会话一个会话标识号,并把包含会话标识符的特殊加密版本的一个 cookie发送给客户 cookie的路径(参看前面的章节有关 cookie属性的描述)设置为运行在服务器上的ASP应用 程序的根路径。这很可能是缺省的Web网站的根目录(即“/”),但也可能会是另外一个值(稍 后会看到)。在 cookie中没有提供 Expires值,所以当浏览器关闭时, cookie值也就消失。 每当这个用户访问这个ASP网页,ASP都会查找这个 cookie命名为 ASPSESSIONIDxxxrx, 其中每个x是一个字母字符。从第2章图2-7所示的Servervariables集合,能够在HTTP报头中看 到它。这里高亮地显示 ASP cookie,如图3-1所示 The Request. ServerVariables Collection Servervariables Examples Ll_Http=Http_AccEpt: application/msword, application/vnd. ms-excel, application/nd. ms-powe age/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/-comet"/http-accept_lan gb Http_conNeCtion: Keep-alive hTtp-hOst: wroxbox HttP_rEfErer:htTp: //wroxbox/testrequest/request form. asp AstDatE=6%2F4%2f99+10%3a10% la/4.0(compatible Msie5.0;Windows98)http_cooKie:Visitcount=vistts=3al 3A13+AM; TimedCookie=TimedExample: ASoS 图3-1显示的 cookie
们现在, 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 高级编程 下载
第3章ASP应用程序与会话 73 下载 但是,这个 cookie不会出现在 Request. Cookies或 Response. Cookies集合中,ASP把它隐藏 起来,但仍保存在浏览器上。对于每个ASP网页的请求,ASP都要查看该值。这个 cookie包含 的值,指明了这个用户的会话。因此,相应的 Session对象(该对象在内存中已被处理,并且一 直包含所有在前一页面请求过程中进行操作的值)的内容可以移交给ASP网页中的脚本。 当然,如前所述,如果客户浏览器不接收或不支持这些 cookie,这个处理将失败。在这种 情况下,不能创建ASP会话,对这个访问者的状态也不进行自动维护 32Web应用程序的定义 前面的章节中已经多次使用过Web应用程序( Web Application)术语,所指的既不是一个真 正意义上的Web网站,又不是一个传统的应用程序。换句话说,而是认为它是一些Web网页和 用来完成某些任务的其他资源的一个集合。它隐含这样一层意思:有一个预定义的路线贯穿 于网页之中,用户可做出选择或提供信息使任务能够完成。 例如,一个在线商店,你为了购买货物,进行反复的观察和选择,浏览一系列网页,收 集所需要的信息,支付相应的费用,最后发出定单。也可能是一个“软件升级向导”,指导用 户完成下载和安装新软件的过程,或者可能是一个基于 Intranet的报价单或销售报告的生成工 具 所有这些不同于“标准”的Web网站,一般的Web站点使用一系列菜单或导航栏以预先未 定义的路径漫游该站点。但是一个Web应用程序远不只是受控制的导航器。自由地漫游于 个Web网站时,可以进行无状态的和匿名的访问,但Web应用程序一般不接受 321ASP应用程序的定义 上述内容可以认为是术语“web应用程序”的一个合理的一般定义,但遗憾的是,在谈 论有关“ASP应用”时,仅这些还不够。回答什么是“Web应用”可以是主观的,而回答什 是“ASP应用”则需要从技术上的解释。在ASP中术语“应用程序”有自己特定的含义,在讨 论如何实现之前,弄懂这个概念至关重要。 ASP应用程序与两个主要的内容有关 ·全局范围的规定,具有一个全局可访问的变量存储区域 通过COM+与∏S的集成,可更好地管理组件 下面讨论这些内容。第二个内容涉及到其他ASP对象,其覆盖范围相当广泛。在下一章 研究 ASP Server对象时,将对这部分内容进行详细地讨论 提供Web应用程序的全局范围 ASP提供一个 Application对象,基本上与前面讨论的 Session对象相当。但是,这是在应 用程序层而不是在用户层。换句话说,该对象是全局的,不是对单独用户的,而是对应用程 序的所有用户,其作用域不限制为单独用户的访问。这与在一个正常的可执行应用程序中的 全局(或 Public)变量相同。 Application对象可用于在全局环境中存储变量和信息(即状态),该 应用程序内的任何ASP网页中运行的脚本都可访问这些值,而不管是哪个访问者发出的请求 但是,这没有回答主要问题:什么是一个ASP应用程序?为此,需要研究ASP内部的一 情况。 当用户请求一个ASP网页时,IS通过实例化asp.d(用来实现ASP)创建一个环境(如第1章
但是,这个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 下载
74sp3高编程 Chinapub.com 下 所述)。将该页面解释为服务器端脚本,相应的脚本引擎的实例用来执行该脚本。 实例化的aspd初始事件启动一个ASP应用程序,创建一个 Application对象。然后,为这 个用户启动一个会话,并创建单独的 Session对象。当更多的会话启动时,这个 Application对 象保留在作用域中(即已经实例化和可用)。一旦最后保持活动的会话结束,该应用程序就结束, 并取消相应的 Application对象。因此,当站点上还有活动会话时,将会有一个单独的 Application对象提供给所有用户使用。 (1)缺省的ASP应用 Windows2000在安装IS和ASP时,创建了一个缺省的Web站点。它被配置成一个ASP应 用程序,涉及到在 Properties对话框中针对站点根目录文件夹(缺省为C: \netpublWWWRoot) 的一些设置。图3-2所示是缺省Web站点的 Properties对话框的屏幕 A schon ta aHAL 厂L0mt reBorN chenry 图3-2缺省Web网站的 Properties对话框 涉及到ASP应用程序的文件之一是 global asa。这个文件用于定制应用程序行为的方式 放置在应用程序的根目录下,可用于该目录下的所有子目录。因此,如果它放置在整个web 站点的根目录下,则定义整个网站作为缺省的ASP应用程序的一部分 在本章后面有关应用程序和会话事件的部分中,将看到这个文件及其使用方法。 (2)ASP虚拟应用程序 如同在设置过程中创建缺省的应用程序一样,可以在该Web网站的任何子目录中创建属 于自己的ASP虚拟应用程序。这个应用程序包含作为“应用程序目录”而定义的目录中所有 的子目录。并且,这个目录和子文件夹也都是缺省应用程序的一部分,共享由缺省的 Application对象创建的全局空间 事实上,在缺省的应用程序中存储的所有变量在子目录中的应用程序中也都是可用的。 然而,如果该子目录应用程序中的一个ASP网页把一个值写入 Application对象,而 Application 对象与缺省(根)应用程序中已存在的一个值有相同的名字,那么,原先的值在子目录应用程序
所述)。将该页面解释为服务器端脚本,相应的脚本引擎的实例用来执行该脚本。 实例化的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 高级编程 下载
Ch°N 第3章A5P应用程序与会活75 中就不能再用。但是在其他的应用程序或ASP网页中,将保留原有的值,因为根目录的应用 程序不能访问子目录应用中的值。 从一个子程序或函数的变量的角度考虑这个问题。如果定义一个变量 intMy value为 Public 或全局的变量,可以从任何的子程序或函数内部访问该变量。但是,如果又声明一个具有相 同名字的局部变量,并在该子程序或函数内对该变量进行引用,则得到此变量的局部值。不 能再访问原先的值。当子程序或函数结束,局部值被撤消,全局变量原有的值仍然保留着: Public intMyvalue 42 Function DoSomething() Response. Write intMyvalue ⊥veB42£zomg1oba1 varian1e Dim intMyvalue ntMyvalu Response, write intMyvalue"ava17tr。mnew1oca1vr⊥ab1。 the global value of Myvalue ig still 42 (3)创建自己的ASP虚拟应用程序 为了建立一个新的虚拟应用程序,使用 Internet Services Manager应用程序或具有相同功 能的 HTML Web Manager网页。在 Internet Services manager中,在要创建的虚拟应用程序的 目录上单击右键,并选择New,接着选择 Virtual Directory,屏幕如图3-3所示 Tn is-[Internet I n Services\.wrosbox(Defau喇 eb Site\te时】厂回 J Tb cor 图 ++m|xmBe)m回 book Service A Task 图3-3创建ASP虚拟应用程序的屏幕 这个操作启动 New Virtual Directory wizard,该向导的开始屏幕提供有关向导的操作信息 单击Next,在第二页中键入新的虚拟应用程序的名字(或别名)。这个名字与在 Internet Services Manager中选择的目录的路径联合起来,将成为该应用程序的URL。屏幕如图3-4所示。 为了把一个现有的目录转换为与该目录具有相同名字的一个应用程序,选择包 含想要转换的目录的目录,并在向导的 Virtual Directory Alias页中使用该目录名。例 如把已有的test目录转换为一个虚拟应用程序,应该在 Internet Services manager中选 择 Default Web site条目,并提供一个别名“test
中就不能再用。但是在其他的应用程序或 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 下载
76s3高级编程 China°beo w Virtual Directory wizard You must gve the vitual rectory a shot name, or alas, for quck teference Type the aas you want to ue to gain access to this Web vitue directory. Ute the that you would for nang a decoy 图3-4 New Virtual Directory Wizard的屏幕 再单击Next,指定包含该应用程序的内容(页面)的路径。单击 Browse选择一个已有目录。 这个目录是新的虚拟应用指向的目录。屏幕如图3-5所示 Web Site Content Directory where is the content you want to publish on the Web site? Enter the path to the directory that contant the content 图3-5指定路径时的屏幕 单击Next打开 Access Permissions页,选择给予这个应用程序的所有用户的权限。缺省值 是Read和 Run Scripts,对大多数用户而言是适合的。屏幕如图3-6所示。 New Virtual Directory wizard Access Per persons do you want to set for this vitual directory Alow the folowng click Next to complete the wizard 图3-6设置用户许可权限时的屏幕 如果想编写用户可直接执行的、定制的编译的CGI应用程序,只选择“ Execute 例如,用户通过在请求的URL中指定相应名字的方法执行的一个exe文件,像"htt /mysite. com/... /Test Application/ create user. exe?user=JJones 单击Next,向导创建该虚拟应用程序。在图3-7所示的屏幕中,可在左边的列表栏中看到 带有一个包含一些填充物的打开的小盒子图标
图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 高级编程 下载
rhinapub.com 第3章ASP应用程序与会活77 in iis-[Internet Information Servicest'wronbox\Default web Site test\Te-A KX 如m+回X日‖盟■回 + PBSData Arequest ADSI Test □ Phone Book Service 司 sample_ template 国ses9pbk applcation 图口 request Open AI Tacks DO vti log window from here A Administration Web St Ha imag OSDrBrowser 图3-7虚拟应用程序创建完成后的屏幕 如果现在用右键单击新的应用程序并选择 Properties,可以看到向导已经选择的设置。在 这里可根据需要修改访问权限、“ Local path”和“ Application Settings"。同时会看到一个 Remove按钮,可以用来删除该虚拟应用程序,如图3-8所示。 When connect the content thould cone homm o directory located on this comouter CAthee located on another 广 A reduction to at阻L no source accent rectory browing Applcation Settings aptt only 图3-8虚拟应用程序属性设置的屏幕
图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 下载
78s93高缓编程 Chinapub coM 删除虚拟应用程序 单击“ Remove”按钮不会真正地删除 Internet services manager中的该条目。而是把现有 的虚拟应用程序转换为一个虚拟目录。这个目录有一个带有蓝色球的“文件夹”图标,该图 标表示这并不是Web网站中一个真正的目录,而是对磁盘上另一个文件夹的一个重定向。对 它进行的访问方式与创建它的虚拟应用程序相同(即使用相同的URL,但是不作为一个应用程 序。换句话说,它不支持自己的 Application对象,而是继承缺省Web网站的 Application对象, 或者是在该目录的父目录中的另一个应用程序的 Application对象。 为了删除一个虚拟应用程序,可简单地在 Internet Services manager中的对象上单击右键 在弹出的菜单中选择 Delete e (5)应用程序存储的内容 ASP Application对象提供的全局存储空间可以用来存储下列内容: 简单变量,例如字符串和数字(存储为 Variant,类似于ASP脚本变量)。 Variant类型数组,一维或多维 ·对一个COM对象实例的变量引用(类似于 Variant)。 (6) Variant的定义 Variant是在Ⅴ SCript脚本引擎中为ASP(和 Internet Explorer)提供的唯一变量类型,与在 VB和VBA中定义的数据类型 Variant相类似。与大多数常用的基本数据类型(例如字符串或整 数)相比,尽管它不能使存储单元最高效地存储变量,需要进行额外的处理,但 Varian提供许 多用处 从内部来讲, Variant数据类型存储数值作为独立的子类型。它能自动地处理隐含的类型 转换,允许使用如下的代码: strstring :1:计21中H= 隐含的数据类型转换允许忽略HTML文本的值和列表控件是字符串的情况,并且如果需 要的话可以把它们当成数字(假设字符串确实包含一个有效的数字)。也可以随意地做一些其他 的事情,诸如使用Ⅴ SCript的Len方法检查 Request.Form集合中并不存在的一个值的长度← Len函数试图把从 Request.Form的调用的值转换成一个字符串。如果该值丢失,返回空 ( Empty),转换为带有""的一个字符串,因此长度是零。 7)Ⅴ SCript数据类型及转换 也可以进行显式的数据类型转换。在Ⅴ SCript中, VarType方法返回一个整数,表明 Variant当前保存的子类型: Select Case VarType(varMyvalue) Case 0: Response. write " Empty (uninitialized) Case i: Response. Write Null(no valid data ase 4 Response Write ' Single-precision floating-point number Case 5: Response. Write Double-precision floating-point number onse. write·cur
(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 高级编程 下载
aopub.com 第3章ASP应用程序与会话 下载 Case 12 se. write = (used only with items in arrays of variants) cess object Case 8192 nse.Write 'Variant Array nd select 还有一些函数,如 IsArray、 Is Date、 IsEmpty、 IsNull, IsNumeric和 Subject,对特定的子 类型返回一个 Boolean结果。一旦知道了数据的子类型,如果包含的数据合适的话,就可以将 之转换成不同的 Variant子类型。这对代码的透明性和检查变量是否包含合法值都是有用的, 非法的转换将导致运行期错误,转换如下所示 blnBoolean CBool (varvariant) Converte to a variant Cur(varvariant) a variant ngOng CLng(var averts to a variant Integer ariant estrone cstg (varvarianty Converts subtype (8) JScript数据类型及转换 在 JScript中,其他一些变量类型类似于Ⅴ SCript,但是没有代表对象的 Variant。所有值都 是对象,类型是下列六种数据类型之 undefined:只有单个值? undefined?,用于表明请求中的变量没有声明和创建,或者若是 隐含创建但还未分配任何值。类似于 VBScript的 Empty Null变量不包含一个有效的值。类似于Ⅴ SCript的 Nothing String · Number Object JScript提供了一个 type函数,返回表示数据的类型的字符串,例如: strstring='30; Response. Write(typeof (strstring)) Response. Write(typeof (intInteger)); mx址t: strlng: a the results2P 每种数据类型都有 toString方法和 valueof方法, tostring方法将变量的值转换为一个字符 串返回, valuec方法把变量的值作为它的原有数据类型返回 (9) JScript的级联和加法问题 JScript在许多方面不同于 VBScript,在一定程度上是因为没有“&”级联运算符可用。当 使用加法运算符时,它先检査变量的数据类型以决定要做什么。如果两个变量都是数值,结 果是数值的和。如果一个或两个是字符串,结果是字符串的级联 strstring = 30' intIntege 5=::::2:=:3出 suiting pag 如果进行加法的值超过两个,要看执行的顺序。下面的代码行进行相应的示范: Response. write (intInteger intInteger +."): ′Reau1t⊥24
还有一些函数,如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 下载