明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

ASP 3.0高級編程(二106)

[摘要]6.2.6 Content Rotator組件 Content Rotator組件像一個簡化的Ad Rotator組件,需要提供一種內(nèi)容調(diào)度文件(Content Schedule Fil...
6.2.6 Content Rotator組件
       Content Rotator組件像一個簡化的Ad Rotator組件,需要提供一種內(nèi)容調(diào)度文件(Content Schedule File)。該文件僅是一種包含文本段和HTML代碼段的文本文件,Content Rotator組件可在頁面中自動顯示其中的一個。調(diào)度表文件可以包括任何數(shù)量的文本內(nèi)容條目,并可規(guī)定比率,用以控制在返回網(wǎng)頁中每個條目的顯示頻率。
1.  內(nèi)容調(diào)度文件
內(nèi)容進(jìn)度文件的結(jié)構(gòu)比Ad Rotator的調(diào)度文件簡單,僅需提供要使用的各個文本字符串的列表,由前面加兩個百分號(%%)的語句行說明。為了設(shè)置每個條目的比率(決定它出現(xiàn)在返回頁面中的頻率),在雙百分號的后面添加了一個數(shù)字,其后還可跟一對前向斜線符(//)添加注釋。如:
%% 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>

這個例子說明了可以用于網(wǎng)頁中的三個文本字符串,比率分別是3、4和2,所以條目將以3/9、4/9和2/9的頻率出現(xiàn)。注意(和Ad Rotator組件一樣)每個字符串的實(shí)際出現(xiàn)是隨機(jī)的,然后經(jīng)修正后獲得相應(yīng)的比率,如果調(diào)入網(wǎng)頁九次,可能不會正好得到這個結(jié)果。
2.  Content Rotator組件的成員
Content Rotator組件僅提供兩個方法,用于從內(nèi)容調(diào)度文件中檢索內(nèi)容,如表6-5所示:
表6-5  Content Rotator組件的方法及說明
方 法
說 明

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

ChooseContent(schdule_file)
檢索(但不顯示)來自schdule_file文件的下一個合適的內(nèi)容字符串

3.  使用Content Rotator組件
為了從調(diào)度文件中獲得指定段的文本和HTML,可使用對象的ChooseContent方法檢索一個條目,按照內(nèi)容調(diào)度文件中規(guī)定的比率?梢允褂肦esponse.Write方法將其插入到發(fā)送給客房機(jī)的輸出流中。
<% 'In VBScript:
Set objMyContent = Server.CreateObject("MSWC.ContentRotator")
strContent = objMyContent.ChooseContent("ContentRotator/content_schedule.txt")
Response.Write strContent
%>
這個代碼使用了和頁面在同一目錄中的調(diào)度文件,如果這段代碼存放在其他地方,必須注明調(diào)度文件的路徑,這個路徑可以是一相對于Web網(wǎng)站根目錄的物理路徑或是一個完整的虛擬路徑。
ObjMyContent.ChooseContent("\content\mycontent.txt")    'relative physical path
ObjMyContent.ChooseContent("/demo/mycontent.txt")      'full virtual path
如果想顯示內(nèi)容調(diào)度文件中的所有內(nèi)容字符串,可以使用對象的GetAllContent方法,如ChooseaContent方法的情況一樣,必須提供調(diào)度文件的路徑。例如下面的代碼得到了內(nèi)容調(diào)度文件中的所有內(nèi)容并顯示在網(wǎng)頁里。注意這個方法把內(nèi)容自動地插入到網(wǎng)頁中,所以不必使用Response.Write方法,這個方法也自動地在每個條目之間加了一個水平線。
ObjMyContent.GetAllContent("mycontent.txt")
為了研究Content Rotator組件的作用,從“ASP Installable Components”主菜單打開提供的示例頁面,這個頁面使用前面講過的內(nèi)容調(diào)度文件。調(diào)用ChooseContent方法,并把一個條目放在頁面的頂部,然后使用GetAllContent方法顯示調(diào)度文件中所有條目的內(nèi)容。Content Rotator組件示例頁面如圖6-9所示:

圖6-9  Content Rotator組件示例頁面

6.2.7 Page Counter組件
       Page Counter組件用于統(tǒng)計(jì)每個網(wǎng)頁被訪問的次數(shù),該組件定期把統(tǒng)計(jì)的數(shù)據(jù)存入服務(wù)器磁盤上的一個文本文件——訪問次數(shù)統(tǒng)計(jì)數(shù)據(jù)文件(Hit Count Data File)中,所以在停機(jī)或出現(xiàn)錯誤信息,當(dāng)前數(shù)據(jù)也不會丟失。
1.  Page Counter組件的成員
Page Counter組件提供了向該文件增加訪問次數(shù)的方法以及讀取和重新設(shè)置訪問計(jì)數(shù)總和的方法,如表6-6所示:
方 法
說 明

Hits([Page_Path])
返回由Page_Path指定的網(wǎng)頁的訪問次數(shù),如果選項(xiàng)Page_Path省略的話,返回的是當(dāng)前網(wǎng)頁的訪問次數(shù)

PageHit()
增加當(dāng)前網(wǎng)頁的訪問次數(shù)

Reset([Page_Path])
設(shè)置由Page_Path指定的網(wǎng)頁的訪問次數(shù)為0,如果選項(xiàng)Page_Path省略的話,設(shè)置當(dāng)前網(wǎng)頁的訪問次數(shù)為0

2.  使用Page Counter組件
下面例子使用JScript語言來說明Page Counter組件的使用,先用Server.CreateObject方法創(chuàng)建對象實(shí)例,然后調(diào)用Hits方法得到對當(dāng)前網(wǎng)頁的訪問次數(shù)。如果訪問次數(shù)達(dá)到5次,則把計(jì)數(shù)器重新設(shè)置為0,并且在網(wǎng)頁中放置一個鏈接,以便向訪問者通過成績。
<% // 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引擎把引號看作字符串的結(jié)束。
本書提供了一個使用Page Counter組件的示例網(wǎng)頁。然而,由于在每個示例頁面里使用一個VBScript為這個組件示例編寫程序。盡管在一個ASP網(wǎng)頁里,混用腳本語言是可能的,但在SSI的#include文件中使用腳本語言能使網(wǎng)頁緩存出現(xiàn)問題,并會引起不可預(yù)測的結(jié)果。雖然腳本語言不同,但示例網(wǎng)頁的工作方式上與上述相同。Page Counter組件示例頁面如圖6-10所示:

圖6-10  Page Counter組件示例頁面
該網(wǎng)頁包含的<FORM>段中含有兩個按鈕,兩個按鈕都把窗體提交以重新調(diào)入網(wǎng)頁。
<FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
<INPUT TYPE="SUBMIT" VALUE="&nbsp;&nbsp;&nbsp;"> Reload this page<P>
<INPUT TYPE="SUBMIT" NAME="cmdReset" VALUE="&nbsp;&nbsp;&nbsp;">
PageCounter.Reset( )
</FORM>
在網(wǎng)頁的開頭,與其他的示例網(wǎng)頁一樣,在請求中查找相關(guān)的按鈕名字。在本頁面中,我們僅對第二個名為cmdReset的按鈕感興趣,如果點(diǎn)擊了該按鈕,運(yùn)行Page Counter組件的Reset方法,重新設(shè)置本頁面的訪問次數(shù)為0。
'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdReset")) Then objPageCount.Reset  'reset the counter
前面看到的代碼將調(diào)用PageHit方法把計(jì)數(shù)器設(shè)置為1,并顯示在網(wǎng)頁里。注意已經(jīng)使用了Hits和Reset方法而沒有給可選參數(shù)提供數(shù)值,所以它們都在當(dāng)前網(wǎng)頁計(jì)數(shù)器上操作,當(dāng)然能夠在另一個網(wǎng)頁中使用,并可以對一些網(wǎng)頁的統(tǒng)計(jì)結(jié)果匯總。

6.2.8  Permission Checker組件
       Permission Checker組件用來檢測用戶當(dāng)前正在訪問網(wǎng)站的帳號是否允許讀取某個特定文件或者訪問某個資源(僅在Windows NT/2000而不是在Windows 9X)?梢杂盟鼇矶ㄖ祈撁,這些網(wǎng)頁中僅包含當(dāng)前用戶允許訪問的資源的鏈接,這項(xiàng)技術(shù)對于隱藏限制訪問的網(wǎng)頁和資源是非常有用的,它可以使被限制的訪問者不知道這些資源的存在,不會產(chǎn)生強(qiáng)行進(jìn)入其中的企圖。
1.  Permission Checker組件的成員
Permission Checker組件只有一個方法,如表6-7所示:
表6-7  Permission Checker組件的方法及說明
方 法
說 明

HasAccess(file_path)
檢查當(dāng)前執(zhí)行頁面的用戶帳號是否允許訪問file_path指定的頁面。該路徑是一個網(wǎng)頁、文件或資源的物理的或虛擬的路徑。如果當(dāng)前帳號允許訪問,返回值為“True”,否則返回值為“False”

2.  Permission Checker組件的工作過程
通常,除非特別規(guī)定,否則用戶是匿名訪問網(wǎng)頁的,因此IIS本身會使用自己的Windows帳號訪問網(wǎng)頁,缺省值是IUSR_machinename(例如IUSR_WROXBOX),Permission Checker組件檢查IUSR_machinename帳號是否能夠訪問指定的網(wǎng)頁或資源。
然而,通過Internet Services Manager的Allow Anonymous Access選項(xiàng)關(guān)閉對Web網(wǎng)站或者對某一指定目錄的匿名訪問,可以強(qiáng)迫IIS提示用戶輸入一個有效用戶帳號的用戶名和口令,然后使用該帳號“非匿名訪問”資源。
對一個網(wǎng)站或目錄,在Internet Services Manager上的Properties對話框中的Directory Security選項(xiàng)卡中設(shè)定訪問控制。在對話窗體中的Anonymous Access和Authentication Control中,點(diǎn)擊Edit按鈕打開Authentication Methods對話框,關(guān)閉Anonymous Access選項(xiàng)。設(shè)置界面如圖6-11所示:

圖6-11  訪問權(quán)限的設(shè)置界面
當(dāng)Permission Checker組件在用戶用其自己的帳號(而不是IUSR_machinename)訪問的網(wǎng)頁中被實(shí)例化時,將檢查其帳號是否可以訪問這個指定的資源,如果不能使用匿名訪問,那么所有的用戶必須提供帳號細(xì)節(jié)?梢允褂肳indows Explorer對每個文件或資源設(shè)置指定的權(quán)限(在相應(yīng)的Properties對話框中的Security選項(xiàng)卡中)。設(shè)置界面如圖6-12所示:

圖6-12  權(quán)限設(shè)置界面
3.  使用Permission Checker組件
可以使用Permission Checker組件檢查當(dāng)前用戶是否使用HasAccess方法訪問其他頁面(網(wǎng)站上的任何頁面)的權(quán)限。本書提供了一系列實(shí)例頁面,可用來試驗(yàn)Permission Checker組件,打開此示例(從ASP Installable Components主菜單里打開),會看到網(wǎng)頁里的三項(xiàng)鏈接,如圖6-13所示:

圖6-13  使用Permission Checker組件的示例頁面
鏈接所指向的每一個頁面都位于Chapter06示例目錄下的PermissionChecker子目錄中。Permission Checker組件檢查當(dāng)前用戶是否有訪問各個網(wǎng)頁的權(quán)限。如果用戶確實(shí)有訪問這個網(wǎng)頁的權(quán)限的話,這個網(wǎng)頁的條目將是一個超級鏈接。
'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>
現(xiàn)在我們有訪問三個有訪問限制的網(wǎng)頁的權(quán)限,所以這三個條目都是超級鏈接。然而這里不存在第四個鏈接(它可以被移去或是刪除),因?yàn)榻M件不能使用當(dāng)前用戶(也就是IUSR_machinename)的帳號來訪問它,因此不顯示為超級鏈接。
注意這里選擇僅移去超級鏈接但留下了鏈接文本,在實(shí)際情況中應(yīng)刪除不可訪問的網(wǎng)頁的整個條目。
如果從PermssionChecker子目錄中的restricted_2.asp文件上刪除Read(和任何其他的)權(quán)限,并重新調(diào)入網(wǎng)頁,對應(yīng)的條目將不顯示為一個超級鏈接,如圖6-14所示:

圖6-14  刪除Read權(quán)限后的頁面顯示

6.2.9 MyInfo組件
       MyInfo組件最初是與個人Web服務(wù)器一起引入的,用于存儲服務(wù)器管理員提供的個人信息。它現(xiàn)在可以用在ASP 3.0中,為名稱/數(shù)值對,或者任何其他類型的可以表示為文本字符串的信息提供永久存儲。該信息以XML格式在文本文件myinfo.xml中保存,此文件僅位于Web服務(wù)器的inetsrv目錄下。在Windows 2000中,其路徑為WinNT\system32\inetsrv\。
       和Counter組件一樣,只需創(chuàng)建一個簡單的MyInfo組件的實(shí)例就可以使用Web網(wǎng)站上的所有頁面均能獲得其信息,確保缺省Web站點(diǎn)上的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組件缺省時沒有屬性和方法。然而可給其添加屬性,簡單地說,也就是賦一個名稱和數(shù)值給這些屬性。比如,可以添加有關(guān)工作環(huán)境和合作伙伴的信息。
<% 'in VBScript:
objMyInfo.MyManager = "Christina Chan"
objMyInfo.MyPhoneExtension = "2851"
objMyInfo.MyCarParkingSpace = "4A-17"
objMyInfo.MyComputerName = "Priscilla"
%>
同別的組件屬性一樣,可以使用下面代碼檢索數(shù)值。
<% 'in VBScript:
strManagerName = objMyInfo.MyManager
strPhoneExtension = objMyInfo.MyPhoneExtension
strParkingSpace = objMyInfo.MyCarParkingSpace
strComputerName = objMyInfo.MyComputerName
%>
這是一種在兩個頁面請求之間存儲值的有用方法,不需要用戶的Session對象。這也為將來可能改變的數(shù)值提供了一個存儲區(qū)域,采用這些值的頁面將會在下次運(yùn)行時自動地采集這些變化的值,從而避免必須編輯大量的其他頁面。
本書提供了一個使用MyInfo組件的簡單示例,這個示例從ASP Installable Components主菜單中運(yùn)行,使用剛才討論的設(shè)置組件屬性的代碼,并可改變屬性值,如圖6-15所示:

圖6-15  使用MyInfo組件的頁面
       首次打開頁面時,創(chuàng)建屬性時使用了一個標(biāo)志變量SetDefaultValues,該變量存放在用戶的Session對象中。當(dāng)頁面在每個會話里首次打開時,把屬性參數(shù)設(shè)置成“缺省”值,之后,把此標(biāo)志變量設(shè)置成Yes。在當(dāng)前會話中,重新調(diào)入頁面時,這個數(shù)值將不再重新設(shè)置缺省值。
       '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
每次調(diào)用頁面時,檢查請求中的值是否是用于改變屬性值的按鈕的名稱。這個按鈕在一個包含下拉列表和文本框的<FORM>上。如果發(fā)現(xiàn)點(diǎn)擊了這個按鈕,則從下拉列表和文本框里采集數(shù)值,然后用這些數(shù)值改變相關(guān)的屬性值。
'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