Chinaopub.coM 下载 第16章ASP脚本组件 在研究ASP时,一个首要问题是如何编写能够为ASP页面提供运行期文本的组件。三年以 来,我们使用了很多方法去解决这个问题,使用设计期 ActiveX控件( Design-time Active x Control,DTC)和ASP组件是解决这一问题的两种不同方法。 不要将DTC与分布事件协同( Distributed transaction coordinator)相混淆 首先,DTC是可视化的,在调用ASP页面之前,它关联于用于生成ASP页面运行期文本的 创作工具。可以将其理解为类似于先进的Word和Exce宏。一旦它们完成运行并你保存了页面 ASP脚本仅包含代替控件的文本。不必担心可能造成的额外的下载,因为程序已经使用了 DTC,而DTC是开发期控件,因此运行时不进行任何多余的下载。通常,不必为自己的项目 编写DTC,而是使用开发工具提供的DTC。例如 Visual inter dev就提供大量DTC供使用 正如在前面章节看到的,ASP组件更为直接和特定,并且只在运行期内发生作用。它们 能够添加基于运行期环境的代码。这些组件用C++或Ⅴ isual basic编写,并由IS控制在服务器 上加载和执行。在使用ASP时,将直接影响站点的整体性能。 本章将介绍用脚本语言编写的ASP组件。这种ASP组件是名为 Windows脚本组件( Windows Script Component,wsC的常用技术的一个特例。它使程序员能够仅仅使用一种脚本语言如 VBScript或 JScript编写几种类型的COM对象。如果正在使用 Windows2000或IE50,那么计 算机上已经安装了这些组件。但是,也可以在 Windows nt环境下的IS40中或 Windows9x环 境下的PWS中运行。 所以,这里将简单介绍WSC技术的主要特征,主要内容有: ·使用脚本语言编写COM对象的技术基础。 ·怎样使用脚本语言编写COM对象 怎样编写ASP脚本组件。 ASP脚本组件同其他ASP组件的区别。 在讲述理论之后,举个例子:用一种有力而易于维护的方法封装HTML的表以格式化数 据 16.1使用WSC的环境 如果要重现在这章中所要讲述的所有内容,你的系统需要安装相应的一些程序。首先 把浏览器指向微软脚本网站:htt:/msdn.microsof.com/scripting并下载wSC包,这是一个自 安装文件,包含以下内容: WSC的二进制驱动程序。 ·文档。 帮助编写组件的向导。 如果你已经安装了 Windows2000或IE5.0,则系统已经具有其驱动程序。安装 Windows
下载 第16章 ASP脚本组件 在研究A S P时,一个首要问题是如何编写能够为 A S P页面提供运行期文本的组件。三年以 来,我们使用了很多方法去解决这个问题,使用设计期 A c t i v e X控件(Design-time ActiveX C o n t r o l,D T C )和A S P组件是解决这一问题的两种不同方法。 不要将D T C与分布事件协同(Distributed Transaction Coordinator)相混淆。 首先,D T C是可视化的,在调用A S P页面之前,它关联于用于生成 A S P页面运行期文本的 创作工具。可以将其理解为类似于先进的Wo r d和E x c e l宏。一旦它们完成运行并你保存了页面, A S P脚本仅包含代替控件的文本。不必担心可能造成的额外的下载,因为程序已经使用了 D T C,而D T C是开发期控件,因此运行时不进行任何多余的下载。通常,不必为自己的项目 编写D T C,而是使用开发工具提供的 D T C。例如Visual InterDev就提供大量D T C供使用。 正如在前面章节看到的, A S P组件更为直接和特定,并且只在运行期内发生作用。它们 能够添加基于运行期环境的代码。这些组件用 C + +或Visual Basic编写,并由I I S控制在服务器 上加载和执行。在使用A S P时,将直接影响站点的整体性能。 本章将介绍用脚本语言编写的 A S P组件。这种A S P组件是名为Wi n d o w s脚本组件( Wi n d o w s Script Component,W S C )的常用技术的一个特例。它使程序员能够仅仅使用一种脚本语言如 V B S c r i p t或J S c r i p t编写几种类型的C O M对象。如果正在使用 Windows 2000 或IE 5.0,那么计 算机上已经安装了这些组件。但是,也可以在 Windows NT环境下的IIS 4.0中或Windows 9x环 境下的P W S中运行。 所以,这里将简单介绍W S C技术的主要特征,主要内容有: • 使用脚本语言编写C O M对象的技术基础。 • 怎样使用脚本语言编写C O M对象。 • 怎样编写A S P脚本组件。 • ASP脚本组件同其他A S P组件的区别。 在讲述理论之后,举个例子:用一种有力而易于维护的方法封装 H T M L的表以格式化数 据。 16.1 使用W S C的环境 如果要重现在这章中所要讲述的所有内容,你的系统需要安装相应的一些程序。首先, 把浏览器指向微软脚本网站: h t t p : / / m s d n . m i c r o s o f t . c o m / s c r i p t i n g并下载W S C包,这是一个自 安装文件,包含以下内容: • WSC的二进制驱动程序。 • 文档。 • 帮助编写组件的向导。 如果你已经安装了 Windows 2000或IE 5.0,则系统已经具有其驱动程序。安装 Wi n d o w s
498Ap高程 下载 98或IE401的系统也是这样的,但其提供的是语法上稍有不同的较老版本。只要从微软的网 站下载其软件包则一切可迎刃而解 wSC向导并不包含在任何版本的浏览器和操作系统中,需要从微软站点下载。 16.2一个 Windows脚本组件 下面从 Windows脚本组件的定义开始 个 Windows脚本组件就是一个使用脚本语言编写的cOM对象。 初看这个定义会感觉到很奇怪:真的可以用脚本语言编写COM对象吗?下面的这些情况 也说明了这种疑惑的合理性 COM对象是二进制的文件,而Ⅴ SCript和 JScript不生成二进制文件。 COM对象具有一个众所周知的二进制布局,脚本语言如何实现这种布局? COM对象提供接口,如何使脚本语言也能这样做。 COM对象需要注册和一个 CLSID,脚本语言如何处理这些问题。 上面的这些疑问将在下面给出相应的详尽解答 16.2.1发展历史 最初,组件化Web的尝试是由1997年发布的IE4实现的。到目前为止,IE仍是唯一的支持 动态超文本标记语言( DHTML)Scriptlet的浏览器(它是今天web组件的原形)。 DHTMLScriptlet 主要指嵌入另一HTML的HTML。通过使用一个特定的命名约定,子页面可以向容器页面提供 个可编程的接口,并允许容器页面调用其方法、属性或激活事件 使用 DHTML Scriptlet同使用 Activex控件并没有什么不同,但是作为组件,二者主要分 别用于I和 Visual basic。从效率上来讲,它们并不是真正的由脚本语言编写的可重复使用组 件。此外, DHTML Scriptlet组件是为显示用户界面而设计的,而不是作为被请求页面的辅助 函数 从 DHTML Scriptlet发展到 Scriptlet 不久便产生了简单地称为 Scriptlet的组件。它们便是今天WSC的祖先。 Scriptlet是一种常 规的COM对象,可以从任何感知COM的开发工具调用,如 Delphi、 Power Builder、MFC和 DHTML Scriptlet同 Scriptlet相比较,其本身并没有什么不同,而编写方式却大不相同。 组件源代码的结构由HTML和脚本代码的混合体变为XML COM对象并不仅是代码。它提供标准的二进制布局。这意味着当编写COM对象时,至少 需要考虑两方面信息,分别是实现的接口和注册数据。正如我们前面注意到的那样,使用脚 本语言无法传递这种特殊的信息。 微软有两种选择,分别是: ·重新选择一个特殊的命名约定以插入注册和接口信息。 使用完全不同的语法编写组件。 微软选择了后者并使用XML定义组件的语法
9 8或IE 4.01的系统也是这样的,但其提供的是语法上稍有不同的较老版本。只要从微软的网 站下载其软件包则一切可迎刃而解。 W S C向导并不包含在任何版本的浏览器和操作系统中,需要从微软站点下载。 16.2 一个Wi n d o w s脚本组件 下面从Wi n d o w s脚本组件的定义开始: 一个Wi n d o w s脚本组件就是一个使用脚本语言编写的 C O M对象。 初看这个定义会感觉到很奇怪:真的可以用脚本语言编写 C O M对象吗?下面的这些情况 也说明了这种疑惑的合理性: • COM对象是二进制的文件,而V B S c r i p t和J S c r p t不生成二进制文件。 • COM对象具有一个众所周知的二进制布局,脚本语言如何实现这种布局? • COM对象提供接口,如何使脚本语言也能这样做。 • COM对象需要注册和一个C L S I D,脚本语言如何处理这些问题。 上面的这些疑问将在下面给出相应的详尽解答。 16.2.1 发展历史 最初,组件化We b的尝试是由1 9 9 7年发布的I E 4实现的。到目前为止, I E仍是唯一的支持 动态超文本标记语言( D H T M L ) S c r i p t l e t的浏览器(它是今天We b组件的原形)。D H T M L S c r i p t l e t 主要指嵌入另一H T M L的H T M L。通过使用一个特定的命名约定,子页面可以向容器页面提供 一个可编程的接口,并允许容器页面调用其方法、属性或激活事件。 使用DHTML Scriptlet同使用A c t i v e X控件并没有什么不同,但是作为组件,二者主要分 别用于I E和Visual Basic。从效率上来讲,它们并不是真正的由脚本语言编写的可重复使用组 件。此外,DHTML Scriptlet组件是为显示用户界面而设计的,而不是作为被请求页面的辅助 函数。 从DHTML Scriptlet发展到S c r i p t l e t 不久便产生了简单地称为 S c r i p t l e t的组件。它们便是今天 W S C的祖先。S c r i p t l e t是一种常 规的C O M对象,可以从任何感知 C O M的开发工具调用,如 D e l p h i、P o w e r B u i l d e r、M F C和 Visual Basic。 DHTML Scriptlet同S c r i p t l e t相比较,其本身并没有什么不同,而编写方式却大不相同。 组件源代码的结构由H T M L和脚本代码的混合体变为X M L。 C O M对象并不仅是代码。它提供标准的二进制布局。这意味着当编写 C O M对象时,至少 需要考虑两方面信息,分别是实现的接口和注册数据。正如我们前面注意到的那样,使用脚 本语言无法传递这种特殊的信息。 微软有两种选择,分别是: • 重新选择一个特殊的命名约定以插入注册和接口信息。 或: • 使用完全不同的语法编写组件。 微软选择了后者并使用X M L定义组件的语法。 498计计ASP 3 高级编程 下载
Chinapub.coM 第6章4本组件499 下载 IE40 I Scriptlet同目前的wsC的不同点在于:后者使用XML模式存储对象的附加信息 16.2.2 HelloWorld WSC WSC文件是扩展名为wsc的XML文件,以前是 正如其他的 Hello world例子一样, wSC版的例子也是很简单 脚本组件中所有的信息都必须置入、标记对中。也可以使用 、和标记。它们分别用 CLSID或 ProgID、实现的接口及其实际 功能来描述COM对象。 现在你应当对WSC文件有了一个初步的了解,下面将更为详尽地讲述如何构造WSC 16.3WsC的结构 首先,WSC的整个结构可以分解为如下三层: ·描述层:提供组件的元数据信息。 脚本层:包含所需的脚本函数 运行期层:以二进制提供给客户一个熟悉的COM布局 图16-1显示了WSC源代码文件的不同层。 描述层,定义对象的名称及 其提供的方法等 /public> MsgBox"Hello, World 脚本层,包括组件工作所需 的代码 ≤ component> 运行期层,包括解释脚本代 WSC解释器 码和向客户端提供相关的 COM布局的DLL 图16-1wSC的源代码结构
IE 4.01 Scriptlet同目前的W S C的不同点在于:后者使用X M L模式存储对象的附加信息。 16.2.2 HelloWorld WSC W S C文件是扩展名为 . w s c的X M L文件,以前是 . s c t。正如其他的 H e l l o Wo r l d例子一样, W S C版的例子也是很简单: 脚本组件中所有的信息都必须置入 、标记对中。也可以使用 、和标记。它们分别用 C L S I D或P r o g I D、实现的接口及其实际 功能来描述C O M对象。 现在你应当对W S C文件有了一个初步的了解,下面将更为详尽地讲述如何构造 W S C。 16.3 WSC的结构 首先,W S C的整个结构可以分解为如下三层: • 描述层:提供组件的元数据信息。 • 脚本层:包含所需的脚本函数。 • 运行期层:以二进制提供给客户一个熟悉的 C O M布局。 图1 6 - 1显示了W S C源代码文件的不同层。 图16-1 WSC的源代码结构 第1 6章 A S P脚本组件计计499 下载 描述层,定义对象的名称及 其提供的方法等 脚本层,包括组件工作所需 的代码 运行期层,包括解释脚本代 码和向客户端提供相关的 COM布局的DLL WSC解释器
500A5p3高装程 Chinapub.com 下载 16.31描述层 在这一层中共有四种基本的标记可供使用,它们是: 酸入 Registration>标记包含了向 Windows注册表中添加组件时需要使用的信息。在这里,可以 件进行较少的描述,如 Progld和 ClassID,也可以是任何基于注册或取消注册的可执行代 举个例子,一个新创建的组件会有一个类似下面的注册标记: version=1.00. progid="Helloworld. c1 assad={6432490f-0d48-48e3-bbe7-e2e773fc843e} description和 version属性是可选的,但是必须至少指定一个 progid和 classid属性。否则, 当试图注册组件时将产生错误 当为单一类型的WSC创建COM对象时,必须有一个 CLSID。没有 CLSID的WSC无法工作, 所以在注册过程中自动生成 CLSID。如果不指定 CLSID,特定的注册COM对象的系统程序 ( regsvr32exe)会为它创建一个。但是要记住,只有最新的用于IE5.0、 Windows2000和wSC 包的 regsvr32.exe才会这样做。否则,注册过程将崩溃。 Progid用于在如Ⅴ SCript的 CreateObject或 JScript的 ActiveXObject这样的后绑定函数中创 建对象实例。实际上,在脚本开发环境中,一个没有 ProgId的组件几乎没有任何作用。不定 义 ProgId,将无法用 CreateObject或 ActiveXObject来创建对象实例。只有 Windows Script Host 2.0才允许仅使用 CLSID来创建对象实例 在注册和取消注册时执行代码 如果需要,组件具有在注册或取消注册时运行预定义代码的功能。通常,从 regsvr32.exe 的视角来看,COM对象的注册是从COM对象DLL中调用一个函数。但是,每个WSC都通过服 务器模块( scrobj. dll)注册。一旦调用,它就知道了正在工作的wSC文件的名称,并且创建 COM对象的所有注册项。 这个DLL还在标记中查找两个函数中的一个。根据组件是在注册还是在取 消注册,它们分别是 Register和 Unregister version Function Registe MsgBox Registering- (e. g. generate a type-library on-the-fly)
16.3.1 描述层 在这一层中共有四种基本的标记可供使用,它们是: • • • • 1. 标记包含了向Wi n d o w s注册表中添加组件时需要使用的信息。在这里,可以 对组件进行较少的描述,如 P r o g I D和C l a s s I D,也可以是任何基于注册或取消注册的可执行代 码。 举个例子,一个新创建的组件会有一个类似下面的注册标记: d e s c r i p t i o n和v e r s i o n属性是可选的,但是必须至少指定一个 p r o g i d和c l a s s i d属性。否则, 当试图注册组件时将产生错误。 当为单一类型的W S C创建C O M对象时,必须有一个C L S I D。没有C L S I D的W S C无法工作, 所以在注册过程中自动生成 C L S I D。如果不指定 C L S I D,特定的注册 C O M对象的系统程序 ( r e g s v r 3 2 . e x e )会为它创建一个。但是要记住,只有最新的用于 IE 5.0、Windows 2000和W S C 包的r e g s v r 3 2 . e x e才会这样做。否则,注册过程将崩溃。 P r o g i d用于在如V B S c r i p t的C r e a t e O b j e c t或J S c r i p t的A c t i v e X O b j e c t这样的后绑定函数中创 建对象实例。实际上,在脚本开发环境中,一个没有 P r o g I D的组件几乎没有任何作用。不定 义P r o g I D,将无法用C r e a t e O b j e c t或A c t i v e X O b j e c t来创建对象实例。只有Windows Script Host 2 . 0才允许仅使用C L S I D来创建对象实例。 在注册和取消注册时执行代码 如果需要,组件具有在注册或取消注册时运行预定义代码的功能。通常,从 r e g s v r 3 2 . e x e 的视角来看,C O M对象的注册是从C O M对象D L L中调用一个函数。但是,每个 W S C都通过服 务器模块 ( s c r o b j . d l l )注册。一旦调用,它就知道了正在工作的 W S C文件的名称,并且创建 C O M对象的所有注册项。 这个D L L还在标记中查找两个函数中的一个。根据组件是在注册还是在取 消注册,它们分别是R e g i s t e r ( )和U n r e g i s t e r ( ): 500计计ASP 3 高级编程 下载
第16章9件501 下载 End function Function Unregister MsgBox "Unregistering. End function 定义这些函数取决于是否需要。在注册组件前没有必要声明其中任何一个。当然,可以 使用这两个函数去做更多的事情,而不仅仅是显示一个对话框。举个例子,可以动态生成组 件类型库 2. public>标记定义了组件的公共编程接口。换句话说,定义了组件提供的并且在客户端可 以调用的方法、属性和事件。其语法相当直接明了: ≤/ property> cevent name="OnEvent'> /event> 其中,name属性定义了每个条目的公共名称。在上面的代码中,属性是通过变量 My Property进行描述的,而方法体全部在一个名为 My Method的函数中。二者都定义在wSC的 标记中。下面是更多的关于这方面的内容。 (1)内部名称 对于方法和属性同样也可以使用一个内部名称。这通过 internalname属性来赋值。内部名 称的基本用途是在WSC文件中引用方法或属性 在这种情况下, My Property的属性通过变量对 m My Property来实现。同时,当客户调用 MyMethod方法时,实际调用的是 DoMy Methodr函数 (2)指定参数 个方法根据需要可以有任意多个参数。这里,name属性指示了形参名称。同样,事件 也可以有任意个参数,尽管一些老的文件没有提到这一点 (3)只读和只写属性
定义这些函数取决于是否需要。在注册组件前没有必要声明其中任何一个。当然,可以 使用这两个函数去做更多的事情,而不仅仅是显示一个对话框。举个例子,可以动态生成组 件类型库。 2. 标记定义了组件的公共编程接口。换句话说,定义了组件提供的并且在客户端可 以调用的方法、属性和事件。其语法相当直接明了: 其中, n a m e属性定义了每个条目的公共名称。在上面的代码中,属性是通过变量 M y P r o p e r t y进行描述的,而方法体全部在一个名为 M y M e t h o d的函数中。二者都定义在 W S C的 标记中。下面是更多的关于这方面的内容。 (1) 内部名称 对于方法和属性同样也可以使用一个内部名称。这通过 i n t e r n a l n a m e属性来赋值。内部名 称的基本用途是在W S C文件中引用方法或属性。 在这种情况下,M y P r o p e r t y的属性通过变量对 m _ M y P r o p e r t y来实现。同时,当客户调用 M y M e t h o d方法时,实际调用的是D o M y M e t h o d函数。 (2) 指定参数 一个方法根据需要可以有任意多个参数。这里, n a m e属性指示了形参名称。同样,事件 也可以有任意个参数,尽管一些老的文件没有提到这一点。 (3) 只读和只写属性 第1 6章 A S P脚本组件计计501 下载
502A5p3高编程 Chinapub.com 下载 客户端不能通过浏览器打开WSC中使用的属性,这些属性也不能读写。在大多情况下, 会发现组件同客户的交互需要多一点控制。假设组件显示当前会话个数,这个值应是只读的。 如果客户能修改他,则很快就会出现错误 每个 property>标记有两个子标记:和put>。两者分别定义了读和写属性值的方 式。当需要读写属性内容时,执行二个过程中相应的一个。它们都有一个默认的名字,分别 是get和putL,加上属性的公共名称,但是二者都可通过使用前面讲到的 interalname属性进行 更改。如果省略≤get>标记,可自动使此属性只写。同理,省略标记。这个标记主要 用于定义你的wSC支持的COM接口。缺省情况下,WSC自动支持自动化( Automation)和事件 处理接口。更准确地说,当插入标记时,将自动要求支持这些接口。 个用脚本语言编写的COM对象并不能实现所有可能的COM接口。尽管这在C++和 Delphi中可以非常轻易地实现,在 Visual basic中将会稍微复杂一些,而用脚本代码几乎是无 法实现的。为了围绕这个方面展开工作,WSC依赖于名为“接口处理器”( interface handlers IH)的专用二进制模块。接口处理器由前面提及的 scrobj dI管理 接口处理器 接口处理器(IH)是一种对任何附加的非自动化COM接口提供支持的二进制模块。其结构 如图16-2所示 标准COM接口 ASP Behaviour Scrobi ddl (自动化、事件) C 图16-2接口处理器结构图 IH主要是作为wSC脚本代码和客户应用程序之间的一种中介,向客户提供给定接口的标 准的COM布局。当客户调用接口的方法时,IH检索并执行脚本代码以实现其功能 旦声明“ public>标记, scrobj dI将.自动为自动化和事件加载IH。如果需要支持附加的接 口,可以在中显式请求。也就是说,标记是一种WSC与特定的处 理器之间的联系方式。其语法如下
客户端不能通过浏览器打开 W S C中使用的属性,这些属性也不能读写。在大多情况下, 会发现组件同客户的交互需要多一点控制。假设组件显示当前会话个数,这个值应是只读的。 如果客户能修改他,则很快就会出现错误。 每个标记有两个子标记: 和。两者分别定义了读和写属性值的方 式。当需要读写属性内容时,执行二个过程中相应的一个。它们都有一个默认的名字,分别 是g e t _和p u t _,加上属性的公共名称,但是二者都可通过使用前面讲到的 i n t e r a l n a m e属性进行 更改。如果省略标记,可自动使此属性只写。同理,省略 可以使属性只读。 (4) 激发事件 在W S C中激发一个事件必须调用一个 W S C的全局函数f i r e E v e n t。这可以触发一个由其第 一个参数指定的事件,另外,还可以增加任意个参数。 3. 如果仅需要W S C提供方法、属性和事件,则不需考虑 标记。这个标记主要 用于定义你的W S C支持的C O M接口。缺省情况下, W S C自动支持自动化( A u t o m a t i o n )和事件 处理接口。更准确地说,当插入 标记时,将自动要求支持这些接口。 一个用脚本语言编写的 C O M对象并不能实现所有可能的 C O M接口。尽管这在 C + +和 D e l p h i中可以非常轻易地实现,在 Visual Basic中将会稍微复杂一些,而用脚本代码几乎是无 法实现的。为了围绕这个方面展开工作, W S C依赖于名为“接口处理器” (interface handlers, I H )的专用二进制模块。接口处理器由前面提及的 s c r o b j . d l l管理。 接口处理器 接口处理器( I H )是一种对任何附加的非自动化 C O M接口提供支持的二进制模块。其结构 如图1 6 - 2所示。 图16-2 接口处理器结构图 I H主要是作为W S C脚本代码和客户应用程序之间的一种中介,向客户提供给定接口的标 准的C O M布局。当客户调用接口的方法时, I H检索并执行脚本代码以实现其功能。 一旦声明标记,s c r o b j . d l l将自动为自动化和事件加载 I H。如果需要支持附加的接 口,可以在中显式请求。也就是说, 标记是一种W S C与特定的处 理器之间的联系方式。其语法如下: 502计计ASP 3 高级编程 下载 客 户 标准COM接口 (自动化、事件) ASP WSC Behaviour Scrobj.ddl
第6章4本组件503 下载 implements type=handler id=name"/> type属性定义IH的名称,而id是处理器自身实际使用的ID。在大多情况下可以省略id属性 在本章稍后将讨论WSC结构的内部细节。 4. 使用这个标记可以隔离wSC文件代码中所有是常量并且不想在脚本中进行硬编码的元素 (字符串和数字)。每种资源通过ID定义 Hello, world 1. 02 Place here as many comments as you like resource id=hello>Hello, world cpublic> Function Welcome MsgBox getResource('hello") End Function 上面的代码显示了另外一个标记:。顾名思义,置于这个标记中的所有文本 将被分析器忽略,可以用做源代码的注释 标记的典型用途是定义脚本中的常量。尽管更为标准且语言上更为 中性一些,但从功能上讲,使用标记同在脚本中声明一组常量并没有区别。 163.2脚本层 所有与wSC方法、属性以及辅助函数相关的函数都必须包含于标记中。其语法 HTML的标记十分相似,但不同的是前者仅需要 language属性来进行修饰。 只要安装合适的解释器,就可以在脚本组件中使用任何语言。微软仅仅提供了基于 Ⅴ SCript和 JScript的两个解释器。但是第三方厂商已经开发了用于Perl和其他语言的 Windows 脚本兼容解释器。 XML适应性 正如前面提到的,一个wSC文件基本上就是一个XML文件,遵循XML1.0规范。到此为 止,实现它仍有两件工作要做。第一件是在文件顶部加入下面一行代码以声明它为ⅩML 但是,当这样做了以后,必须将标签中的所有内容包含进来。为了防止XML解释 器对特殊字符的混淆,例如
t y p e属性定义I H的名称,而id 是处理器自身实际使用的I D。在大多情况下可以省略i d属性。 在本章稍后将讨论W S C结构的内部细节。 4. 使用这个标记可以隔离 W S C文件代码中所有是常量并且不想在脚本中进行硬编码的元素 (字符串和数字)。每种资源通过I D定义: 可以使用I D在W S C文件代码中检索信息。 I D必须传递到全局函数 g e t R e s o u r c e ( )以获得存 储的数据: 上面的代码显示了另外一个标记: 。顾名思义,置于这个标记中的所有文本 将被分析器忽略,可以用做源代码的注释。 标记的典型用途是定义脚本中的常量。尽管 更为标准且语言上更为 中性一些,但从功能上讲,使用 标记同在脚本中声明一组常量并没有区别。 16.3.2 脚本层 所有与W S C方法、属性以及辅助函数相关的函数都必须包含于 标记中。其语法与 H T M L的标记十分相似,但不同的是前者仅需要 l a n g u a g e属性来进行修饰。 只要安装合适的解释器,就可以在脚本组件中使用任何语言。微软仅仅提供了基于 V B S c r i p t和J S c r i p t的两个解释器。但是第三方厂商已经开发了用于 P e r l和其他语言的Wi n d o w s 脚本兼容解释器。 X M L适应性 正如前面提到的,一个 W S C文件基本上就是一个 X M L文件,遵循XML 1.0规范。到此为 止,实现它仍有两件工作要做。第一件是在文件顶部加入下面一行代码以声明它为 X M L。 但是,当这样做了以后,必须将 标签中的所有内容包含进来。为了防止 X M L解释 器对特殊字符的混淆,例如“ <”或“&”,可使用C D ATA分界符。 第1 6章 A S P脚本组件计计503 下载
504A5p3高程 下载 Function Welcome sgBox getResource('hello) End Function 标记,前 面两个处理器会被自动激活。后两个则需要定义一个标记
16.3.3 运行期层 为了创建一个 W S C实例,通常需要使用一个类似 V B S c r i p t的C r e a t e O b j e c t的函数并以 P r o g I D作为其第一个参数 (另外组件所安装的服务器的名称是可选的第二个参数 )。一旦调用, V B S c r i p t引擎试图定位实现组件的D L L的名称,进行下列步骤: • 在注册表中搜寻P r o g I D。 • 从P r o g I D获得组件的C L S I D。 • 在注册表中搜寻C L S I D。 • 读取可执行文件的名称。 对于W S C而言,其服务器模块总是位于 Wi n d o w s目录下的s c r o b j . d l l文件。V B S c r i p t创建 对象实例, s c r o b j . d l l将接受代表此对象的 C L S I D。现在, s c r o b j . d l l的核心代码将使用这个 C L S I D在注册表中搜寻名为S c r i p t l e t U R L的W S C键。这个键指向提供公共方法的运行期代码的 W S C文件。 W S C的运行期D L L为一个虚拟对象创建一个实例,该实例实现 W S C定义的接口并将其返 回给调用者。之后,当 V B S c r i p t代码执行一个方法时,将调用这个虚拟对象。由这个虚拟对 象从W S C源代码中提取正确的代码段,并交由 V B S c r i p t或J S c r i p t解释器执行。 改变后不用再注册 当向外界提供C O M的接口后,不会因为添加或删除其属性和方法而发生改变,也不必在 脚本代码中对发生改变的组件进行重新注册。同理,也不必在服务器脚本组件发生改变后停 止并重新启动服务器。对于代码执行,所有需要处理的事情都发生在运行期。 16.4 可用的接口 前面曾提到使用脚本语言编写 C O M对象存在着种种问题。下面,将通过了解 W S C的底层 运行进行期机制找到以上问题的答案。客户端程序将始终需要获得标准的 C O M接口,但在 C O M的标准接口背后,运行期引擎事实上是运行从分离的 W S C文件中读取的脚本代码。 很清楚,这样做的结果就是必须为通过脚本代码提供的接口提供一个二进制的中介。这 个中介就是前面所说的接口处理器。换句话说,可以通过脚本代码实现一些 C O M接口,同时 必须相应的处理器。 微软给出的有关这方面的技术指导,指出了仅有的几个可用的接口处理器: • 自动化处理器。 • 事件处理器。 • ASP处理器。 • IE 5.0行为处理器。 所有这些处理器都在s c r o b j . d l l内实现,不需其他文件支持。如果使用了 标记,前 面两个处理器会被自动激活。后两个则需要定义一个 标记。 504计计ASP 3 高级编程 下载
Chinapub.com 第6章4本组件505 下载 implements type=ASP/> 在同一个WSC文件中同时使用和标记不会出现问题。自动化处理器 和事件处理器可以同ASP处理器或行为处理器很好地共存。但是,应当避免将ASP组件同行为 处理器置于同一个WSC组件中,因为二者将会相互冲突。可以编写两个分离的WSC文件,或 者创建一个包 Package)e 包 可以在 WSC XML模式的根上找到标记。标记事实上是 标记的一个子标记。标记作为单个文件中的多组件的“容器”。唯一的附加条件是 每个包中的组件必须指定一个唯一的ID号。例如: xml version="1.0·2 ogid='My Component. One./> implements type="Behavior ent 16.5编写一个ASP脚本组件 实际上,使用脚本语言编写的ASP组件只是 Windows脚本组件(WSC)的一个特定类型。唯 的不同是它们还具有与ASP内建对象的接口,如 Response、 Request、 Session等等 当然,只有在IS或PWS地址空间中创建的对象才是可用的。为了在 VBScript代码中安全 地调用这些对象,需要对执行wsC< script代码的环境添加对它们的引用。ASP接口处理器正
在同一个W S C文件中同时使用和标记不会出现问题。自动化处理器 和事件处理器可以同A S P处理器或行为处理器很好地共存。但是,应当避免将 A S P组件同行为 处理器置于同一个W S C组件中,因为二者将会相互冲突。可以编写两个分离的 W S C文件,或 者创建一个包( P a c k a g e )。 包 可以在WSC XML模式的根上找到标记。标记事实上是 标记的一个子标记。标记作为单个文件中的多组件的“容器”。唯一的附加条件是, 每个包中的组件必须指定一个唯一的 I D号。例如: 16.5 编写一个A S P脚本组件 实际上,使用脚本语言编写的 A S P组件只是Wi n d o w s脚本组件( W S C )的一个特定类型。唯 一的不同是它们还具有与A S P内建对象的接口,如R e s p o n s e、R e q u e s t、S e s s i o n等等。 当然,只有在I I S或P W S地址空间中创建的对象才是可用的。为了在 V B S c r i p t代码中安全 地调用这些对象,需要对执行 W S C 代码的环境添加对它们的引用。 A S P接口处理器正 第1 6章 A S P脚本组件计计505 下载
506Asp高程 Chinapub.com 下载 是用来完成这项工作的 只有在特定的wSC文件中通过标记请求ASP支持时,处理器才被激活。在 最后一节中将给出其示例 165.1 Asp Table组件 现在,看看如何编写一个不同寻常的组件 AstAble。之所以把它叫作 AstAble组件是因 为它只是对HTML标签的一个包装。 通常,使用表格显示已经或尚未进行附加处理的数据库记录。例如,姓和名常被合并, 并且放置在数据库的同一栏中。 AstAble组件有一些有用的特征 为表添加列,从一个ADO记录集中获取信息。 ·定义一个动态表达式来合并几个字段,并通过一个链接或动作将它们关联起来。 为某些栏指定风格和装饰性文本(如标题、脚注等)。 在此组件中定义的公共方法如表16-1所示。 表16-1 Asp Table组件定义的公共方法及说明 用一个ADO记录集填充表 Add Column(heading, expr, style) 在表中增加一列,指定栏标题、CSS风格和每行的计算表达式 Get Texto 在页面中产生并插入用于表的HTML代码 按照组件的工作方式,这三个方法必须按一定的顺序进行调用才能正常工作。所以,在 从记录集中生成HTML表格之前,需要先完成以下工作:使用 Sets方法使ADO记录集作为数 据源工作;使用 Add Column方法添加任意多个所需要的列;最后调用组件的 Response. Write方 法,将由 Gettext方法生成的HTML文本写到输出流 AstAble组件还定义了如表16-2所示的一些公共属性。 表16-2 Asp Table组件定义的公共属性及说明 用于整个表的CCS风格的类名 HeaderStyle 用于表中所有列标题的CCS风格的类名 Title 示在表顶部的HTML文本 显示在表底部的HTML文本 Column Count 返回当前的栏数,只读 这些组件使你能够在表中显示信息,如图16-3所示。 比起编写HTML来生成表格,使用这个组件有不可比拟的便捷性,而且使用组件更利于 持久性和易读性。产生图16-3的程序代码如下 et ob]TBL· Createobject(" Asprable,WsC·) objTBL. Title =.List of contacts: objTBL. Footnote =*&RECCOUNT_ contact(s).<BR bjTBL, Tablestyle -'globTab ob]TBL. Headerstyle =header
是用来完成这项工作的。 只有在特定的W S C文件中通过标记请求A S P支持时,处理器才被激活。在 最后一节中将给出其示例。 16.5.1 AspTa b l e组件 现在,看看如何编写一个不同寻常的组件 A s p Ta b l e。之所以把它叫作 A s p Ta b l e组件是因 为它只是对H T M L 标签的一个包装。 通常,使用表格显示已经或尚未进行附加处理的数据库记录。例如,姓和名常被合并, 并且放置在数据库的同一栏中。 A s p Ta b l e组件有一些有用的特征: • 为表添加列,从一个A D O记录集中获取信息。 • 定义一个动态表达式来合并几个字段,并通过一个链接或动作将它们关联起来。 • 为某些栏指定风格和装饰性文本 (如标题、脚注等)。 在此组件中定义的公共方法如表 1 6 - 1所示。 表16-1 AspTa b l e组件定义的公共方法及说明 方 法 说 明 S e t R s (a d o R S) 用一个A D O记录集填充表 A d d C o l u m n (heading, expr, style) 在表中增加一列,指定栏标题、 C S S风格和每行的计算表达式 G e t Te x t ( ) 在页面中产生并插入用于表的 H T M L代码 按照组件的工作方式,这三个方法必须按一定的顺序进行调用才能正常工作。所以,在 从记录集中生成H T M L表格之前,需要先完成以下工作:使用 S e t R s方法使A D O记录集作为数 据源工作;使用A d d C o l u m n方法添加任意多个所需要的列;最后调用组件的 R e s p o n s e . Wr i t e方 法,将由G e t Te x t方法生成的H T M L文本写到输出流。 A s p Ta b l e组件还定义了如表1 6 - 2所示的一些公共属性。 表16-2 AspTa b l e组件定义的公共属性及说明 属 性 说 明 Ta b l e S t y l e 用于整个表的C C S风格的类名 H e a d e r S t y l e 用于表中所有列标题的C C S风格的类名 Ti t l e 显示在表顶部的H T M L文本 F o o t n o t e 显示在表底部的H T M L文本 C o l u m n C o u n t 返回当前的栏数,只读 这些组件使你能够在表中显示信息,如图 1 6 - 3所示。 比起编写H T M L来生成表格,使用这个组件有不可比拟的便捷性,而且使用组件更利于 持久性和易读性。产生图1 6 - 3的程序代码如下: 506计计ASP 3 高级编程 下载