您要打印的文件是:ASP 3.0高级编程(二十六)

ASP 3.0高级编程(二十六)

作者:    转贴自:chinaasp    点击数:2832


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>

这个例子说明了可以用于网页中的三个文本字符串,比率分别是3、4和2,所以条目将以3/9、4/9和2/9的频率出现。注意(和Ad Rotator组件一样)每个字符串的实际出现是随机的,然后经修正后获得相应的比率,如果调入网页九次,可能不会正好得到这个结果。
2. Content Rotator组件的成员
Content Rotator组件仅提供两个方法,用于从内容调度文件中检索内容,如表6-5所示:
表6-5 Content Rotator组件的方法及说明
方 法
说 明

GetAllContent(schdule_file)
检索和显示schdule_file文件中的所有字符串

ChooseContent(schdule_file)
检索(但不显示)来自schdule_file文件的下一个合适的内容字符串

3. 使用Content Rotator组件
为了从调度文件中获得指定段的文本和HTML,可使用对象的ChooseContent方法检索一个条目,按照内容调度文件中规定的比率。可以使用Response.Write方法将其插入到发送给客房机的输出流中。
<% 'In vbscript:
Set objMyContent = Server.CreateObject(MSWC.ContentRotator)
strContent = objMyContent.ChooseContent(ContentRotator/content_schedule.txt)
Response.Write strContent
%>
这个代码使用了和页面在同一目录中的调度文件,如果这段代码存放在其他地方,必须注明调度文件的路径,这个路径可以是一相对于Web网站根目录的物理路径或是一个完整的虚拟路径。
ObjMyContent.ChooseContent(\content\mycontent.txt) 'relative physical path
ObjMyContent.ChooseContent(/demo/mycontent.txt) 'full virtual path
如果想显示内容调度文件中的所有内容字符串,可以使用对象的GetAllContent方法,如ChooseaContent方法的情况一样,必须提供调度文件的路径。例如下面的代码得到了内容调度文件中的所有内容并显示在网页里。注意这个方法把内容自动地插入到网页中,所以不必使用Response.Write方法,这个方法也自动地在每个条目之间加了一个水平线。
ObjMyContent.GetAllContent(mycontent.txt)
为了研究Content Rotator组件的作用,从“ASP Installable Components”主菜单打开提供的示例页面,这个页面使用前面讲过的内容调度文件。调用ChooseContent方法,并把一个条目放在页面的顶部,然后使用GetAllContent方法显示调度文件中所有条目的内容。Content Rotator组件示例页面如图6-9所示:

图6-9 Content Rotator组件示例页面

6.2.7 Page Counter组件
Page Counter组件用于统计每个网页被访问的次数,该组件定期把统计的数据存入服务器磁盘上的一个文本文件——访问次数统计数据文件(Hit Count Data File)中,所以在停机或出现错误信息,当前数据也不会丢失。
1. Page Counter组件的成员
Page Counter组件提供了向该文件增加访问次数的方法以及读取和重新设置访问计数总和的方法,如表6-6所示:
方 法
说 明

Hits([Page_Path])
返回由Page_Path指定的网页的访问次数,如果选项Page_Path省略的话,返回的是当前网页的访问次数

PageHit()
增加当前网页的访问次数

Reset([Page_Path])
设置由Page_Path指定的网页的访问次数为0,如果选项Page_Path省略的话,设置当前网页的访问次数为0

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.2.8 Permission Checker组件
Permission Checker组件用来检测用户当前正在访问网站的帐号是否允许读取某个特定文件或者访问某个资源(仅在Windows NT/2000而不是在Windows 9X)。可以用它来定制页面,这些网页中仅包含当前用户允许访问的资源的链接,这项技术对于隐藏限制访问的网页和资源是非常有用的,它可以使被限制的访问者不知道这些资源的存在,不会产生强行进入其中的企图。
1. Permission Checker组件的成员
Permission Checker组件只有一个方法,如表6-7所示:
表6-7 Permission Checker组件的方法及说明
方 法
说 明

