Microsoft的动态服务器网页(Active Server Pages,ASP)技术目前已发展到了3.0版。对很多人来说,用ASP来创建Windows服务器平台上的动态Web网页、整个站点和基于Web的应用程序已经成为极其自然而然的方法。在浏览器地址栏中,文件扩展名.ASP同表示动态创建的网页的文件扩展名.pl或.cgi一样,已被浏览者所接受。事实上,对于在微软的操作系统上工作的Web程序员来说,ASP正在变成一种不再令人激动的技术,而仅是一种工作方式。
这种看法的改变体现了一种技术的逐步成熟。由于ASP的应用程序的数量日益增多,ASP的工具也在日益增加,同时有越来越多的第三方开发商开发出一系列基于ASP或使用ASP的附加功能模块、ActiveX服务器组件,甚至成套的“自己做( do-it-yourself )”Web站点工具。人们几乎不再关注微软公司最初使用的奇特的名字。现在ASP在行业内已经成为一个公认的名词。
这是一本关于ASP成熟技术最新版本的书,其目的是期望读者在一定程度上熟悉ASP的组成,了解ASP能够做什么及如何使用它。本书的目的不仅是使读者开始使用ASP,并且还要使读者了解ASP新版本的变化和它能够做到而早期版本不能做到的事情。
这并不意味着读者必须成为专家才能阅读本书,但希望读者已了解Web工作的基本方式和脚本语言的相关知识,如VBScript或JavaScript。
本书将更多地从研究和技术的角度讨论ASP,使读者对ASP如何工作有个更好的理解,有助于读者编写的ASP代码达到更高的水平。ASP 3.0核心可能没有很多本质上的改变,但有很多令人激动的使用方法。
本节先简单回顾一下ASP是如何产生的,以及ASP为什么能够在Web程序开发人员中流行。首先从了解Web的基础和动态Web页面的发展开始。把ASP与其他许多能够提供这种动态化的技术相比较,由此深入了解ASP的发展情况,同时了解Web应用程序的发展,而不仅限于了解单纯的动态Web 站点。
HTML的起源
万维网( World Wide Web,WWW )起源于设在瑞士的CERN实验室。Tim Berners-Lee及其开发小组,花费大量的时间,研究建立了一种以一定格式传输信息的方法,这就是众所周知的超文本传输协议(简称为HTTP)。该协议使用了超文本标记语言(HTML)。HTML设计简单,结构灵活,允许在Web浏览器及其他兼容的应用程序中显示文本及图像。文档的某些部分可以成为超链接,即当其被选择时,可以显示不同的页面或同一页面的不同部分。
标记语言是由特定字符分隔的基本元素,指定基本元素中所包含的文本或其他条目如何显示。例如<EM>This is some Emphasized text</EM>。HTML是一种广泛基于标准通用标记语言(Standard Generalized Makeup Language,SGML )的标记语言。SGML是描述语言的一种方法,其本身并不是用来创建网页的语言。
HTML语言从简单开始,不断增加一些附加的功能,直至形成了今天所用的HTML 4.0版本。这些新增的特性提供了更灵活的文本字体风格(例如< FONT >元素),以及对输出页面布局的更多控制(如窗体和帧的使用)。
早期的网页所缺乏的是动态的内容。刚一开始时,这还不是一个问题,因为HTML的开发是为了在计算机、网络及操作系统之间显示和传送信息(特别是技术和科学信息)。这种标准化的文档仅是一种简单的文本和标记,其中的图像和其他非文本的内容以单独文件形式存放,它们可以在各种网络上自由传送。另外,由于信息的格式是固定的,其组成元素的含义也是在HTML中定义好的。对于一个“阅读器”或浏览器应用程序,用任何程序语言在任何平台或操作系统中相对来说是比较容易实现的。
只要建立这些信息网页,文本文件和图像可通过Web服务器应用程序传送给用户,Web服务器应用程序简单地从磁盘中读取它们并且把输出转换成能够在网络中传送的正确HTTP协议。在客户或用户端,浏览器接收传送到的信息流,并转换成为能够显示的页面。
HTML和HTTP除了具有跨平台特性之外,其最主要的长处就是其文档可以包含有关内容的相关信息、作者意欲表达的方式等。它可以被应用程序阅读而不一定显示出来:例如盲人可以使用特殊的程序把它转换成为语音。同样,其内容可以特殊方式显示出来,以便那些视力差或有其他缺陷的人们更容易进行访问。因此,技术界经常用“用户代理” (user agent)这一通用术语代替“浏览器” ( browser )。
动态页面的起源
对于新类型的文档内容,特别是那些设计成为允许在页面上输入信息的文档(例如HTML中< INPUT >等的窗体控件),开发一种能够读取这种信息并加以利用的应用程序成为必然。很明显,传递从其他应用程序中得到的内容,特别是特定类型的数据库的内容,需要一种新的方法。每次都需要重写一个基于文本的页面,对于提供实时性很强的信息当然不是一个理想的方法。
对于Web服务器来说,提供一个接口使其他应用程序能够与之相连成为一种常用的方法。通过这个接口,定制的可执行程序能够接收来自客户端的信息,包括通过点击超链接或在浏览器中键入统一资源定位符( URL )所提出的页面请求的细节。应用程序对客户端的请求能够生成相应的响应,而不是从服务器磁盘上读取文本或标记文件。从这些早期方法开始,逐渐形成一套完整的系列方法动态创建网页,以响应用户的请求或信息的变化。
用于这些应用程序的接口仍然在使用,并被称为公共网关接口(Common GatewayInterface,CGI ),这是一种可用任何语言(如C语言)实现的标准。它产生于那些使用cgi-bin目录的应用程序(这里“bin”代表二进制代码,而不是文本)。早期的应用程序都是编译后的程序,通常用C或C++编写。然而这自然要求懂得C语言的编程方法,并且每当对程序做很小的文字上或标记上的变动,都必须重新编译、重新生成可执行文件,这就限制了CGI和动态页面的使用。
取而代之的是开发了一种用脚本语言创建网页的方法,这种语言就是实用摘要和报告语言(Practical Extraction and Reporting Language),或简称为Perl,它允许信息的创建者以一种非常类似于简化版C或C + +的语言编写代码。在Perl脚本中,可以“写”文本和标记,用标准输入(stdin)和标准输出(stdout )函数通过CGI与Web服务器通信,输出到浏览器。
Perl在Web上仍然是一种流行的语言,特别是在基于UNIX或Linux的系统上。然而这种语言掌握起来不是很容易,特别是对于那些没有C或C++语言基础的Web开发人员更是如此。现在,一些新的脚本语言出现了,使创建网页更加容易。我们主要看一下它们如何使开发人员的工作变得更加容易。
1. 服务器端脚本技术
对于服务器端的脚本需要用某种类型的中间应用程序,或插件程序来连接。它必须能够接受用户请求,读取并解释合适的基于服务器的脚本文件,接着创建输出页,并传送给Web服务器,在那里作为响应发送给客户端。
在某些情况下,这个任务划分为两个部分:
一个应用程序或插件程序处理与Web服务器的往来通信(一般通过CGI )。
另一个处理解释和执行脚本。
这就是ASP中的情况,脚本引擎的使用与在其他环境下相同。
Perl是第一个流行的服务器端脚本语言,但是目前已经出现很多其他的语言。在UNIX及基于Linux的系统上,一种新的称之为PHP(Personal Home Page)的语言正变得越来越流行。还有一些语言的目标是一些特定类型的用户,例如T C L就是一种在科学环境下使复杂的数学运算简单化的语言。
2. 微软的动态页面创建技术
微软随Windows NT 3.51推出了他们的Web服务器软件—Internet Information Server(IIS)1.0。这是一个提供了很多功能的相当标准的软件,它支持CGI。然而微软也提供了另外一个接口,允许使用C和C++等编译语言生成可执行文件,使操作更加高效。这就是Internet服务器应用编程接口(Internet Server Application Programming Interface,ISAPI )。它能够提供比传统
Perl引擎和其他技术所依赖的stdin和stdou t更为广泛的对Web服务器的访问。
此后微软和其他第三方开发商推出了许多能通过ISAPI连接到IIS的应用软件,这也就是为什么ASP能够连接到IIS以及其他微软服务器端动态技术。在ASP以前,用得最广泛的是Internet数据库连接器(Internet Database Connector,IPC )。ASP为Web开发者使用微软的平台开辟了一个新的天地,这使采用数据库中的数据创建动态网页更加容易。特别是它引入了模板(template ),即包含了带有能够插入数据库查询结果的文本和标记的模板文件。
现有的(或将过时的)其他微软服务器端页面创建技术有db Web和OLE ISAPI。事实上,db Web就是OLE ISAPI的实现,而对于多数人来说,迄今只是证实了这一技术在实际应用中的不适应性。OLE ISAPI是通过特殊版本的ISAPI接口与IIS通信的一些COM对象。Web服务器软件调用COM对象中单个指定函数并以参数为用户的请求提供细节。COM对象返回的是作为字符串的页面的文本和标记,然后作为响应发送给客户端。
OLE ISAPI首创了COM对象的动态Web页面创建,为编程人员提供通过编译的Active XDLL创建动态页面的能力。然而它所使用的特定的实现和数据通信技术对于较小的任务和内部网( intranet )工作缺乏有效性和可扩展性。同时,每当改变页面的文本和标记时,也需要重新编译动态链接库。图1 - 1给出了到目前为止所讨论的技术的相互关系。
3. 动态Web页面创建方法的比较
比较动态页面创建技术是一个既困难又敏感的任务,然而理解各种接口和与之相关联的应用程序的差异性又是很重要的。当创建与Web服务器交互的应用程序时,涉及到的两个主要的问题是它们对Web服务器本身稳定性的影响,以及处理多发或并发页面请求的效率。这
两个问题是相互联系的,又是相互排斥的。
应用CGI和ISAPI的编译的可执行应用程序(不是DLL文件),通常在服务器计算机上以进程外( out-of-process )方式运行,这就意味它们要作为单独应用程序运行,占有单独的与Web服务器应用程序不同的内存空间。操作系统将其作为一个单独的进程进行管理,禁止它们访问本身所占内存以外的内存。
因此,如果一个进程外应用程序失败,不会影响到Web服务器。同样,假如应用程序包含错误,企图直接写入Web服务器的内存,会因一般性保护错误停止运行。进程外应用程序也会因用户或操作系统的命令而中止,这时代码会从内存中自动卸载。
因为运行进程外程序意味着访问Web服务器内存的请求被禁止,所要求的或产生的输出结果值不能直接传送给Web服务器。所以必须执行一种跨进程调用,但这比在同一进程内访问内存要多花费几倍的时间。对于可执行文件的装载和卸载时间还有一定的影响。
相反,应用进程内( in-process )程序—通常是能够使用ISAPI或OLEAPI接口的DLL (不是单独的可执行文件),因为其运行在Web服务器的内存空间中,可以直接访问Web服务器内存中的值,这可提供更快的访问和响应。然而其代码的错误或失败会影响到Web服务器。例如DLL文件中的代码直接写入包含Web服务器操作代码的内存空间,可能引起Web服务器的失败。其关系如图1 - 2所示。
进程外应用程序实例是Perl脚本解释器和使用ISAP I接口的.exe文件。进程内组件的实例有dbWeb、IDC以及ASP技术。然而,ASP和IIS相互连接的方式还有许多种。因此,先把其他相关技术放在一边,进一步研究ASP。