比较|对象|服务器|脚本
在前几章中,我们已经研究了两类不同的对象:一类是ASP对象模型的内置部分,另一类是脚本运行期库提供的对象。本章将介绍第三类能用于ASP的对象,取名为活动服务器组件(或者就称为服务器组件)。
这些组件在很多场合下就如同在浏览器或在像Visual Basic编程环境中用于客户端脚本中的传统ActiveX控件一样,但是这些组件可在服务器上运行,而不是一个只能运行在客户机上的对象。
现在的问题是:这些组件来自哪里?其中一部分是由常规的ASP/IIS安装程序提供的,而另一部分可以从Web上免费或有偿获得。本章讨论ASP的各种组件的主要用途,然后介绍可得到的其他组件的几个范例。一旦感觉到使用这些活动服务器组件得心应手,你就会毫不费力将其他供应商产品嵌入到自己的ASP页面中。本章后面有一个第三方组件的列表,本书后面还将介绍如何创建自己的组件。
还有一些用于ASP的组件,但本章不准备讨论。动态Web网站技术的基本用途之一是发布直接从数据库管理系统和其他类型的数据存储获得的信息,这一用途和从数据库或其他数据存储中收集数据和存入数据的需求,促使程序员开发服务器端编程。为了使用ASP完成这些任务,我们可以充分利用称为ActiveX数据对象(ActiveX Data Objects,ADO)库的组件集。由于它涉及的内容很多,很难在本章中阐述清楚,还要考虑的其他的组件,本书从第8章开始讲述相关的内容。
本章要讨论的内容有:
· 服务器组件与在ASP中使用的其他对象的区别。
· 简要说明如何实例化对象,并得到服务器组件的引用。
· ASP 3.0和IIS提供的可安装组件,例如AD Rotator、Content Linking、Page Counter和Tools等组件。
· 一些第三方提供的组件。
6.1 脚本对象与服务器组件的比较
前一章已说明了各种脚本对象,这些对象对于ASP/IIS来说都是从脚本运行库(scrrun.dll)中得到的,重要的是不要把这些对象与服务器组件(即本章的主题)混淆一起。
服务器组件通常在其自己的DLL或可执行文件中实现,例如本章将要讨论的“Content Linking”组件,就是由nextlink.dll实现的。一旦在服务器安装和注册这个DLL文件,那么其提供的对象就可以在ASP所支持的任何脚本语言中使用。组件与系统环境的关系如图6-1所示:
使用组件服务器组件
前一章已经介绍了对象和组件在页面中通用的实例化方法,使用服务器组件和使用脚本运行期库对象的方法完全一致,唯一的区别是,不像脚本对象,服务器组件通常作为单独的DLL文件实现,而且可能要求在使用前先运行一个安装程序,或者手工注册该组件(如果这些组件在ASP缺省安装时未注册)。
1. CreateObject方法
一般说来,可以在一个ASP页面中使用ASP内置的Server对象的CreateObject方法创建一个对象,例如:
Set objThis = Server.CreateObject("this.object") ' in VBScript
或:
var objThis = Server.CreateObject('this.object'); // in JScript
这样就在变量objThis中创建了该对象的引用,然后可以在脚本中使用该对象;换句话说,可以在代码中根据需要控制其属性及调用其方法。
2. 使用<OBJECT>元素
同样可以使用常规的<OBJECT>元素创建一个对象该方法同样适用于在Web浏览器页面中创建对象。ASP支持HTML<OBJECT>元素的特殊实现,而且我们可以使用这一方法在页面中放置一个对象。要在普通的.asp文件中定义一个组件或脚本对象的实例,使用下面语句:
<OBJECT RUNAT="SERVER" SCOPE="PAGE" ID="objThis"
CLASSID="CLSID:OACE4881-8305-11CF-9427-444553540000">
</OBJECT>
我们使用SCOPE属性来设定对象的范围,选项是“SESSION”、“APPLICATION”和“PAGE”。如果在普通的.asp文件中使用<OBJECT>元素,那么必须同时使用“PAGE”属性,并忽略SCOPE属性,因为创建的对象只能在它被实例化的页面中使用。如果在global.asa文件中使用<OBJECT>元素,则所创建的对象可在当前会话或整个应用程序中使用,因此SCOPE属性可设置为“SESSION”和“APPLICATION”。
3. 检测对象实例的存在
经常出现的错误是企图创建一个未安装(或未注册)的对象的实例,或者在CreateObject方法或<OBJECT>元素中使用错误的对象ProgID。缺省状态下,ASP会出现错误并停止页面的执行。
给页面添加一些程序代码,在访问对象之前进行检测是必要的。在VBScript中,可以做到这一点,方法是:关闭缺省的错误处理,然后使用IsObject函数查看对象是否真的引用了一个对象:
' in VBScript:
…
On Error Resume Next 'turn off default error handling
Set objThis = Server.CreateObject("this.object")
If IsObject(objThis) Then
'the CreateObject method succeeded
On Error Goto 0 'turn the default error handling back on
…
'rest of the script goes here
…
Else
Response.Write "Sorry, this page cannot be accessed at present"
Response.Flush
Response.End
End If
…
在JScript语言中,可以使用JScript 5.0脚本引擎中新的错误处理特性,这在第1章中介绍过。
// in JScript:
…
try {
var objThis = Server.CreateObject('this.object');
…
// rest of the script goes here
}
catch (exception) {
Response.Write ('Sorry, this page cannot be accessed at present');
Response.Flush();
Response.End();
}
…