6.2.6 Content Rotator组件 Content Rotator组件像一个简化的Ad Rotator组件,需要提供一种内容调度文件(Content Schedule File)。该文件仅是一种包含文本段和HTML代码段的文本文件,Content Rotator组件可在页面中自动显示其中的一个。调度表文件可以包括任何数量的文本内容条目,并可规定比率,用以控制在返回网页中每个条目的显示频率。 1. 内容调度文件 内容进度文件的结构比Ad Rotator的调度文件简单,仅需提供要使用的各个文本字符串的列表,由前面加两个百分号(%%)的语句行说明。为了设置每个条目的比率(决定它出现在返回页面中的频率),在双百分号的后面添加了一个数字,其后还可跟一对前向斜线符(//)添加注释。如: %% 3 // This is the first entry in the schedule text file For more information, mail us at <A HREF=mailto:feedback@wrox.com>Wrox Press</A>
%% 4 //This is a multi-line text string <H4>Wrox Press</H4> <UL> <LI> Language Primers <LI> Advanced Programming <LI> Internet Applications </UL>
%% 2 Visit us on the <A HREF="http://www.wrox.com">World Wide Web</A>
2. 使用Page Counter组件 下面例子使用JScript语言来说明Page Counter组件的使用,先用Server.CreateObject方法创建对象实例,然后调用Hits方法得到对当前网页的访问次数。如果访问次数达到5次,则把计数器重新设置为0,并且在网页中放置一个链接,以便向访问者通过成绩。 <% // in JScript: var objPageCount = Server.CreateObject('MSWC.PageCounter');
//look for a command sent from the FORM section buttons
// increment the counter and display the current hit count objPageCount.PageHit(); Response.Write('You are visitor number ' + objPageCount.Hits() + '<P>');
// we treat every fifth visitor as a winner if (objPageCount.Hits() == 5) { objPageCount.Reset(); // reset the counter Response.Write('You\'re a lucky winner!<BR>'); Response.Write('<A HREF="winner.asp">Go to our winners page</A><BR>'); } %> 注意在第二个Response.Write语句中,后向斜线(\)的使用是防止JScript引擎把引号看作字符串的结束。 本书提供了一个使用Page Counter组件的示例网页。然而,由于在每个示例页面里使用一个VBScript为这个组件示例编写程序。尽管在一个ASP网页里,混用脚本语言是可能的,但在SSI的#include文件中使用脚本语言能使网页缓存出现问题,并会引起不可预测的结果。虽然脚本语言不同,但示例网页的工作方式上与上述相同。Page Counter组件示例页面如图6-10所示:
图6-10 Page Counter组件示例页面 该网页包含的<FORM>段中含有两个按钮,两个按钮都把窗体提交以重新调入网页。 <FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST"> <INPUT TYPE="SUBMIT" VALUE=" "> Reload this page<P> <INPUT TYPE="SUBMIT" NAME="cmdReset" VALUE=" "> PageCounter.Reset( ) </FORM> 在网页的开头,与其他的示例网页一样,在请求中查找相关的按钮名字。在本页面中,我们仅对第二个名为cmdReset的按钮感兴趣,如果点击了该按钮,运行Page Counter组件的Reset方法,重新设置本页面的访问次数为0。 'look for a command sent from the FORM section buttons If Len(Request.Form("cmdReset")) Then objPageCount.Reset 'reset the counter 前面看到的代码将调用PageHit方法把计数器设置为1,并显示在网页里。注意已经使用了Hits和Reset方法而没有给可选参数提供数值,所以它们都在当前网页计数器上操作,当然能够在另一个网页中使用,并可以对一些网页的统计结果汇总。
图6-13 使用Permission Checker组件的示例页面 链接所指向的每一个页面都位于Chapter06示例目录下的PermissionChecker子目录中。Permission Checker组件检查当前用户是否有访问各个网页的权限。如果用户确实有访问这个网页的权限的话,这个网页的条目将是一个超级链接。 'create an instance of the component Set objPermit = Server.CreateObject("MSWC.PermissionChecker") %> <UL>
<LI> <% If objPermit.HasAccess("PermissionChecker/restricted_1.asp") Then %> <A HREF="PermissionChecker/restricted_1.asp"> <% End If %> Restricted Page Number 1 <% If objPermit.HasAccess("PermissionChecker/restricted_1.asp") Then %> </A> <% End If %> </LI> … .. 'other page links here … </UL> 现在我们有访问三个有访问限制的网页的权限,所以这三个条目都是超级链接。然而这里不存在第四个链接(它可以被移去或是删除),因为组件不能使用当前用户(也就是IUSR_machinename)的帐号来访问它,因此不显示为超级链接。 注意这里选择仅移去超级链接但留下了链接文本,在实际情况中应删除不可访问的网页的整个条目。 如果从PermssionChecker子目录中的restricted_2.asp文件上删除Read(和任何其他的)权限,并重新调入网页,对应的条目将不显示为一个超级链接,如图6-14所示:
图6-15 使用MyInfo组件的页面 首次打开页面时,创建属性时使用了一个标志变量SetDefaultValues,该变量存放在用户的Session对象中。当页面在每个会话里首次打开时,把属性参数设置成“缺省”值,之后,把此标志变量设置成Yes。在当前会话中,重新调入页面时,这个数值将不再重新设置缺省值。 'an instance of the component is already created in global.asa If Not Session("SetDefaultValues") = "Yes" Then 'set the properties if they're not set to the default values, 'i.e. if this is the first time that the page has been run 'during the current user session. objMyInfo.MyManager = "Christina Chan" objMyInfo.MyPhoneExtension = "2851" objMyInfo.MyCarParkingSpace = "4A-17" objMyInfo.MyComputerName = "Priscilla" 'set a session flag to show that the default values hve been set Session("SetDefaultValues") = "Yes" End If 每次调用页面时,检查请求中的值是否是用于改变属性值的按钮的名称。这个按钮在一个包含下拉列表和文本框的<FORM>上。如果发现点击了这个按钮,则从下拉列表和文本框里采集数值,然后用这些数值改变相关的属性值。 'look for a command sent from the FORM section buttons If Len(Request.Form("cmdChange")) Then strPropertyName = Request.Form("lstName") 'get the name of the property strNewValue = Request.Form("txtValue") 'get the new value for the property objMyInfo(strPropertyName) = strNewValue 'set the component property value End If