第6章 活动服务器组件
在前几章中,我们已经研究了两类不同的对象:一类是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所示:
图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();
}
…
6.2 ASP/IIS可安装组件
ASP/IIS的标准安装包括一系列服务器组件,这些组件在IIS文档中被描述为可安装组件(installable component),尽管缺省状态下它们是安全安装。但也有可能这个名称仅仅是沿用ASP的前几个版本中的名字。在以前版本中,这些组件需要人工安装。现在,如果要给它们起个合适的名称,可称为“可实例化的组件”。
需要注意的是,在第8章将介绍一个特定的可安装组件,即ADO组件。后面的章节中使用的其他组件都是作为特定的服务或服务器应用程序的一部分而安装的。例如协作数据对象(Collaborative Date Objects,简称CDO和CDONTS)组件,用于邮件服务器和电子邮件消息。本章的其余部分将讨论,如何使用其他通用性较强的组件为Web网站或Intranet提供增强功能。
在Windows 2000中的WinNT\System32\intesrv\目录下可找到这些ASP可安装组件,该目录也放置一些组件要求的配置文件。下面按字母顺序列出了一些组件。
· Ad Rotator组件用于控制可点击图像的出现,如广告或标题。使用存储在配置文件中的信息,Ad Rotator能够依据配置文件规定的比率显示不同的图像,同时也具备把可点击的广告重新定位到相应的URL以及记录图像点击次数的特性。
· Browser Capabilities组件使用UserAgent字符串,该字符串由浏览器发往服务器,用来识别相应的浏览器。它提供了反映特定浏览器功能的一系列属性,例如是否支持脚本、cookie或Java小程序。
· Content Linking组件用于提供一系列方便导航的页面,这些页面可被改变或更新而不必编辑各个页面。该组件采用一个文本文件(含有页面URL和显示顺序),使创建按指定顺序链接起来的一些页面很容易。
· Content Rotator组件采用一种配置文件来指定插入到其他页面中的HTML、文本或程序代码,根据配置文件指定的情况,显示内容的任何部分。
· Counters组件能够创建、递增和永久地存储各个在脚本代码中使用的整数计数器的数值。
· Logging Utility组件提供对Web服务器日志文件的访问,并且允许在一个ASP页面内读取和更新这些数据。这是Windows 2000中随IIS 5.0和ASP 3.0新增的特性。
· MyInfo组件为可在整个网站内访问的名称/值对的存储提供了一个存储空间,这些数据在服务器上以XML格式的文本文件存储(不同于应用程序作用域,这些数据在Web网站范围之外仍然保留)。
· Page Counter组件记录访问一个页面的次数,可以用于跟踪页面的点击次数。
· Permission Checker组件有助于防止当一个用户试图访问没有正确的权限设置的资源时引起的脚本错误。
· Tools组件提供了一些在页面中可以采用的方法,这些方法用于检验一个文件是否存在、处理HTML窗体、生成一个随机整数。另外还有一些用在Macintosh苹果计算机上的方法,可以检查是否存在某个服务器插件程序,检查当前用户是否为网站拥有者。
另外一个由IIS/ASP提供的组件,即Status组件,只能用于Macintosh计算机的个人Web服务器上。本书没有涉及该组件,若要详细了解该组件,可通过HTTP://localhost/iis/htm/asp/complqt0.htm查阅ASP/IIS提供的IIS 5.0文档。
6.2.1 使用示例页面
本书已经提供了一系列的示例页面来说明所有这些组件的用法。
可以从Wrox Web网站上下载这些实例页面,并在自己的计算机上运行。在下载的文件的Chapter06子目录中会找到本章所用的程序代码。
在运行示例页面之前,确保MyInfo和Counter组件的“全局”实例化代码已包含在缺省Web站点的global.asa文件中。在示例文件中提供了global.asa文件中所需要的代码,可以将这些代码加到现有的global.asa文件中,不需要更换整个文件。
<!-- declare instance of the ASP Counters component with application-level scope
-->
<OBJECT ID="objCounters" RUNAT="Server" SCOPE="Application"
PROGID="MSWC.Counters">
</OBJECT>
<!-- declare instance of the ASP MyInfo component with application-level scope
-->
<OBJECT ID="objMyInfo" RUNAT="Server" SCOPE="Application" PROGID="MSWC.MyInfo">
</OBJECT>
示例文件的主菜单页面(Default.asp)使用Content Linking组件创建到每一个页面示例的链接。因此,我们将首先研究这个组件,也涉及了Ad Rotator和Counters组件的有关问题。
6.2.2 Content Linking组件
Content Linking组件对网站是非常有用的工具,它提供了内容页面,或者包含对同一站点上其他页面的链接列表的页面。它自动把当前显示页面的URL与存储在服务器里的文本文件的页面列表匹配起来并且能允许用户通过页面列表按正反顺序进行浏览。也就是说,即使访问者已经在内容页面中点击了一个链接并且正在查看列表中的某一个页面,该组件仍然会辨认出所访问的页面在列表中的位置。
因为所有详细资料均在一个文本文件中,维护网站以及页面的链接仅仅需要编辑这个文本文件。例如可以通过在内容链接列表文件中重新排列页面的顺序,来改变它们的显示顺序。
1. 内容链接列表的文件
内容链接列表文件包括一个简单的按显示顺序排列的URL列表,同时也提供了相应的描述,用于在内容页面中显示链接文本。如果需要,还可以增加对每个页面的注释,注释可以帮助识别链接,但对访问者来说注释是不可见的。
列表文件对于每个页面包含一个文本行。每一行由URL、描述和注释所组成,各部分由Tab字符(不是空格,否则文件将不能工作)分隔,最后有回车结束。例如:
newpages.htm New additions to our site we update this weekly
offers.htm Special Offers for this week we only update this monthly
register.htm Registration for new users
main.htm The main forum and chat area must be registered first
index.htm Back to the contents page
请注意目标URL必须由一个相对的虚拟或物理的路径来说明,诸如forum\enter.htm。URL不能使用“http:”、“//”或者“\\”作为开头,如果要创建上述这样含有绝对URL的菜单,可以使用ASP建立一个重新定向页面,而且在内容链接列表文件中对其进行指定,例如,建立一个名为redirect.asp的页面,包含如下代码:
<%
'redirect the request to the site specified in the query string
Response.Clear
Response.Redirect Request.QueryString("url")
%>
可以在内容链接列表文件中按下述方式使用redirect.asp文件:
redirect.asp?url=http://www.cyscape.com/ CyScape BrowserHawk Web Pages
redirect.asp?url=http://www.softartisans.com/ SA fileUp Component Pages
redirect.asp?url=http://www.stonebroom.com/swindex.htm Stonebroom RegEx Pages
2. Content Linking组件的成员
Content Linking组件提供了八种方法,如表6-1所示。这些方法能够检索来自内容链接列表文件的条目,既能相对于当前页面检索条目,也可以使用索引号检索绝对条目。第一个条目的索引号是1。
表6-1 Content Linking组件的方法及说明
方 法
说 明
GetListCount(links_file)
返回文件links_file中条目的数量
GetListIndex(links_file)
返回文件links_file中当前页面的索引号
GetNextURL(links_file)
返回文件links_file中下个页面的URL
GetNextDescription(links_file)
返回文件links_file中下个页面的描述
GetPreviousURL(links_file)
返回文件links_file中前一个页面的URL
GetPreviousDescription(links_file)
返回文件links_file中前一个页面的描述
GetNthURL(links_file,n)
返回文件links_file中第n个页面的URL
GetNthDescription(links_file,n)
返回文件links_file中第n个页面的描述
如果当前页面不在内容链接列表文件中,则:
· GetListIndex返回0。
· GetNextURL和GetNextDescription返回列表文件中最后一个页面的URL和描述。
· GetPreviousURL和GetPreviousDescription返回列表文件中第一个页面的URL和描述。
3. 使用Content Linking组件
一旦创建了自己的内容链接文件,就可以把该组件添加到页面中。这里有一个典型的示例,它遍历内容链接文件中的所有条目,并且创建一个页面列表(以超链接表示页面)。
<% ' in VBScript:
Set objNextLink = Server.CreateObject("MSWC.Nextlink")
%>
<UL>
<%
'get the number of entries in the menu file
intCount = objNextLink.GetListCount("contlink.txt")
'loop through the entries
For intLoop = 1 To intCount %>
<LI>
<A HREF="<% = objNextLink.GetNthURL("contlink.txt", intLoop) %>">
<% = objNextLink.GetNthDescription("contlink.txt", intLoop) %>
</A>
<%
Next
%>
</UL>
这段代码首先创建了一个Content Linking对象。在普通的<UL>和</UL>标记之间,使用Content Linking对象的GetListCount方法查找在内容链接列表文件有多少条目。然后再遍历这些条目,对于每一个条目在页面中放入一个<LI>标记,后面跟着一个<A>标记。HREF属性的值从列表文件中使用GetNthURL方法检索得到,用作链接文本的描述使用GetNthDescription方法得到。
注意,内容列表文件和使用它的ASP页面应处在同一文件夹中。否则,应提供一个相对物理路径或一个完整的虚拟路径,如下所示:
inCount = objNextLink.GetListCount("links\contlink.txt") 'physical path
inCount = objNextLink.GetListCount("/demo/contlink.txt") 'virtual path