图6-2 使用Content Linking组件创建的菜单页面 可以看到内容链接列表文件的内容显示在链接的下面,我们使用FileSystemObject对象完成这一工作。 <% 'create an instance of a FileSystemObject object Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
'open the text file as a TextStream object Set objTStream = objFSO.OpenTextFile(Server.MapPath("contlink.txt"), ForReading) Response.Write objTStream.ReadAll 'read the whole file and put into page ObjTStream.Close %> 如果你编辑了contlink.txt文件,下次再次调用这个页面时,会看到菜单的条目发生了变化。注意文件中的最后三个条目,这三个条目使用前面介绍的redirect.asp技术,把绝对(而不是相对)的URL插入到列表中。 (2) 浏览这些页面 创建一个Content Linking组件实例并且使用它的一个方法时,将把当前页面的URL与指定的内容链接列表文件中的条目相匹配。不仅能用该组件创建一个内容列表(就像刚看到的那样),而且当在浏览器上打开其中一个页面时,可以用该组件对列表中的各个页面进行导航。 这意味着可以用超链接或按钮从这些页面中的一个移到另一个。例如,可以给页面添加Next和Back按钮,通过使用GetNextURL和GetPreviousURL方法能知道列表中的哪一个页面是前一个,哪一个页面是下一个。另一方面,能用GetNthURL方法跳到列表中的任何页面,用GetListIndex方法能知道当前页面在列表中的位置。 下面是一段给页面添加Next和Back按钮的代码,我们要做的只是把这段程序放在内容链接文件所列出的每一页中,或者用SSI的#include指令将它插入其中。 <!-- need a form to force Navigator to display the buttons --> <FORM ACTION=""> <% 'we'll insert this into each page using an SSI #include statement 'create an instance of the Content Linking component Set objNextLink = Server.CreateObject("MSWC.NextLink") 'set the content linking list file path and name strListFile = "contlink.txt" 'get the index of the current page in the list intThisPage = objNextLink.GetListIndex(strListFile) If intThisPage > 1 Then 'can go back %> <INPUT TYPE=BUTTON VALUE="< Back" ONCLICK="location.href='<% = objNextLink.GetPreviousURL(strListFile) %>';" TITLE="Go to '<% = objNextLink.GetPreviousDescription(strListFile) %>'"> <% End If %> <INPUT TYPE=BUTTON VALUE=" Menu " ONCLICK="location.href='Default.asp';" TITLE="Return to the main 'Installable Components' menu"> <% If intThisPage < objNextLink.GetListCount(strListFile) Then 'can go forward %> <INPUT TYPE=BUTTON VALUE="Next >" ONCLICK="location.href='<%= objNextLink.GetNextURL(strListFile) %>';" TITLE="Go to '<% = objNextLink.GetNextDescription(strListFile) %>'"> <% End If %> </FORM> 第一步是创建Content Linking组件,然后把列表文件名存入一个变量中,以便后面在创建页面里的客户端JScript代码时能够使用这个列表文件。另外这样做也便于页面的维护,因为如果想使用一个不同文件名仅需在一个地方改变就可以了。 现在让我们了解一下在链接列表中所处的位置。GetListIndex方法提供当前页面的索引号,从列表中的第一页开始。如果当前页面的索引号比1大,那么可以后退,所以我们在页面中创建Back按钮。如果当前页面的索引号比列表中的项数少,创建Next按钮。页面中总是包括一个Home按钮,以便访问者在任何时候都能轻易地返回到内容页面。 如果打开列在主菜单中的页面之一的话,将会看到使用这项技术在每个页面上创建的一系列导航按钮,创建按钮的代码在文件contlinkbuttons.inc中,可用#include指令将它插入每个页面中。图6-3所示为带有按钮的界面。
6.2.3 Ad Rotator组件 Ad Rotator组件允许浏览器在引用ASP页面时每次显示不同的图像,这项技术经常用在显示广告的站点上。每次打开或重新载入页面时,ASP采用“旋转调度文件”(rotator schedule file)中的信息选择一副图像,并插入网页中。然而Ad Rotator组件能做更复杂的工作,它可以把图像设置成超级链接而不是一副静止的图像,并能记录用户对每个广告的点击次数。 在本章所介绍的组件中,Ad Rotator组件可能是最难使用的,因为它涉及几个不同的文件。在查看每个文件之前,图6-4所示的工作过程总览可能有助于了解它们之间的组合方式。
3. 使用Ad Rotator组件 下面的代码说明了Ad Rotator组件的使用。创建了组件实例之后,设置属性参数并调用GetAdvertisement方法,指定调度文件的相对物理路径。由组件返回的HTML代码通过使用Response.Write方法插入到页面中。 <% 'VBScript example QUOT = Chr(34) Set objAdRot = Server.CreateObject("MSWC.AdRotator") objAdRot.Border=0 'no border objAdRot.Clickable=TRUE 'is a hyperlink objAdRot.TargetFrame="fraAdFrame" 'load into new window named fraAdFrame strHTML = objAdRot.GetAdvertisement("AdRotFiles\ad_schedule.txt") Response.Write(strHTML) 'put the HTML into the page %> GetAdvertisement方法的参数是相对于当前目录或Web网站根目录的调度文件物理路径和文件名。在上面的代码中,此文件取名为AdRotFiles,位于包含正在运行的ASP页面的当前目录下的子目录中。如果这个文件存入Web网站根目录下的AdRotFiles子目录,应使用“\AdRotFiles\MyAdFile.txt”。 调用GetAdvertisement方法时,返回能插入网页中用于创建广告栏的HTML代码,对于上例中的旋转调度文件中的第一个广告栏,可以得到下列代码: <A HREF=http://www.okasp.com/techinfo/"/AdRotFiles/AdRedirect.asp? url=http://www.wrox.com/&image=/AdRotFiles/AdPics/wrox.gif"> <IMG SRC=http://www.okasp.com/techinfo/"/AdRotFiles/AdPics/wrox.gif" ALT="Better Books from Wrox Press" WIDTH=440 HEIGHT=60 BORDER=0></A> 可以看到在常规的<A>标记中放置了图像文件,HREF属性设置为重定向文件的名称AdRedirect.asp,同时广告主的主页URL和所用的图像添加到查询字符串中,因此当用户点击广告栏时,重定向文件将在服务器上载入并运行。 4. 重定向文件 重定向文件可以是一个ASP页面、一个ISAPI DLL或者是一个CGI应用程序,无论是哪一种,它必须能够接受和辨别广告主的主页URL以及图像名参数。它检查这些值并决定下一步该做什么。例如通常会把用户重新定向到与此广告栏有关的URL,这一点使用下面的VBScript代码很容易实现。 Response.Redirect Request.QueryString("url") 然而,重新定向文件提供给我们的不仅仅是这些。例如可以统计点击每个广告的用户数量,如果根据点击数收到广告费用的话,这将显得尤其有用。也可以用本章后面介绍的Counters组件来完成这项工作。 … 'get the URL of the advertiser's target page strAdvertiserURL = Request.QueryString("url") If Instr(strAdvertiserURL, "wrox.com") Then objCounters.Increment("wrox") Response.Clear Response.Redirect strAdvertiserURL End If
If Instr(strAdvertiserURL, "going-to-the-moon") Then objCounters.Increment("lunar") Response.Clear Response.Write "Sorry, this isn't a real site..." End If … .. 'same for other advertisers … 查询字符串包含图像文件名时,在脚本中也要考虑这一点,如果在调度文件中,同一广告主有三种不同的图像,可以对每个图像单独地跟踪访问次数。 … If Instr(strAdvertiserURL, "wrox.com") Then 'this is an advert for the Wrox Press site Select Case Request.QueryString("image") Case "books.gif" objCounters.Increment("wrox_books") Case "website.gif" objCounters.Increment("wrox_site") Case Else objCounters.Increment("wrox_other") End Select Response.Clear Response.Redirect strAdvertiserURL End If … 5. 一个Ad Rotator示例页面 本章提供的示例文件包括一个Ad Rotator组件演示程序,它能够从前面见过的ASP Installable Components主菜单中打开。页面的上部显示的是一个由名为ad_schedule.txt的旋转调度文件定义的广告(可在本章示例目录下的Ad RotFiles子目录中找到ad_shedule.txt),如图6-5所示:
图6-5 Ad Rotating页面的示例 使用的代码前面已经讨论过,这里在调度文件中仅增加了另外一些条目,以便更清楚地显示载入页面时的广告的变化情况。如果点击一个广告,将运行名为ad_redirect.asp的重定向文件中的代码,并且相应的广告主的页面在新的窗口里打开。完成该工作的代码和前面见到的相同。 在重定向文件中,可使用计数器(由Counters组件创建)实例存储每个广告的点击次数。 … If Instr(strAdvertiserURL, "wrox.com") Then objCounters.Increment("wrox") Response.Clear Response.Redirect strAdvertiserURL End If …此页面的其余部分演示了Counters组件的作用,下面介绍该组件。