这篇文章本来是用 HTML 写的,里面还有好多插图 (vi6 snapshot),可惜...
先贴在这儿,赶明儿再贴 HTML 版的。
==================================================================
Visual InterDev 6.0 中的 Script Object Model
本文需要读者具备以下技术背景:
HTML (Hyper Text Marked Language)
DHTML (Dynamic HTML)
DOM (Document Object Model)
ASP (Active Server Page)
DTC (Design Time Control)
--------------------------------------------------------------------------------
历史 / Client-Side Scripting / Server-Side Scripting
Web Site 在一开始出现的时候,主要目的是为信息发布(Information Publish)。换言之,一个 Web Server 更类似于一个文件服务器(File Server)。Web Site 是 Web Page 的集合,每一页 Web Page 都是使用 HTML 格式的纯文本。
为了实现更丰富的显示功能,并且增加访问者与页面的交互功能,在浏览器端(Client-Side)出现了 DHTML 技术。DHTML并非一个单独的产品或技术,而是一系列技术的集合。它主要集成了:
CSS (Cascading Style Sheet)
DOM (Document Object Model)
Client-Side Script (典型的是:Javascript)
另外,几乎是一瞬间,人们就不再满足于 Web Site 只做信息发布(Information Publish)平台了。人们希望用它来取代以前的 Client/Server 模式,也就是说做Web应用。这主要是在后台做文章,相关的技术有:
CGI (Common Gateway Interface)
ISAPI/NSAPI/WSAPI
ASP (Active Server Page)
在 Windows 平台上,考虑到性能效率和编程周期的折衷,人们往往选择的是 ASP (Active Server Page)。ASP 技术是通过在服务器端(Web Server Side)解释执行 Server-Side Script (通常使用 VBScript 编写),并有可能进一步调用服务器端组件(Server-Side Component),来最终实现浏览器/服务器 (Browser/Server) 三层 Web 应用模式。
--------------------------------------------------------------------------------
远程脚本编程技术 Remote Scripting
而在实际应用中,复杂的 Web 应用系统往往需要同时调用客户脚本又调用服务器脚本。客户脚本(Client-Side Script)用于完成用户界面──例如,为了动态改变 Web 页文本,对用户动作,比如双击作出反应,并执行诸如验证这样的面向客户的任务。客户脚本由浏览器解释执行,从而向用户提供了一种生动的、反应迅速的接口。而服务器脚本(Server-Side Script)是用来完成整个应用系统的商业逻辑部分。比如对某个数据库的存取动作。
但是客户端和服务器端脚本是互斥的,即互相不可见。当某个页首次请求时,服务器可能运行服务器脚本,并将页面传递给浏览器,然后浏览器就可以运行客户脚本。不过,如果该页上的服务器脚本有必要再次运行的话,那么必须将该页提交回服务器,服务器才可以有效地重新运行该页。维护页面中控件的状态和脚本中的变量可能需要一个复杂的脚本编程 (scripting) 过程,目的是在浏览器和服务器之间来回传递信息。这还会增加网络流量,降低 Web 应用的性能。
示例:
如图,在 Visual InterDev 6.0 的编程环境中可以清楚看到,DHTML 编程完全是 Client-Side Scripting 技术。相应的,HTML Form Element 全部都是 Client-Side Object。我们不可能在 Client-Side Script 中访问任何 Server-Side Object,如果想访问,唯一的方法是提交页面,使用 Action 属性去调用 ASP 页面。
一种折衷方案是远程脚本编程技术(remote scripting)。该技术允许你在客户脚本中写代码调用某个 ASP 页中的方法(函数或者例程)。实际上,你可以象调用本地例程那样调用服务器脚本,不过它们仍然运行在服务器上,并具有对服务器能力的所有存取权限。由于你从不需要离开当前页面,跑去调用服务器脚本,因此页面状态很容易保持。
Remote scripting 是通过函数库来实现的,当你要调用某个服务器方法时,可以直接从客户端脚本中调用这个函数。调用请求会被传递到浏览器中的一个代理进程中,该进程在浏览器中异步运行,目前,该代理是作为一个 Java applet 来实现的。该代理进程发送一个请求到包含你所调用方法的 ASP 页的服务器中。
而后,服务器加载 ASP 页,而且该 ASP 页上的一个特殊例程将你的请求调度到所需的函数。如果你所调用的函数有返回值,那么该值即被发送回代理进程,代理进程将之包装为一个对象 ------ 一个调用对象 (Call Object) ------ 该对象的属性中包含了许多有用的信息,其中包含函数返回值。
为了实现 remote scripting,除了你自己的客户端 (.htm) 文件和服务器 (.asp) 文件外,还需要下面的文件:
Rs.htm 包含了一系列函数,其目的是在客户端的 .htm 文件中初始化 remote scripting、执行远程过程、检查远程调用的状态,以及获得函数的结果。
Rs.asp 包含了一系列函数,其目的是在服务器端的 .asp 文件中初始化服务器端的 remote scripting,以及在 ASP 页中调度到所需的函数。
Rsproxy.class 包含 Java applet 的 Java 类文件(对象代码),其目的是在客户端和服务器页之间进行通信。
为了使得用 remote scripting 调用 ASP 页上的函数更方便一些,您可以在客户脚本中创建对象引用,引用具有服务器端函数的ASP页面。这样,你就可以使用标准的 object.method() 语法去调用在服务器 ASP 页面中暴露出的函数了。
--------------------------------------------------------------------------------
Visual InterDev 6.0 Page Object
读到这里,大家大概想到在 Visual InterDev 6.0 中,Remote Scripting 是如何方便地实现了。VI6 使用 Page Object DTC 帮我们封装了大量内容,我们所需做的就是首先在 ASP 页面中写一段函数,然后使用 Page Object 将其暴露出来。在前台的 HTML 页面中也加入 Page Object,帮我们引用(Reference)ASP 页面,然后就可以在 Client-Side Script 中使用后台 ASP 页面中的函数了。这种使用和以前的通过 Submit Form to ASP 的方法不同,无须离开 HTML 页面。
Server-Side
创建 Server-Side ASP 页面。
在 ASP 页面中写一段函数。
然后使用 Page Object 将其暴露出来。 Client-Side
创建 Client-Side 页面。
使用 Page Object 引用需要的 ASP 页面。
然后就可以在 Client-Side Script 调用写好的 Server-Side 函数了。
令人高兴的是,函数的返回值通过 Call Object 的属性 callobject.return_value 来传递,可以是数组!