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

ASP 3.0高級編程(二十三)

編輯:ASP入門教程
第6章          活動服務器組件
在前幾章中,我們已經研究了兩類不同的對象:一類是ASP對象模型的內置部分,另一類是腳本運行期庫提供的對象。本章將介紹第三類能用於ASP的對象,取名為活動服務器組件(或者就稱為服務器組件)。
這些組件在很多場合下就如同在浏覽器或在像Visual Basic編程環境中用於客戶端腳本中的傳統ActiveX控件一樣,但是這些組件可在服務器上運行,而不是一個只能運行在客戶機上的對象。
現在的問題是:這些組件來自哪裡?其中一部分是由常規的ASP/IIS安裝程序提供的,而另一部分可以從Web上免費或有償獲得。本章討論ASP的各種組件的主要用途,然後介紹可得到的其他組件的幾個范例。一旦感覺到使用這些活動服務器組件得心應手,你就會毫不費力將其他供應商產品嵌入到自己的ASP頁面中。本章後面有一個第三方組件的列表,本書後面還將介紹如何創建自己的組件。
還有一些用於ASP的組件,但本章不准備討論。動態Web網站技術的基本用途之一是發布直接從數據庫管理系統和其他類型的數據存儲獲得的信息,這一用途和從數據庫或其他數據存儲中收集數據和存入數據的需求,促使程序員開發服務器端編程。為了使用ASP完成這些任務,我們可以充分利用稱為ActiveX數據對象(ActiveX Data Objects,ADO)庫的組件集。由於它涉及的內容很多,很難在本章中闡述清楚,還要考慮的其他的組件,本書從第8章開始講述相關的內容。
本章要討論的內容有:
· 服務器組件與在ASP中使用的其他對象的區別。
· 簡要說明如何實例化對象,並得到服務器組件的引用。
· ASP 3.0和IIS提供的可安裝組件,例如AD Rotator、Content Linking、Page Counter和Tools等組件。
· 一些第三方提供的組件。

6.1 腳本對象與服務器組件的比較
       前一章已說明了各種腳本對象,這些對象對於ASP/IIS來說都是從腳本運行庫(scrrun.dll)中得到的,重要的是不要把這些對象與服務器組件(即本章的主題)混淆一起。
       服務器組件通常在其自己的DLL或可執行文件中實現,例如本章將要討論的“Content Linking”組件,就是由nextlink.dll實現的。一旦在服務器安裝和注冊這個DLL文件,那麼其提供的對象就可以在ASP所支持的任何腳本語言中使用。組件與系統環境的關系如圖6-1所示:
圖6-1  組件與系統環境的關系

使用組件服務器組件
       前一章已經介紹了對象和組件在頁面中通用的實例化方法,使用服務器組件和使用腳本運行期庫對象的方法完全一致,唯一的區別是,不像腳本對象,服務器組件通常作為單獨的DLL文件實現,而且可能要求在使用前先運行一個安裝程序,或者手工注冊該組件(如果這些組件在ASP缺省安裝時未注冊)。
1.  CreateObject方法
一般說來,可以在一個ASP頁面中使用ASP內置的Server對象的CreateObject方法創建一個對象,例如:
Set objThis = Server.CreateObject("this.object")                ' in VBScript
或:
var objThis = Server.CreateObject('this.object');                // in JScript
這樣就在變量objThis中創建了該對象的引用,然後可以在腳本中使用該對象;換句話說,可以在代碼中根據需要控制其屬性及調用其方法。
2.  使用<OBJECT>元素
同樣可以使用常規的<OBJECT>元素創建一個對象該方法同樣適用於在Web浏覽器頁面中創建對象。ASP支持Html<OBJECT>元素的特殊實現,而且我們可以使用這一方法在頁面中放置一個對象。要在普通的.ASP文件中定義一個組件或腳本對象的實例,使用下面語句:
<OBJECT RUNAT="SERVER" SCOPE="PAGE" ID="objThis"
              CLASSID="CLSID:OACE4881-8305-11CF-9427-444553540000">