HasAccess(file_path)
检查当前执行页面的用户帐号是否允许访问file_path指定的页面。该路径是一个网页、文件或资源的物理的或虚拟的路径。如果当前帐号允许访问,返回值为“True”,否则返回值为“False”

2. Permission Checker组件的工作过程
通常,除非特别规定,否则用户是匿名访问网页的,因此IIS本身会使用自己的Windows帐号访问网页,缺省值是IUSR_machinename(例如IUSR_WROXBOX),Permission Checker组件检查IUSR_machinename帐号是否能够访问指定的网页或资源。
然而,通过Internet Services Manager的Allow Anonymous Access选项关闭对Web网站或者对某一指定目录的匿名访问,可以强迫IIS提示用户输入一个有效用户帐号的用户名和口令,然后使用该帐号“非匿名访问”资源。
对一个网站或目录,在Internet Services Manager上的Properties对话框中的Directory Security选项卡中设定访问控制。在对话窗体中的Anonymous Access和Authentication Control中,点击Edit按钮打开Authentication Methods对话框,关闭Anonymous Access选项。设置界面如图6-11所示:

图6-11 访问权限的设置界面
当Permission Checker组件在用户用其自己的帐号(而不是IUSR_machinename)访问的网页中被实例化时,将检查其帐号是否可以访问这个指定的资源,如果不能使用匿名访问,那么所有的用户必须提供帐号细节。可以使用Windows Explorer对每个文件或资源设置指定的权限(在相应的Properties对话框中的Security选项卡中)。设置界面如图6-12所示:

图6-12 权限设置界面
3. 使用Permission Checker组件
可以使用Permission Checker组件检查当前用户是否使用HasAccess方法访问其他页面(网站上的任何页面)的权限。本书提供了一系列实例页面,可用来试验Permission Checker组件,打开此示例(从ASP Installable Components主菜单里打开),会看到网页里的三项链接,如图6-13所示:

图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-14 删除Read权限后的页面显示

6.2.9 MyInfo组件
MyInfo组件最初是与个人Web服务器一起引入的,用于存储服务器管理员提供的个人信息。它现在可以用在ASP 3.0中,为名称/数值对,或者任何其他类型的可以表示为文本字符串的信息提供永久存储。该信息以XML格式在文本文件myinfo.xml中保存,此文件仅位于Web服务器的inetsrv目录下。在Windows 2000中,其路径为WinNT\system32\inetsrv\。
和Counter组件一样,只需创建一个简单的MyInfo组件的实例就可以使用Web网站上的所有页面均能获得其信息,确保缺省Web站点上的global.asa文件中有下面的代码:
<!-- declare instance of the ASP MyInfo component with application-level scope
-->
<OBJECT ID=objMyInfo RUNAT=Server SCOPE=Application PROGID=MSWC.MyInfo>
</OBJECT>
1. 使用MyInfo组件
MyInfo组件缺省时没有属性和方法。然而可给其添加属性,简单地说,也就是赋一个名称和数值给这些属性。比如,可以添加有关工作环境和合作伙伴的信息。
<% 'in vbscript:
objMyInfo.MyManager = Christina Chan
objMyInfo.MyPhoneExtension = 2851
objMyInfo.MyCarParkingSpace = 4A-17
objMyInfo.MyComputerName = Priscilla
%>
同别的组件属性一样,可以使用下面代码检索数值。
<% 'in vbscript:
strManagerName = objMyInfo.MyManager
strPhoneExtension = objMyInfo.MyPhoneExtension
strParkingSpace = objMyInfo.MyCarParkingSpace
strComputerName = objMyInfo.MyComputerName
%>
这是一种在两个页面请求之间存储值的有用方法,不需要用户的Session对象。这也为将来可能改变的数值提供了一个存储区域,采用这些值的页面将会在下次运行时自动地采集这些变化的值,从而避免必须编辑大量的其他页面。
本书提供了一个使用MyInfo组件的简单示例,这个示例从ASP Installable Components主菜单中运行,使用刚才讨论的设置组件属性的代码,并可改变属性值,如图6-15所示:

图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