欢迎光临
我们一直在努力

ASP 3.0高级编程(十八)

建站超值云服务器,限时71元/月

5.2.5 引用对象类型库

在早先的asp版本中,在脚本中使用对象或组件时,组件内定义的公共常数(如果有的话)在asp里将不再有效。这意味着我们需要自己声明它们(或等价物)并指定相应的值。

例如,当在早期版本的asp中使用activex数据库对象(ado)组件时(将在第8章进行详细的研究),不得不用记录集的open方法加入预定义常数声明。例如:

const adopenkeyset = &h0001

const adlockpessimistic = &h0003

const adcmdtable = &h0002



rs.open “contact”,”dsn=globalexampledata;uid=examples;password=;”, _

adopenkeyset, adlockpessimistic, adcmdtable



另一种方法是使用#include指令在页面插入一个名为adovbs.inc的文件。该文件由iis/asp提供,包含ado所需的所有预定义常数。更新代码时,必须确认使用的是最新版本,并检查它对于所有的页面请求都可用。

对于iis 5.0,有一个更好的方法,通过在html注释元素内使用metadata指令,可以给组件或对象的类型库增加引用(iis 4.0不支持这一功能)。

<!– metadata type=”typelib”

file=”path_and_name_of_file”

uuid=”type_library_uuid”

verssion=”major_version_number.minor_version_number”

lcid=”locale_id”

–>

其中:

· path_and_name_of_file是某一类型库文件(.tlb)或activex dll的绝对物理路径,必须提供这一参数或者是type_library_uuid参数。

· type_library_uuid是该类型库的唯唯一标识符,必须提供这一参数或者是path_and_name_of_file参数。

· major_version_number.minor_version_number(可选)定义了所需组件的版本。如果没有该版本则使用最近的版本。

· locale_id(可选)是区域标志符。如果在该区域没有发现类型库,计算机将使用缺省的(安装时定义的)区域。

因此,使用这一技术,通过使用下面的代码,能使内置的ado预定义常数在asp页面可用:

<!– metadata type=”typelib”

file=”c:\program files\common files\system\ado\msado15.dll”

–>

文件名msado15.dll还可用于更高版本(2.50以后)的ado组件。

如果asp不能装载类型库,就返回一个错误并停止该页的执行。可能的错误提示如表5-1所示:

表5-1 错误提示代码及说明

错 误 说 明

asp 0222 无效的类型库说明

asp 0223 未找到类型库

asp 0224 类型库不能加载

asp 0225 类型库不能打包(即asp不能从指定的类型库中创建类型库包装对象)

5.2.6 在客户端上创建对象实例

在asp中讨论在服务器上实例化对象和组件的技术时,值得强调的是在浏览器中运行客户端页面而完成同样工作的方式。如果你使用asp创建包含客户端脚本程序的页面,或者使用<object>元素创建客户端组件实例,将会发现这是非常有用的。在大多数情况下,脚本运行期对象可在客户端上实例化和使用,效果与服务器上的asp相同。

1. vbscript createobject方法

在客户端使用createobject时,在浏览器的环境内创建组件或对象实例,它们与浏览器运行在相同的内存空间里(即进程内),除非实现的对象是带有.exe扩展文件名的可执行文件。

通常指定对象的classid,而不是使用progid字符串,这样就不可能与其他安装在客户端的对象发生冲突。

<script language=”vbscript”>

dim objthis

set objthis = createobject(“clsid:892d6da7-e0f9-00105a42af30”)



</script>

当然也可以使用progid,并且使用通用的对象或组件(特别是标准安装提供的对象或组件),那么得到错误的组件的风险是很小的:

<script language=”vbscript”>

dim objthis

set objthis = createobject(“scripting.dictionary”)



</script>

2. jscript activexobject方法

为了在客户端上实例化jscript的对象和组件,必须使用activexobject方法和new操作符:

<script language=”jscript”>

var objmydata = new activexobject(‘clsid: 892d6da7-e0f9-00105a42af30’);

</script>

或:

<script language=”jscript”>

var objmydata = new activexobject(‘this.object’);

</script>

3. <object>元素技术

也可使用<object>元素创建客户端对象或组件的实例。应省略runat属性或者将其设定为“client”。然而,这个属性在客户端上是被忽略的,因此设置这个属性的唯一目的就是,在asp页面使用<object>元素实例化服务器端的组件实例时防止混淆。

<object id=”objthis” runat=”client”

classid=”clsid: 892d6da7-e0f9-00105a42af30”

codebase=”http://yourserver.com/components/mycomponent.cab”>

<param name=”param1” value=”value1”>

<param name=”param2” value=”value2”>

</object>

注意,这里出现的codebase属性,表示允许下载并安装来自url的组件(如果该组件没有安装)。ie 3.0以上的版本有此功能。

对于使用<object>元素的方法、可使用的属性、在客户端使用的值,可查看网站http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/object.asp,或者windows 2000 platform sdk文档中的<object> tags,或者看看《ie5 dynamic html programmer’ reference》一书,isbn 1-861001-74-6,wrox出版社。

5.3 scripting.dictionary对象

许多microsoft的编程语言,如visual basic、vbscript和jscript,都提供集合(collection)。可以把集合想象为数组,可以使用其中内建的函数完成存储和操纵数据等基本任务。无须担心数据是在哪些行列,而是使用唯一的键进行访问。

vbscript和jscript都提供类似的对象,通称scripting.dictionary对象或dictionary对象。它类似于二维数组,把键和相关条目的数据存放在一起。然而真正的面向对象的方法,不应直接访问数据条目,必须使用dictionary对象支持的方法和属性来实现。