</OBJECT>
我們使用SCOPE屬性來設定對象的范圍,選項是“session”、“application”和“PAGE”。如果在普通的.ASP文件中使用<OBJECT>元素,那麼必須同時使用“PAGE”屬性,並忽略SCOPE屬性,因為創建的對象只能在它被實例化的頁面中使用。如果在global.asa文件中使用<OBJECT>元素,則所創建的對象可在當前會話或整個應用程序中使用,因此SCOPE屬性可設置為“SESSION”和“APPLICATION”。
3.  檢測對象實例的存在
經常出現的錯誤是企圖創建一個未安裝(或未注冊)的對象的實例,或者在CreateObject方法或<OBJECT>元素中使用錯誤的對象PRogID。缺省狀態下,ASP會出現錯誤並停止頁面的執行。
給頁面添加一些程序代碼,在訪問對象之前進行檢測是必要的。在VBScript中,可以做到這一點,方法是:關閉缺省的錯誤處理,然後使用IsObject函數查看對象是否真的引用了一個對象:
' in VBScript:

On Error Resume Next                                     'turn off default error handling
Set objThis = Server.CreateObject("this.object")

If IsObject(objThis) Then
       'the CreateObject method succeeded
       On Error Goto 0                                        'turn the default error handling back on
       …
       'rest of the script goes here
       …
Else
       Response.Write "Sorry, this page cannot be Accessed at present"
       Response.Flush
       Response.End
End If

在JScript語言中,可以使用JScript 5.0腳本引擎中新的錯誤處理特性,這在第1章中介紹過。
// in JScript:

try {
       var objThis = Server.CreateObject('this.object');
       …
       // rest of the script goes here
}

catch (exception) {
       Response.Write ('Sorry, this page cannot be Accessed at present');
       Response.Flush();
       Response.End();
}


6.2 ASP/IIS可安裝組件
       ASP/IIS的標准安裝包括一系列服務器組件,這些組件在IIS文檔中被描述為可安裝組件(installable component),盡管缺省狀態下它們是安全安裝。但也有可能這個名稱僅僅是沿用ASP的前幾個版本中的名字。在以前版本中,這些組件需要人工安裝。現在,如果要給它們起個合適的名稱,可稱為“可實例化的組件”。
       需要注意的是,在第8章將介紹一個特定的可安裝組件,即ADO組件。後面的章節中使用的其他組件都是作為特定的服務或服務器應用程序的一部分而安裝的。例如協作數據對象(Collaborative Date Objects,簡稱CDO和CDONTS)組件,用於郵件服務器和電子郵件消息。本章的其余部分將討論,如何使用其他通用性較強的組件為Web網站或Intranet提供增強功能。
       在Windows 2000中的WinNT\System32\intesrv\目錄下可找到這些ASP可安裝組件,該目錄也放置一些組件要求的配置文件。下面按字母順序列出了一些組件。
       · Ad Rotator組件用於控制可點擊圖像的出現,如廣告或標題。使用存儲在配置文件中的信息,Ad Rotator能夠依據配置文件規定的比率顯示不同的圖像,同時也具備把可點擊的廣告重新定位到相應的URL以及記錄圖像點擊次數的特性。
       · Browser CapabilitIEs組件使用UserAgent字符串,該字符串由浏覽器發往服務器,用來識別相應的浏覽器。它提供了反映特定浏覽器功能的一系列屬性,例如是否支持腳本、cookIE或Java小程序。
       · Content Linking組件用於提供一系列方便導航的頁面,這些頁面可被改變或更新而不必編輯各個頁面。該組件采用一個文本文件(含有頁面URL和顯示順序),使創建按指定順序鏈接起來的一些頁面很容易。
       · Content Rotator組件采用一種配置文件來指定插入到其他頁面中的Html、文本或程序代碼,根據配置文件指定的情況,顯示內容的任何部分。
       · Counters組件能夠創建、遞增和永久地存儲各個在腳本代碼中使用的整數計數器的數值。
       · Logging Utility組件提供對Web服務器日志文件的訪問,並且允許在一個ASP頁面內讀取和更新這些數據。這是Windows 2000中隨IIS 5.0和ASP 3.0新增的特性。
       · MyInfo組件為可在整個網站內訪問的名稱/值對的存儲提供了一個存儲空間,這些數據在服務器上以XML格式的文本文件存儲(不同於應用程序作用域,這些數據在Web網站范圍之外仍然保留)。
       · Page Counter組件記錄訪問一個頁面的次數,可以用於跟蹤頁面的點擊次數。
       · Permission Checker組件有助於防止當一個用戶試圖訪問沒有正確的權限設置的資源時引起的腳本錯誤。
       · Tools組件提供了一些在頁面中可以采用的方法,這些方法用於檢驗一個文件是否存在、處理Html窗體、生成一個隨機整數。另外還有一些用在Macintosh蘋果計算機上的方法,可以檢查是否存在某個服務器插件程序,檢查當前用戶是否為網站擁有者。
       另外一個由IIS/ASP提供的組件,即Status組件,只能用於Macintosh計算機的個人Web服務器上。本書沒有涉及該組件,若要詳細了解該組件,可通過HTTP://localhost/IIS/htm/asp/complqt0.htm查閱ASP/IIS提供的IIS 5.0文檔。

