chinaopub.com 第5章脚本运行期对象139 下载 如果需要会话层组件,使用可用的双线程的组件。并且如果需要应用程序层作用域,可 直使用双线程的组件 然而,微软建议避免使用会话层作用域的组件,甚至不使用应用程序层作用域的组件, 除非这些组件是绝对需要的。使组件的活动时间超过作用域为页面级的组件所要求的时间, 对于由COM+提供代理特性的对象是没有益处的。 525引用对象类型库 在早先的ASP版本中,在脚本中使用对象或组件时,组件内定义的公共常数(如果有的话) 在ASP里将不再有效。这意味着我们需要自己声明它们域等价物)并指定相应的值 例如,当在早期版本的ASP中使用 ActiveX数据库对象(ADO)组件时(将在第8章进行详细 的研究),不得不用记录集的open方法加入预定义常数声明。例如 Const adopenKeyset =&Ho001 Const adLockPesgimistic &H0003 Const adcmarable &H0002 rs Open Contact,DSN=Global ExampleData: UIDe examples Password=i", adopenKeyset, adLockPessimistic, adcmdTable 另一种方法是使用# include指令在页面插入一个名为 adovbs inc的文件。该文件由 IIS/ASP 提供,包含ADO所需的所有预定义常数。更新代码时,必须确认使用的是最新版本,并检查 它对于所有的页面请求都可用。 对于IS50,有一个更好的方法,通过在HTML注释元素内使用 METADATA指令,可以 给组件或对象的类型库增加引用(IS40不支持这一功能)。 <! - METADATA TYPE=TypeLib UUIDa'typeItbraryuuda VERSION=mayor verdon number nor_ versiona LcID=·oca1e⊥d ath and name_ of file是某一类型库文件(:b)或 ActiveX dll的绝对物理路径,必须提 供这一参数或者是 pe library_uuid参数 ype library_uuid是该类型库的唯一标识符,必须提供这一参数或者是path_and name of file参数 major version number. minor version number(可选)定义了所需组件的版本。如果没有 该版本则使用最近的版本 · locale_d(可选)是区域标志符。如果在该区域没有发现类型库,计算机将使用缺省的(安 装时定义的)区域 因此,使用这一技术,通过使用下面的代码,能使内置的ADO预定义常数在ASP页面可 <I-- METADATA TYPE=TypeLib. FILE=c: \Program Files\Common Files\ System\ado\msadol5dll 文件名 sado l5d还可用于更高版本(250以后)的ADO组件
如果需要会话层组件,使用可用的双线程的组件。并且如果需要应用程序层作用域,可 一直使用双线程的组件。 然而,微软建议避免使用会话层作用域的组件,甚至不使用应用程序层作用域的组件, 除非这些组件是绝对需要的。使组件的活动时间超过作用域为页面级的组件所要求的时间, 对于由C O M +提供代理特性的对象是没有益处的。 5.2.5 引用对象类型库 在早先的A S P版本中,在脚本中使用对象或组件时,组件内定义的公共常数 (如果有的话) 在A S P里将不再有效。这意味着我们需要自己声明它们(或等价物)并指定相应的值。 例如,当在早期版本的 A S P中使用A c t i v e X数据库对象( A D O )组件时(将在第8章进行详细 的研究),不得不用记录集的O p e n方法加入预定义常数声明。例如: 另一种方法是使用# i n c l u d e指令在页面插入一个名为 a d o v b s . i n c的文件。该文件由I I S / A S P 提供,包含A D O所需的所有预定义常数。更新代码时,必须确认使用的是最新版本,并检查 它对于所有的页面请求都可用。 对于IIS 5.0,有一个更好的方法,通过在 H T M L注释元素内使用 M E TA D ATA指令,可以 给组件或对象的类型库增加引用 (IIS 4.0不支持这一功能)。 其中: • p a t h _ a n d _ n a m e _ o f _ f i l e 是某一类型库文件(.tlb )或ActiveX DLL的绝对物理路径,必须提 供这一参数或者是t y p e _ l i b r a ry_uuid 参数。 • t y p e _ l i b r a ry _ u u i d是该类型库的唯一标识符,必须提供这一参数或者是 p a t h _ a n d _ n a m e _ o f _ f i l e参数。 • m a j o r _ v e r s i o n _ n u m b e r. m i n o r _ v e r s i o n _ n u m b e r (可选)定义了所需组件的版本。如果没有 该版本则使用最近的版本。 • locale_id (可选)是区域标志符。如果在该区域没有发现类型库,计算机将使用缺省的 (安 装时定义的)区域。 因此,使用这一技术,通过使用下面的代码,能使内置的 A D O预定义常数在 A S P页面可 用: 文件名m s a d o 1 5 . d l l还可用于更高版本( 2 . 5 0以后)的A D O组件。 第5章 脚本运行期库对象计计139 下载
140Ap高程 Chinaopub.com 下载 如果ASP不能装载类型库,就返回一个错误并停止该页的执行。可能的错误提示如表5-1 表5-1错误提示代码及说明 ASP 0222 无效的类型库说明 ASP 0223 类型库不能加载 ASP 0225 类型库不能打包(即ASP不能从指定的类型库中创建类型库包装对象) 52.6在客户端上创建对象实例 在ASP中讨论在服务器上实例化对象和组件的技术时,值得强调的是在浏览器中运行客 户端页面而完成同样工作的方式。如果你使用ASP创建包含客户端脚本程序的页面,或者使 用< OBJECT>元素创建客户端组件实例,将会发现这是非常有用的。在大多数情况下,脚本 运行期对象可在客户端上实例化和使用,效果与服务器上的ASP相同 1. VBScript CreateObject方法 在客户端使用 CreateObjecth时,在浏览器的环境内创建组件或对象实例,它们与浏览器运 行在相同的内存空间里(即进程内),除非实现的对象是带有exe扩展文件名的可执行文件 通常指定对象的 ClassID,而不是使用 ProgID字符串,这样就不可能与其他安装在客户端 的对象发生冲突 <SCRIPT LANGUAGE=VBScript'> im obi This Set objThis Createobject("clsid: 892D6DA7-E0F9-11D2-B2E9-00105A42AF30 /SCRIPT 当然也可以使用 ProgID,并且使用通用的对象或组件(特别是标准安装提供的对象或组件) 那么得到错误的组件的风险是很小的 <SCRIPT LANGUAGE='VBScript'> Dim ob]This Set objThis- Createobject("Scripting Dictionary ' </SCRIPT 2. JScript ActiveXObject方法 为了在客户端上实例化 JScript的对象和组件,必须使用 ActiveXObject方法和new操作符: < SCRIP LANGUAC ew Activexobject('clsid: 892D6DA7-E0F9-11D2-B2E9-00105A42AF30') / SCRIPT> <SCRIP UAGE=JScript> var ta new Activexobject('this. object'); 3.< OBJECT>元素技术 也可使用< OBJECT>元素创建客户端对象或组件的实例。应省略 RUNAT属性或者将其设
如果A S P不能装载类型库,就返回一个错误并停止该页的执行。可能的错误提示如表 5 - 1 所示。 表5-1 错误提示代码及说明 错 误 说 明 ASP 0222 无效的类型库说明 ASP 0223 未找到类型库 ASP 0224 类型库不能加载 ASP 0225 类型库不能打包(即A S P不能从指定的类型库中创建类型库包装对象 ) 5.2.6 在客户端上创建对象实例 在A S P中讨论在服务器上实例化对象和组件的技术时,值得强调的是在浏览器中运行客 户端页面而完成同样工作的方式。如果你使用 A S P创建包含客户端脚本程序的页面,或者使 用< O B J E C T >元素创建客户端组件实例,将会发现这是非常有用的。在大多数情况下,脚本 运行期对象可在客户端上实例化和使用,效果与服务器上的 A S P相同。 1. VBScript CreateObject 方法 在客户端使用C r e a t e O b j e c t时,在浏览器的环境内创建组件或对象实例,它们与浏览器运 行在相同的内存空间里(即进程内),除非实现的对象是带有. e x e扩展文件名的可执行文件。 通常指定对象的C I a s s I D,而不是使用P r o g I D字符串,这样就不可能与其他安装在客户端 的对象发生冲突。 当然也可以使用P r o g I D,并且使用通用的对象或组件 (特别是标准安装提供的对象或组件 ), 那么得到错误的组件的风险是很小的: 2. JScript ActiveXObject方法 为了在客户端上实例化J S c r i p t的对象和组件,必须使用A c t i v e X O b j e c t方法和n e w操作符: 或: 3. <OBJECT>元素技术 也可使用< O B J E C T >元素创建客户端对象或组件的实例。应省略 R U N AT属性或者将其设 140计计ASP 3 高级编程 下载
hinaopub.com 141 下载 第5章脚本运行期库对象 定为“ CLIENT”。然而,这个属性在客户端上是被忽略的,因此设置这个属性的唯一目的就 是,在ASP页面使用< OBJECT>元素实例化服务器端的组件实例时防止混淆 OBJECT ID='ob]This RUNAT="CLIENT CLASSID="clsid: 892D6DA7-EOF9-11D2-B2E9-00105A42AF30 OdebAse-hTtp://yourserver.com/components/'mycomponent.cab'> RAM NAME=" param1· VALUE="va工ue1"> RAM NAME="param2 VALUE=*value2> 注意,这里出现的 CODEBASE属性,表示允许下载并安装来自URL的组件(如果 该组件没有安装)。正E3.0以上的版本有此功能 对于使用COBJECT>元素的方法、可使用的属性、在客户端使用时的值,可查看网站http // msdn. microsoft. com/workshop/author/dhtml/reference/objects/OBJECT. asp, ai# Window 2000 Platform SDK文档中的< OBJECT>tags”,或者看看《 IES Dynamic HTML Programme Reference》一书,ISBN1-861001-74-6,wrox出版社。 5.3 Scripting Dictionary.对象 许多 Microsoft的编程语言,如 Visual basic、 SCript和 JScript,都提供集合( collection) 可以把集合想象为数组,可以使用其中内建的函数完成存储和操纵数据等基本任务。无须担 心数据是在哪些行列,而是使用唯一的键进行访问。 VBScript和 JScript都提供类似的对象,通称 Scripting. Dictionary对象或 Dictionary对象。它 类似于二维数组,把键和相关条目的数据存放在一起。然而真正的面向对象的方式,不应直 接访问数据条目,必须使用 Dictionary对象支持的方法和属性来实现。 本章提供了一些示例页面,允许试验脚本运行期对象的方法和属性。这些实例 在下载的文件的 Chaper05子目录里 531创建和使用 Dictionary对象 创建一个 Dictionary对象的示例如下: In vBScript: Dim objMyData Set objMy Data Server Createobject(*Scripting Dictionary) / In JScript: ject('Scriptin th an oBjecT element -- <OBJECT SERVER SCOPE="PAGE·ID=” objMy Data Scripting Dictionary"> Dictionary对象还可用于客户端的IE中 l. Dictionary对象的成员概要 表5-2和表5-3列出了 Dictionary对象的属性和方法及相应的说明。 当增加一个键/条目对时,如果该键已存在:或者删除一个键/条目对时,该关键字 /条目对不存在;或改变已包含数据的 Dictionary对象的 CompareMode,都将产生错误
定为“C L I E N T”。然而,这个属性在客户端上是被忽略的,因此设置这个属性的唯一目的就 是,在A S P页面使用< O B J E C T >元素实例化服务器端的组件实例时防止混淆。 注意,这里出现的C O D E B A S E属性,表示允许下载并安装来自 U R L的组件(如果 该组件没有安装)。IE 3.0以上的版本有此功能。 对于使用< O B J E C T >元素的方法、可使用的属性、在客户端使用时的值,可查看网站 h t t p: / / m s d n . m i c r o s o f t . c o m / w o r k s h o p / a u t h o r / d h t m l / r e f e r e n c e / o b j e c t s / O B J E C T. a s p,或者Wi n d o w s 2000 Platform SDK文档中的< O B J E C T > t a g s”,或者看看《IE5 Dynamic HTML Programmer' R e f e r e n c e》一书, ISBN 1-861001-74-6,Wrox 出版社。 5.3 Scripting.Dictionary对象 许多M i c r o s o f t的编程语言,如Visual Basic、V B S c r i p t和J S c r i p t,都提供集合( c o l l e c t i o n )。 可以把集合想象为数组,可以使用其中内建的函数完成存储和操纵数据等基本任务。无须担 心数据是在哪些行列,而是使用唯一的键进行访问。 V B S c r i p t和J S c r i p t都提供类似的对象,通称 S c r i p t i n g . D i c t i o n a r y对象或D i c t i o n a r y对象。它 类似于二维数组,把键和相关条目的数据存放在一起。然而真正的面向对象的方式,不应直 接访问数据条目,必须使用 D i c t i o n a r y对象支持的方法和属性来实现。 本章提供了一些示例页面,允许试验脚本运行期对象的方法和属性。这些实例 在下载的文件的C h a p e r 0 5子目录里。 5.3.1 创建和使用D i c t i o n a r y对象 创建一个D i c t i o n a r y对象的示例如下: D i c t i o n a r y对象还可用于客户端的I E中。 1. Dictionary对象的成员概要 表5 - 2和表5 - 3列出了D i c t i o n a r y对象的属性和方法及相应的说明。 当增加一个键/条目对时,如果该键已存在;或者删除一个键/条目对时,该关键字 /条目对不存在;或改变已包含数据的D i c t i o n a r y对象的C o m p a r e M o d e,都将产生错误。 第5章 脚本运行期库对象计计141 下载
142Ap高程 Chinaopub.com 下载 表5-2 Dictionary对象的属性和说明 CompareMode (仅用于 VBScript)设定或返回键的字符串比较模式 Count 只读。返回 Dictionary里的键/条目对的数量 设定或返回指定的键的条目值 Key(key) 设定键值 表5-3 Dictionary对象的方法和说明 Add(key, item) 增加键/条目对到 Dictionary Exists(key) 如果指定的键存在,返回True,否则返回 False Items() 返回一个包含 Dictionary对象中所有条目的数组 Keys) 返回一个包含 Dictionary对象中所有键的数组 Remove(key) 删除一个指定的键/条目对 RemoveAll o) 删除全部键/条目对 2.对 Dictionary中增加和删除条目 旦得到一个新的(空的) Dictionary,可以对其添加条目,从中获取条目以及删除条目: ob Data Add 'MyKey,'MyItem Add value MyItem with key MyKe objMy Data Add *Yourkey, "YourItem Add value YourItem with key Yourkey bInIsThere objMyData Exists('MyKey''ReturnB True because the item asta strItem= objMy Data Item(Yourkey) Retrieve value of Yourkey strItem objMy Data Remove('My Key') Retrieve and remove Yourkey ob] Data. RemoveAll Rem。vea11 the ite 在 JScript中,等价的代码为 / In JScript: objMy Data Add('MyKey', 'MyItem') // Add value MyItem with key MyKey objMy Data Add('YourKey','YourItem / Add value YourItem with key Your key ar blnIsThere objMy Data Exists(' MyKey '); / true because the item exista var strItem m objMy Data Item('YourKey); / Retrieve value of YourKey var strItem objMy Data Remove('MyKey);// Retrieve and remove Yourkey objMyData. RemoveAll() / Remove all the items 3.修改键或条目的值 可以通过修改键的值,或通过修改与特定的键关联的条目的数据,来改变存储在 Dictionary内的数据。下面的代码改变键为 My Key的条目中的数据 objMy Data Item('MyKey)=NewValue In VBScript objMy Data Item(' ')-'NewValue': / In JScript 如果指定的键在 Dictionary未找到,将在 Dictionary中创建一个以 My Key为键,以 New value为其条目值的新的键/条目对。有意思的是,如果使用一个不存在的键来检索条目 不仅得到一个空的字符串(这是可以想到的),而且还在 Dictionary里添加一个新的键/条目对, 键即是指定的键,但条目的数据为空 可以使用Key属性仅改变键的值而不改变与之对应的条目的数据。将一个已存在的键 MyKey改变为 MyNewKey,可以用
表5-2 Dictionary对象的属性和说明 属 性 说 明 C o m p a r e M o d e (仅用于V B S c r i p t )设定或返回键的字符串比较模式 C o u n t 只读。返回D i c t i o n a r y里的键/条目对的数量 I t e m (k e y) 设定或返回指定的键的条目值 K e y (k e y) 设定键值 表5-3 Dictionary对象的方法和说明 方 法 说 明 A d d (k e y, item) 增加键/条目对到D i c t i o n a r y E x i s t s (k e y) 如果指定的键存在,返回 Tr u e,否则返回F a l s e Items( ) 返回一个包含D i c t i o n a r y对象中所有条目的数组 Keys( ) 返回一个包含D i c t i o n a r y对象中所有键的数组 R e m o v e (k e y) 删除一个指定的键/条目对 RemoveAll ( ) 删除全部键/条目对 2. 对D i c t i o n a r y中增加和删除条目 一旦得到一个新的(空的) Dictionary,可以对其添加条目,从中获取条目以及删除条目: 在J S c r i p t中,等价的代码为: 3. 修改键或条目的值 可以通过修改键的值,或通过修改与特定的键关联的条目的数据,来改变存储在 D i c t i o n a r y内的数据。下面的代码改变键为 M y K e y的条目中的数据。 如果指定的键在 D i c t i o n a r y未找到,将在 D i c t i o n a r y中创建一个以 M y K e y为键,以 N e w Va l u e为其条目值的新的键 /条目对。有意思的是,如果使用一个不存在的键来检索条目, 不仅得到一个空的字符串 (这是可以想到的 ),而且还在D i c t i o n a r y里添加一个新的键 /条目对, 键即是指定的键,但条目的数据为空。 可以使用 K e y属性仅改变键的值而不改变与之对应的条目的数据。将一个已存在的键 M y K e y改变为M y N e w K e y,可以用: 142计计ASP 3 高级编程 下载
Chinapub.com 第5章脚本运行期库对象 143 下载 objMyData. Key('Mykey)w"MyNewKey In VBScript 如果指定的键未找到,则产生运行期错误。 4.设置比较模式 Dictionary的 CompareMode属性仅适用于 VBScript,不能在 JScript中使用。当比较字符串 键时,允许指定比较的方式。两个允许的值为 Binary Compare(0)和 TextCom pare(1) Binary Compare(O)为二进制数对照(即区分大小写); TextCompare(1)为文本对照(即不区分大小 5.遍历 Dictionary 研究 Dictionary时,有两个方法和一个属性需要特别注意,它们允许我们遍历存储在 Dictionary里的所有键/条目对。 Items方法用一个一维数组的形式返回 Dictionary里所有的条目 数据,而keys方法用一个一维数组返回所有已存在的键值。可以使用 Count属性得到键或条目 的数量 例如,可以使用下列代码得到名称为 bjMyData的 Dictionary中所有的键和条目值。注意, 虽然 Count属性保存了在 Dictionary里的键/条目数量,但Ⅴ SCript和 JScript的数组总是从下标0 开始的。因此,数组下标应从0到 Count-1。 In vBScript: arrKeys objMy Data keys Get all the keys into an array arrItems w objMy Data. Items 'Get all the items into an array For intLoop =0 To objMyData, Count -1 'Iterate through the array strThisKey arrkeys (intLoop) 咄h"th·keyv1ue sErThisIt *ThiB 18, the item (data)value / In JScript: VB-Btyle using the Keys()and Items()methods ray (obyMy Data Keys()).toArray ()1 Array(objMy Data. Items ()) toArray(); tloop =0; intLoop ob]MyData Count; intLoop++)( erate through the a chi skey arrKeys[intLoopl; №⊥ the key va】ue lisTen /4 the item (data) value 在 VBScript里也可以使用 For each Next语句完成同样的功能 Iterate the dictionary as a collection in VBScript frItes Net esponse. Write objItem,=·岳 ariteus( objItem)k·<BR 532 Dictionary对象示例 本书提供了一系列示例文件可用来试验脚本运行时间库的各种属性。 本章代码的缺省页面提供了一系列可使用的 SCript示例链接。有些示例对 JScript同样有 效。这些示例存放在 Chapter目录下相应的子目录里,显示的界面如图5-2所示
如果指定的键未找到,则产生运行期错误。 4. 设置比较模式 D i c t i o n a r y的C o m p a r e M o d e属性仅适用于V B S c r i p t,不能在J S c r i p t中使用。当比较字符串 键时,允许指定比较的方式。两个允许的值为 B i n a r y C o m p a r e ( 0 )和Te x t C o m p a r e ( 1 )。 B i n a r y C o m p a r e ( 0 )为二进制数对照(即区分大小写);Te x t C o m p a r e ( 1 )为文本对照(即不区分大小 写)。 5. 遍历D i c t i o n a r y 研究D i c t i o n a r y时,有两个方法和一个属性需要特别注意,它们允许我们遍历存储在 D i c t i o n a r y里的所有键/条目对。I t e m s方法用一个一维数组的形式返回 D i c t i o n a r y里所有的条目 数据,而k e y s方法用一个一维数组返回所有已存在的键值。可以使用 C o u n t属性得到键或条目 的数量。 例如,可以使用下列代码得到名称为 b j M y D a t a的D i c t i o n a r y中所有的键和条目值。注意, 虽然C o u n t属性保存了在D i c t i o n a r y里的键/条目数量,但V B S c r i p t和J S c r i p t的数组总是从下标0 开始的。因此,数组下标应从 0到Count - 1。 在V B S c r i p t里也可以使用For Each...Next 语句完成同样的功能: 5.3.2 Dictionary对象示例 本书提供了一系列示例文件可用来试验脚本运行时间库的各种属性。 本章代码的缺省页面提供了一系列可使用的 V B S c r i p t示例链接。有些示例对J S c r i p t同样有 效。这些示例存放在C h a p t e r 0 5目录下相应的子目录里,显示的界面如图 5 - 2所示。 第5章 脚本运行期库对象计计143 下载