程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP入門教程 >> ASP 3.0高級編程(二十六)

ASP 3.0高級編程(二十六)

編輯:ASP入門教程
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:[email protected]>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([[I]Page_Path[/I]]) 
返回由Page_Path指定的網頁的訪問次數,如果選項Page_Path省略的話,返回的是當前網頁的訪問次數 

PageHit() 
增加當前網頁的訪問次數 

Reset([[I]Page_Path[/I]]) 
設置由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="&nbsp;&nbsp;&nbsp;"> Reload this page<P>
<INPUT TYPE="SUBMIT" NAME="cmdReset" VALUE="&nbsp;&nbsp;&nbsp;">
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
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved