为了增强Web应用的灵活性,动态网页技术应运而生。实现动态网页的技术有很多,其基本思想是为用户和服务器之间提供双向交流的手段,并能够通过编程的方式,动态地生成用户需要的网页。要实现这样的功能,就必须从两个方面入手,首先要有收集用户提交数据的手段,其次就是提供处理用户提交数据的编程方法。为了能够收集用户提交的数据,专门出现了一种交互式的网页,在这种网页中包含了一个称为Web Form的标签,在这个标签中,可以包含一个或多个输入控件,供用户通过浏览器输入数据,还可以包含一个提交按钮,用户点击这个按钮后,浏览器就可以将用户输入的数据以适当的方式传送到服务器上;服务器收到这些数据后,就调用相应的程序或函数来处理用户数据,这种程序可以在用户端执行(如Java Applet和JavaScript程序),也可以在服务器端执行(如CGI和ISAPI方式),在这种情况下就要扩展Web服务器的功能,使之能够通过特定的接口,调用一些扩展的程序或函数,来实现动态生成HTML文件的目的,并将生成HTML页面返回给用户。通过这样一套机制,就形成了客户-服务器之间的互动。
在这种编程方式中,用户数据处理程序需要Web应用开发人员自己编写,并放在服务器特定的目录下,当用户通过Web Form提交的数据达到IIS服务器后,IIS服务器通过ISAPI接口调用用户指定的数据处理程序,完成对用户输入数据的处理,并根据处理结果生成HTML页面返回给用户。CGI(Common Gateway Interface)技术的原理也和这种方式类似。
早期的动态网页技术主要是采用这两种方式。尽管这些编程方式可以有效地完成动态网页的开发,但是技术难度比较大,开发效率比较低。为了方便Web应用开发,1997年微软公司推出了ASP(Active Server Page)技术,支持用脚本语言来开发动态网页,包括VB Script和Java Script脚本语言。用这种技术开发的动态网页中,不仅包含HTML元素,还包括用脚本语言编写的程序。这样的动态网页以ASP页面文件的形式存放在服务器上,其后缀名为“.asp”,当用户请求这类文件时,IIS要先调用ASP处理程序,解释执行ASP页面文件中用户指定的脚本程序,并根据执行结果生成HTML网页,然后再返回给用户。
从实现方式看,ASP技术也是基于ISAPI扩展接口实现的,其中ASP处理程序也是一种ISAPI扩展,可以说,ASP技术并不是一个全新的动态网页开发技术,从它的实现原理来看,ASP技术实际上是建立在ISAPI之上的一个抽象层,目的是为Web应用的开发提供了一个完整的动态网页编程环境,这个编程环境是由几个ASP内置对象构成的。这几个对象可以在脚本程序中可以不加声明地直接使用:
- Request对象:主要是让服务器取得客户端浏览器的一些数据,包括用户从Web Form用POST或者GET方法向服务器传递的参数和其它信息。
- Response对象:用于输出数据到客户端,包括向浏览器输出HTML网页、重定向浏览器到另一个URL。
- Server对象:提供对服务器上其它COM组件访问的方法。
- Application对象:在实际Web应用中的用途就是记录整个网站的全局信息,如上线人数、在线名单、意见调查等。在给定的应用程序的多个用户之间共享信息,并在服务器运行期间持久的保存这些数据。
- Session对象:其中保存的是用户和服务器之间的会话信息,会话是指一个用户在一段时间内对服务器的一次访问。
从这些内置对象的作用来看,这些对象实际上为ASP脚本程序开发提供了一个完整的动态网页开发环境,如果把ASP脚本程序比作一个函数的话,那么Request对象就是这个函数的输入参数,而Response对象就是这个函数的返回值;Application 对象为这个函数提供了保存全局变量的地方,而Session对象则可以为这个函数保存静态变量;至于Server 对象,则为这个函数提供了调用服务器上其它COM组件的途径,这是非常重要的一点,因为这是ASP技术功能强大的真正原因。
Request对象封装了用户提交的数据和信息,在ASP脚本程序中可以用Request对象提供的统一的方法去读取这些数据,从这个意义上讲,Request对象为Web应用开发程序提供了一致的访问用户数据的方法;而Response对象则负责将ASP脚本程序运行的结果变成HTML形式的网页,返回给用户浏览器显示,为ASP脚本程序提供了统一的输出界面;Application对象和Session对象则在不同的层次上克服了HTTP协议的无状态特性,可以在用户的不同HTTP请求之间保存和传递必要的信息和中间结果,这就如同全局变量和静态变量可以在函数的不同调用之间保存中间结果一样,这个功能在复杂的Web应用中是不可缺少的。
Server 对象至少从三个方面提升了ASP脚本程序的性能。首先, ASP脚本程序可以通过Server 对象调用COM组件,因此可以在ASP脚本程序中使用COM组件实现很复杂的功能,比如,在ASP脚本程序中,可以通过ADO组件实现对数据库进行访问,这为网络信息系统开发提供了强有力的手段。这种使用COM组件的能力极大地扩展了ASP脚本程序应用范围,使之能够适应大规模分布式的Web应用;第二,COM组件可以用不同语言来开发,这就意味着Web应用的开发手段可以多样化,而且利于团队协同开发,对于大规模Web应用的开发而言,这是非常有利的;第三,可以提升ASP脚本程序的运行效率。因为ASP脚本程序是边解释边执行的,执行效率不高。在开发Web应用时,对于比较复杂的业务逻辑,如果直接用脚本语言来实现,则执行速度就会比较慢,要提高ASP程序的执行速度,可以将这些复杂的业务逻辑封装在COM组件中,然后在ASP脚本程序中通过调用这些COM组件来完成复杂的工作。由于COM组件是事先编译好的,执行速度要快得多,这样就提高了整个程序的运行效率。所以在实际的Web应用中,真正的业务逻辑往往都是用COM组件来实现的,而ASP脚本程序只是将这些COM组件“组织”起来去实现特定的功能,因此有一种形象的说法,称ASP语言是COM组件的“粘合剂”,而其中发挥“粘合”作用的,就是这个Server 对象。
通过这几个内置的ASP对象,ASP脚本程序可以用一致的方法来处理输入和输出数据,保存中间结果,调用COM组件等,方便了Web应用程序的开发。这几个内置对象实际上屏蔽了底层ISAPI技术的复杂性和HTTP协议的无状态特性,降低了Web应用开发的技术难度,使开发人员可以专注于业务逻辑的实现,而不必过多地考虑底层的实现技术。所以,ASP技术的指导思想实际上是屏蔽底层Web技术的复杂性,为开发人员提供通用而一致的开发环境,并提供扩展程序功能的手段,使之能够适应各种规模的Web应用的开发。这种指导思想在以后微软推出的ASP.NET中得到了延续和发展,理解这种思想是我们正确认识和使用ASP技术的关键。
ASP技术推出后,许多网站都采用了这种技术来开发Web应用,并取得了很大的成功,证明了这种通过在服务器运行脚本程序来动态生成网页的应用模式是符合实际Web应用的需要的,因此这种动态网页技术很快成为了当时开发Web应用的主流。
浙公网安备 33010602011771号