欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP 3.0高级编程(十八)

程序员文章站 2023-03-22 09:45:50
5.2.5 引用对象类型库     在早先的asp版本中,在脚本中使用对象或时,组件内定义的公共常数(如果有的话)在asp里将不再有效。这...
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 filescommon filessystemadomsado15.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=”https://yourserver.com/components/mycomponent.cab”>
    <param name=”param1” value=”value1”>
    <param name=”param2” value=”value2”>
</object>
注意,这里出现的codebase属性,表示允许下载并安装来自url的组件(如果该组件没有安装)。ie 3.0以上的版本有此功能。
对于使用<object>元素的方法、可使用的属性、在客户端使用的值,可查看网站https://msdn.microsoft.com/workshop/author/dhtml/reference/objects/object.,或者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&nb