日期:2011-09-09  浏览次数:21178 次

    在从编程的角度研究ASP的细节之前,必须看一下ASP对象模型。这是非常重要的。因为如果你没有在ASP 2.0上做过同样的工作,必须考虑ASP产生页面的方式。
    对象环境概念
    在版本1 . 0中,把能够为Web页面增加一些动态内容当作是一个令人激动的新方法。可以使用它从数据库读取数据,或操作从浏览器发来的数值。在ASP 2.0中,发生了很多非常引入注目的变化,增加了Microsoft Transaction Server(MTS),它能够处理多个并发组件实例并提供进一步的扩展能力。这意味着动态Web页工作的整个概念发生了变化。
    在此基础上, MTS允许使用分布在多个组件、应用程序和服务中的事务。例如,当通过Message Queue Service(以前是MSMQ )向远程计算机发送消息时,一个ASP页能够更新本地数据库。假如整个事务中的一部分失败,整个处理过程将被恢复到系统原来的状态。
    MTS,以及组件的使用日益广泛,导致了使用ASP的Web应用程序的发展,而不再是单独的简单动态页。在由ASP脚本实例化的组件内,这个ASP页的环境是可用的。环境包含了所有内部的ASP对象(我们很快要遇到的)。因此,可以使用它获得用户请求的信息并创建相应的响应。
    由于这个环境包含了整个ASP的对象模型,因此,它允许程序员对ASP以及所使用的各组件所执行的复杂处理进行更多的控制。通常认为对象模型的“根”是请求、响应和其他内部对象;而真实情况是(自从ASP 2.0以来就已经是),这个根是一个称为Object Context的对象。
    1.引用ASP页面的环境
    在ASP 1.0 中,引用环境的唯一方式是通过每次开始执行ASP页时由ASP引发的事件:OnStartPage。这个事件以一个参数为ASP页提供Object Context对象。在一个组件内,能够在一个全局变量中捕获对Object Context的一个引用,以供代码使用。例如,下面这段VB代码把环境存储在一个称为obj Context的局部变量中。

    从上面的代码中看出,在ASP 1.0中,对象的环境是Scripting Context类型,这是一种在ASP.DLL中定义的对象类型并为创建引用文件ASP.dll的代码所用。然而很明显,控制事务并提供高效的进程外的组件执行(ASP 2.0中MTS管理的一个任务),必须采取不同的做法。页环境必须是显式可用的,无须在每个页面的开始处保留对它的引用。
    因此,在ASP 2.0中,微软引入了Object Context对象。然而,由于Scripting Context仍然通过OnStartPage事件起作用,许多组件的创作者考虑到程序的向后兼容性,避免使用ObjectContext 对象,甚至宁愿以降低性能为代价。现在,由于有了ASP 3.0,情况发生了变化。在Windows 2000中,MTS做为COM +技术的一部分被融入操作系统中,除非明确决定避免它,否则将在缺省状态时被用于在ASP中实例化的任何一个组件。
    2. 引用ObjectContext 对象
    从ASP 2.0开始,已经能够通过ASP提供的GetObjectContext 方法获得一个对当前页面环境的引用。这就意味着不必再通过一个页面存储对环境的引用,可以在任何需要的时候得到它。

    这允许我们的对象变成无状态的( Stateless ),换句话说,当完成执行一个特定的方法后,不需要保留对任何数值或对象的引用。假如以前你没有使用过ASP 2.0和MTS,这看起来也许是一个有些深奥的概念。然而它是极其重要的,我们将在后续章节讨论关于这个问题的大量细节。
    ASP内置的对象
    看到了ASP如何以Object Context对象的形式提供一个“根”对象,就可以来了解其他的内置对象如何构建在它上面,以提供对客户端请求、我们所创建的响应和其他使编写脚本更容易的对象的访问。
    原来的Scripting Context对象仍然在使用,并且OnStartPage 事件也是可用的,但现在已经陈旧了,应该只用于在有ASP 1.0的IIS 3.0上执行的页面,或在需要绝对的向后兼容性时使用。
    由ASP提供的两个主要内置对象,直接映射访问Web服务器时客户端的两个行为。另外4个提供了附加功能,对编写脚本是非常有用的。每个对象都提供了一系列的集合、属性和方法,这在后续章节将加以介绍。
    Request对象为脚本提供客户端在请求一个页面或传送一个窗体时提供的所有信息,这包括能够标识浏览器和用户的HTTP变量,存储他们的浏览器对应于这个域的cookie,以及附在URL后面的值(查询字符串或页面中< Form >段中的HTML控件内的值)。它也给我们提供了通过Secure Socket Layer(SSL),或其他的加密通信协议,访问证书的能力并提供有助于管理连接的属性。
    Response对象用来访问所创建的并返回客户端的响应。它为脚本提供了标识服务器和性能的HTTP变量,发送给浏览器的信息内容和任何将在cookie中存储的信息。它也提供了一系列用于创建输出页的方法,如无所不在的Response.Write方法。
    Application对象是在为响应一个ASP页的首次请求而载入ASP DLL时创建的,它提供了存储空间用来存放变量和对象的引用,可用于所有的页面,任何访问者都可以打开它们。
    独特的Session对象是在每一位访问者从Web站点或Web应用程序中首次请求一个ASP页时创建的,它将保留到默认的期限结束(或者由脚本决定中止的期限)。它与Application对象一样提供一个空间用来存放变量和对象的引用,但只能供目前的访问者在会话的生命期中打开的页面使用。
    Server对象提供了一系列的方法和属性,在使用ASP编写脚本时是非常有用的。最常用的是Server.CreateObject 方法,它允许我们在当前页的环境或会话中在服务器上实例化其他COM对象。还有一些方法能够把字符串翻译成在URL和HTML中使用的正确格式,这通过把非法字符转换成正确、合法的等价字符来实现。
    ASP Error对象是ASP 3.0中的一个新的对象,通过Server对象的Get Last Error方法使用。它提供了发生在ASP中的上一次错误的详细信息。
    可以把这些对象看作是基于Object Context对象的一个层次关系的成员,这有助于理解它们与接受和响应客户请求的过程之间的关系,如图1 - 2 0所示。图中表现了ASP和创建及服务于ASP页的过程之间的关系。
    我们将在后续章节详细研究每一个对象,以及使用它们的方式。