使用组件服务器组件 前一章已经介绍了对象和组件在页面中通用的实例化方法,使用服务器组件和使用脚本运行期库对象的方法完全一致,唯一的区别是,不像脚本对象,服务器组件通常作为单独的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 divsent" 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 divsent'); Response.Flush(); Response.End(); } …
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组件的方法及说明 方 法 说 明