6.2.1 使用示例頁面
       本書已經提供了一系列的示例頁面來說明所有這些組件的用法。
       可以從Wrox Web網站上下載這些實例頁面,並在自己的計算機上運行。在下載的文件的Chapter06子目錄中會找到本章所用的程序代碼。
       在運行示例頁面之前,確保MyInfo和Counter組件的“全局”實例化代碼已包含在缺省Web站點的global.asa文件中。在示例文件中提供了global.asa文件中所需要的代碼,可以將這些代碼加到現有的global.asa文件中,不需要更換整個文件。
<!-- declare instance of the ASP Counters component with application-level scope 
-->
<OBJECT ID="objCounters" RUNAT="Server" SCOPE="Application" 
PROGID="MSWC.Counters">
</OBJECT>

<!-- declare instance of the ASP MyInfo component with application-level scope 
-->
<OBJECT ID="objMyInfo" RUNAT="Server" SCOPE="Application" PROGID="MSWC.MyInfo">
</OBJECT>
示例文件的主菜單頁面(Default.ASP)使用Content Linking組件創建到每一個頁面示例的鏈接。因此,我們將首先研究這個組件,也涉及了Ad Rotator和Counters組件的有關問題。

6.2.2 Content Linking組件
       Content Linking組件對網站是非常有用的工具,它提供了內容頁面,或者包含對同一站點上其他頁面的鏈接列表的頁面。它自動把當前顯示頁面的URL與存儲在服務器裡的文本文件的頁面列表匹配起來並且能允許用戶通過頁面列表按正反順序進行浏覽。也就是說,即使訪問者已經在內容頁面中點擊了一個鏈接並且正在查看列表中的某一個頁面,該組件仍然會辨認出所訪問的頁面在列表中的位置。
       因為所有詳細資料均在一個文本文件中,維護網站以及頁面的鏈接僅僅需要編輯這個文本文件。例如可以通過在內容鏈接列表文件中重新排列頁面的順序,來改變它們的顯示順序。