本章提供了一些示例页面,允许试验脚本运行期对象的方法和属性。这些实例在下载的文件的文件的chaper05子目录里。

5.3.1 创建和使用dictionary对象

创建一个dictionary对象的示例如下:

‘in vbscript:

dim objmydata

set objmydata = server.createobject(“scripting.dictionary”)

//in jscript:

var objmydata = server.createobject(‘scripting.dictionary’);

<!– server-side with an object element –>

<object runat=”server” scope=”page” id=”objmydata”

progid=”scripting.dictionary”>

</object>

dictionary对象还可用于客户端的ie中。

1. dictionary对象的成员概要

表5-2和表5-3列出了dictionary对象的属性和方法及相应的说明。

当增加一个键/条目对时,如果该键已存在;或者删除一个键/条目对时,该关键字/条目对不存在,或改变已包含数据的dictionary对象的comparemode,都将产生错误。

表5-2 dictionary对象的属性和说明

属 性 说 明

comparemode (仅用于vbscript)设定或返回键的字符串比较模式

count 只读。返回dictionary里的键/条目对的数量

item(key) 设定或返回指定的键的条目值

key(key) 设定键值

表5-3 dictionary对象的方法和说明

方 法 说 明

add(key,item) 增加键/条目对到dictionary

exists(key) 如果指定的键存在,返回true,否则返回false

items() 返回一个包含dictionary对象中所有条目的数组

keys() 返回一个包含dictionary对象中所有键的数组

remove(key) 删除一个指定的键/条目对

removeall() 删除全部键/条目对

2. 对dictionary中增加和删除条目

一旦得到一个新的(空的)dictionary,可以对其添加条目,从中获取条目以及删除条目:

‘ in vbscript:

objmydata.add “mykey”, “myitem” ‘add value myitem with key mykey

objmydata.add “yourkey”, ”youritem” ‘add value youritem with key yourkey

blnisthere = objmydata.exists(“mykey”) ‘returns true because the item exists

stritem = objmydata.item(“yourkey”) ‘retrieve value of yourkey

stritem = objmydata.remove(“mykey”) ‘retrieve and remove yourkey

objmydata.removeall ‘remove all the items

在jscript中,等价的代码为:

// in jscript;

objmydata.add (‘mykey’, ‘myitem’); //add value myitem with key mykey

objmydata.add (‘yourkey’, ‘youritem’); //add value youritem with key yourkey

var blnisthere = objmydata.exists(‘mykey’); //returns true because the item exists

var stritem = objmydata.item(‘yourkey’); //retrieve value of yourkey

var stritem = objmydata.remove(‘mykey’); //retrieve and remove yourkey

objmydata.removeall(); //remove all the items

3. 修改键或条目的值

可以通过修改键的值,或通过修改与特定的键关联的条目的数据,来改变存储在dictionary内的数据。下面的代码改变键为mykey的条目中的数据。

objmydata.item(“mykey”) = “newvalue” ‘ in vbscript

objmydata.item(‘mykey’) = ‘newvalue’; // in jscript

如果指定的键在dictionary未找到,将在dictionary中创建一个以mykey为键,以new value为其条目值的新的键/条目对。有意思的是,如果使用一个不存在的键来检索条目,不仅得到一个空的字符串(这是可以想到的),而且还在dictionary里添加一个新的键/条目对,键即是指定的键,但条目的数据为空。

可以使用key属性仅改变键的值而不改变与之对应的条目的数据。将一个已存在的键mykey改变为mynewkey,可以用:

objmydata.key(“mykey”) = “mynewvalue” ‘ in vbscript

objmydata.item(‘mykey’) = ‘mynewvalue’; // in jscript

如果指定的键未找到,则产生运行期错误。

4. 设置比较模式

dictionary的comparemode属性仅适用于vbscript,不能在jscript中使用。当比较字符串键时,允许指定比较的方式。两个允许的值为binarycompare(0)和textcompare(1)。binarycompare(0)为二进制数对照(即区分大小写);textcompare(1)为文本对照(即不区分大小写)。

5. 遍历dictionary

研究dictionary时,有两个方法和一个属性需要特别注意,它们允许我们遍历存储在dictionary里的所有键/条目对。items方法用一个一维数组的形式返回dictionary里所有的条目数据,而keys方法用一个一维数组返回所有已存在的键值。可以使用count属性得到键或条目的数量。

例如,可以使用下列代码得到名称为objmydata的dictionary中所有的键和条目值。注意,虽然count属性保存了在dictionary里的键/条目数量,但vbscript和jscript的数组总是从下标0开始的。因此,数组下标应从0到count-1。

‘in vbscript:

arrkeys = objmydata.keys ‘get all the keys into an array

arritems = objmydata.items ‘get all the items into an array

for intloop = 0 to objmydata.count –1 ‘iterate through the array

strthiskey = arrkeys(intloop) ‘this is the key value

strthisitem = arritems(intloop) ‘this is the item (data) value

next

// in jscript

// get vb-style arrays using the keys() and items() methods

var arrkeys = new vbarray(objmydata.keys()).toarray();

var arritems = new vbarray(objmydata.items()).toarray();

for (intloop = 0; intloop < objmydata.count; intloop++) {

// iterate through the arrays

strthiskey = arrkeys[intloop]; // this is the key value

strthisitem = arritems[intloop]; // this is the item (data) value

}

在vbscript里也可以使用for each … next语句完成同样的功能:

‘ iterate the dictionary as a collection in vbscript

for each objitem in arritems

response.write objitem & “ = “ & arritems(objitem) & “<br>”

next

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP 3.0高级编程(十八)
分享到: 更多 (0)