直播中
%% 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 >World Wide Web</A>
這個例子說明了可以用于網(wǎng)頁中的三個文本字符串,比率分別是3、4和2,所以條目將以3/9、4/9和2/9的頻率出現(xiàn)。注意(和Ad Rotator組件一樣)每個字符串的實際出現(xiàn)是隨機的,然后經(jīng)修正后獲得相應的比率,如果調入網(wǎng)頁九次,可能不會正好得到這個結果。
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方法檢索一個條目,按照內容調度文件中規(guī)定的比率??梢允褂肦esponse.Write方法將其插入到發(fā)送給客房機的輸出流中。
<% 'In VBScript:
Set objMyContent = Server.CreateObject("MSWC.ContentRotator")
strContent = objMyContent.ChooseContent("ContentRotator/content_schedule.txt")
Response.Write strContent
%>
這個代碼使用了和頁面在同一目錄中的調度文件,如果這段代碼存放在其他地方,必須注明調度文件的路徑,這個路徑可以是一相對于Web網(wǎng)站根目錄的物理路徑或是一個完整的虛擬路徑。
ObjMyContent.ChooseContent("\content\mycontent.txt") 'relative physical path
ObjMyContent.ChooseContent("/demo/mycontent.txt") 'full virtual path
如果想顯示內容調度文件中的所有內容字符串,可以使用對象的GetAllContent方法,如ChooseaContent方法的情況一樣,必須提供調度文件的路徑。例如下面的代碼得到了內容調度文件中的所有內容并顯示在網(wǎng)頁里。注意這個方法把內容自動地插入到網(wǎng)頁中,所以不必使用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組件用于統(tǒng)計每個網(wǎng)頁被訪問的次數(shù),該組件定期把統(tǒng)計的數(shù)據(jù)存入服務器磁盤上的一個文本文件——訪問次數(shù)統(tǒng)計數(shù)據(jù)文件(Hit Count Data File)中,所以在停機或出現(xiàn)錯誤信息,當前數(shù)據(jù)也不會丟失。
1. Page Counter組件的成員
Page Counter組件提供了向該文件增加訪問次數(shù)的方法以及讀取和重新設置訪問計數(shù)總和的方法,如表6-6所示:
方 法
說 明
Hits([Page_Path])
返回由Page_Path指定的網(wǎng)頁的訪問次數(shù),如果選項Page_Path省略的話,返回的是當前網(wǎng)頁的訪問次數(shù)
PageHit()
增加當前網(wǎng)頁的訪問次數(shù)
Reset([Page_Path])
設置由Page_Path指定的網(wǎng)頁的訪問次數(shù)為0,如果選項Page_Path省略的話,設置當前網(wǎng)頁的訪問次數(shù)為0
2. 使用Page Counter組件
下面例子使用JScript語言來說明Page Counter組件的使用,先用Server.CreateObject方法創(chuàng)建對象實例,然后調用Hits方法得到對當前網(wǎng)頁的訪問次數(shù)。如果訪問次數(shù)達到5次,則把計數(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引擎把引號看作字符串的結束。
本書提供了一個使用Page Counter組件的示例網(wǎng)頁。然而,由于在每個示例頁面里使用一個VBScript為這個組件示例編寫程序。盡管在一個ASP網(wǎng)頁里,混用腳本語言是可能的,但在SSI的#include文件中使用腳本語言能使網(wǎng)頁緩存出現(xiàn)問題,并會引起不可預測的結果。雖然腳本語言不同,但示例網(wǎng)頁的工作方式上與上述相同。Page Counter組件示例頁面如圖6-10所示:
圖6-10 Page Counter組件示例頁面
該網(wǎng)頁包含的<FORM>段中含有兩個按鈕,兩個按鈕都把窗體提交以重新調入網(wǎng)頁。
<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>
在網(wǎng)頁的開頭,與其他的示例網(wǎng)頁一樣,在請求中查找相關的按鈕名字。在本頁面中,我們僅對第二個名為cmdReset的按鈕感興趣,如果點擊了該按鈕,運行Page Counter組件的Reset方法,重新設置本頁面的訪問次數(shù)為0。
'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdReset")) Then objPageCount.Reset 'reset the counter
前面看到的代碼將調用PageHit方法把計數(shù)器設置為1,并顯示在網(wǎng)頁里。注意已經(jīng)使用了Hits和Reset方法而沒有給可選參數(shù)提供數(shù)值,所以它們都在當前網(wǎng)頁計數(shù)器上操作,當然能夠在另一個網(wǎng)頁中使用,并可以對一些網(wǎng)頁的統(tǒng)計結果匯總。
6.2.8 Permission Checker組件
Permission Checker組件用來檢測用戶當前正在訪問網(wǎng)站的帳號是否允許讀取某個特定文件或者訪問某個資源(僅在Windows NT/2000而不是在Windows 9X)。可以用它來定制頁面,這些網(wǎng)頁中僅包含當前用戶允許訪問的資源的鏈接,這項技術對于隱藏限制訪問的網(wǎng)頁和資源是非常有用的,它可以使被限制的訪問者不知道這些資源的存在,不會產(chǎn)生強行進入其中的企圖。
1. Permission Checker組件的成員
Permission Checker組件只有一個方法,如表6-7所示:
表6-7 Permission Checker組件的方法及說明
方 法
說 明
HasAccess(file_path)
檢查當前執(zhí)行頁面的用戶帳號是否允許訪問file_path指定的頁面。該路徑是一個網(wǎ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選項關閉對Web網(wǎng)站或者對某一指定目錄的匿名訪問,可以強迫IIS提示用戶輸入一個有效用戶帳號的用戶名和口令,然后使用該帳號“非匿名訪問”資源。
對一個網(wǎng)站或目錄,在Internet Services Manager上的Properties對話框中的Directory Security選項卡中設定訪問控制。在對話窗體中的Anonymous Access和Authentication Control中,點擊Edit按鈕打開Authentication Methods對話框,關閉Anonymous Access選項。設置界面如圖6-11所示:
圖6-11 訪問權限的設置界面
當Permission Checker組件在用戶用其自己的帳號(而不是IUSR_machinename)訪問的網(wǎng)頁中被實例化時,將檢查其帳號是否可以訪問這個指定的資源,如果不能使用匿名訪問,那么所有的用戶必須提供帳號細節(jié)。可以使用Windows Explorer對每個文件或資源設置指定的權限(在相應的Properties對話框中的Security選項卡中)。設置界面如圖6-12所示:
圖6-12 權限設置界面
3. 使用Permission Checker組件
可以使用Permission Checker組件檢查當前用戶是否使用HasAccess方法訪問其他頁面(網(wǎng)站上的任何頁面)的權限。本書提供了一系列實例頁面,可用來試驗Permission Checker組件,打開此示例(從ASP Installable Components主菜單里打開),會看到網(wǎng)頁里的三項鏈接,如圖6-13所示:
圖6-13 使用Permission Checker組件的示例頁面
鏈接所指向的每一個頁面都位于Chapter06示例目錄下的PermissionChecker子目錄中。Permission Checker組件檢查當前用戶是否有訪問各個網(wǎng)頁的權限。如果用戶確實有訪問這個網(wǎng)頁的權限的話,這個網(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)頁的權限,所以這三個條目都是超級鏈接。然而這里不存在第四個鏈接(它可以被移去或是刪除),因為組件不能使用當前用戶(也就是IUSR_machinename)的帳號來訪問它,因此不顯示為超級鏈接。
注意這里選擇僅移去超級鏈接但留下了鏈接文本,在實際情況中應刪除不可訪問的網(wǎng)頁的整個條目。
如果從PermssionChecker子目錄中的restricted_2.asp文件上刪除Read(和任何其他的)權限,并重新調入網(wǎng)頁,對應的條目將不顯示為一個超級鏈接,如圖6-14所示:
圖6-14 刪除Read權限后的頁面顯示
6.2.9 MyInfo組件
MyInfo組件最初是與個人Web服務器一起引入的,用于存儲服務器管理員提供的個人信息。它現(xiàn)在可以用在ASP 3.0中,為名稱/數(shù)值對,或者任何其他類型的可以表示為文本字符串的信息提供永久存儲。該信息以XML格式在文本文件myinfo.xml中保存,此文件僅位于Web服務器的inetsrv目錄下。在Windows 2000中,其路徑為WinNT\system32\inetsrv\。
和Counter組件一樣,只需創(chuàng)建一個簡單的MyInfo組件的實例就可以使用Web網(wǎng)站上的所有頁面均能獲得其信息,確保缺省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組件缺省時沒有屬性和方法。然而可給其添加屬性,簡單地說,也就是賦一個名稱和數(shù)值給這些屬性。比如,可以添加有關工作環(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ū)域,采用這些值的頁面將會在下次運行時自動地采集這些變化的值,從而避免必須編輯大量的其他頁面。
本書提供了一個使用MyInfo組件的簡單示例,這個示例從ASP Installable Components主菜單中運行,使用剛才討論的設置組件屬性的代碼,并可改變屬性值,如圖6-15所示:
圖6-15 使用MyInfo組件的頁面
首次打開頁面時,創(chuàng)建屬性時使用了一個標志變量SetDefaultValues,該變量存放在用戶的Session對象中。當頁面在每個會話里首次打開時,把屬性參數(shù)設置成“缺省”值,之后,把此標志變量設置成Yes。在當前會話中,重新調入頁面時,這個數(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
每次調用頁面時,檢查請求中的值是否是用于改變屬性值的按鈕的名稱。這個按鈕在一個包含下拉列表和文本框的<FORM>上。如果發(fā)現(xiàn)點擊了這個按鈕,則從下拉列表和文本框里采集數(shù)值,然后用這些數(shù)值改變相關的屬性值。
'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