1.  內容鏈接列表的文件
內容鏈接列表文件包括一個簡單的按顯示順序排列的URL列表,同時也提供了相應的描述,用於在內容頁面中顯示鏈接文本。如果需要,還可以增加對每個頁面的注釋,注釋可以幫助識別鏈接,但對訪問者來說注釋是不可見的。
列表文件對於每個頁面包含一個文本行。每一行由URL、描述和注釋所組成,各部分由Tab字符(不是空格,否則文件將不能工作)分隔,最後有回車結束。例如:
newpages.htm        New additions to our site              we update this weekly
offers.htm            Special Offers for this week         we only update this monthly
register.htm           Registration for new users
main.htm               The main forum and chat area      must be registered first
index.htm              Back to the contents page
請注意目標URL必須由一個相對的虛擬或物理的路徑來說明,諸如forum\enter.htm。URL不能使用“http:”、“//”或者“\\”作為開頭,如果要創建上述這樣含有絕對URL的菜單,可以使用ASP建立一個重新定向頁面,而且在內容鏈接列表文件中對其進行指定,例如,建立一個名為redirect.ASP的頁面,包含如下代碼:
<%
'redirect the request to the site specifIEd in the query string
Response.Clear
Response.Redirect Request.QueryString("url")
%>
可以在內容鏈接列表文件中按下述方式使用redirect.ASP文件:
redirect.ASP?url=http://www.cyscape.com/         CyScape BrowserHawk Web Pages
redirect.ASP?url=http://www.softartisans.com/     SA fileUp Component Pages
redirect.ASP?url=http://www.stonebroom.com/swindex.htm              Stonebroom RegEx Pages
2.  Content Linking組件的成員
Content Linking組件提供了八種方法,如表6-1所示。這些方法能夠檢索來自內容鏈接列表文件的條目,既能相對於當前頁面檢索條目,也可以使用索引號檢索絕對條目。第一個條目的索引號是1。
表6-1  Content Linking組件的方法及說明
方 法 
說 明 

GetListCount(links_file) 
返回文件links_file中條目的數量 

GetListIndex(links_file) 
返回文件links_file中當前頁面的索引號 

GetNextURL(links_file) 
返回文件links_file中下個頁面的URL 

GetNextDescription(links_file) 
返回文件links_file中下個頁面的描述 

GetPreviousURL(links_file) 
返回文件links_file中前一個頁面的URL 

GetPreviousDescription(links_file) 
返回文件links_file中前一個頁面的描述 

GetNthURL(links_file,n) 
返回文件links_file中第n個頁面的URL 

GetNthDescription(links_file,n) 
返回文件links_file中第n個頁面的描述 

       如果當前頁面不在內容鏈接列表文件中,則:
       · GetListIndex返回0。
       · GetNextURL和GetNextDescription返回列表文件中最後一個頁面的URL和描述。
       · GetPreviousURL和GetPreviousDescription返回列表文件中第一個頁面的URL和描述。
3.  使用Content Linking組件
一旦創建了自己的內容鏈接文件,就可以把該組件添加到頁面中。這裡有一個典型的示例,它遍歷內容鏈接文件中的所有條目,並且創建一個頁面列表(以超鏈接表示頁面)。
<% ' in VBScript:
Set objNextLink = Server.CreateObject("MSWC.Nextlink")
%>

<UL>
<%
'get the number of entrIEs in the menu file
intCount = objNextLink.GetListCount("contlink.txt")
'loop through the entrIEs
For intLoop = 1 To intCount %>
       <LI>
       <A HREF="<% = objNextLink.GetNthURL("contlink.txt", intLoop) %>">
       <% = objNextLink.GetNthDescription("contlink.txt", intLoop) %>
       </A>
<%
Next
%>
</UL>
這段代碼首先創建了一個Content Linking對象。在普通的<UL>和</UL>標記之間,使用Content Linking對象的GetListCount方法查找在內容鏈接列表文件有多少條目。然後再遍歷這些條目,對於每一個條目在頁面中放入一個<LI>標記,後面跟著一個<A>標記。HREF屬性的值從列表文件中使用GetNthURL方法檢索得到,用作鏈接文本的描述使用GetNthDescription方法得到。
注意,內容列表文件和使用它的ASP頁面應處在同一文件夾中。否則,應提供一個相對物理路徑或一個完整的虛擬路徑,如下所示:
inCount = objNextLink.GetListCount("links\contlink.txt")           'physical path
inCount = objNextLink.GetListCount("/demo/contlink.txt")        'virtual path
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved