使用VB建立ASP伺服器端組件
最後更新:2017-02-28
來源:互聯網
上載者:User
建立|伺服器 使用VB建立ASP伺服器端組件
本篇文章通過與傳統的設計方法相比較,介紹了如何在ASP代碼中調用VB組件的方法。在本篇文章中,我們假設讀者具有VB和ASP的相關入門知識。
伺服器端組件和用戶端組件的比較
伺服器端組件和用戶端組件有許多不同之處。伺服器端組件是在電腦伺服器上註冊的DLL檔案,用戶端組件則在瀏覽器啟動並執行電腦上註冊,在IE中,這些用戶端組件被稱作ActiveX瀏覽器外掛程式組件。
ActiveX用戶端組件可以使用VB編寫,並通過互連網或內連網發送給瀏覽器,產生很精彩的效果。問題是,ActiveX用戶端組件只限於IE,而使用VB編寫的伺服器端組件則能夠產生純HTML代碼,適用於所有的瀏覽器。伺服器端組件的最大問題是該組件必須在Windows+IIS環境中或與IIS的API相容的應用中運行。相比較而言,在伺服器端實現這種相容性似乎更容易一些。
IIS伺服器端組件駐留在與IIS相同的記憶體空間中,並隨時準備伺服器上處理的ASP網頁的調用。從理論上說,我們可以在返回瀏覽器的ASP代碼中插入任何文本或代碼,但一般來說,大多數伺服器端組件被用來處理需要大量時間的計算或資料庫資訊尋找,然後將所得到的結果以HTML代碼的形勢返回給瀏覽器。
VB組件的解析
由於本篇文章旨在討論編寫VB組件的基本方法,因此在能夠說明問題的情況下,其中的例子將是十分簡單的。在詳細討論編寫VB組件之前,我們將首先從概念上對VB組件作一番剖析。
在使用VB編寫伺服器端的組件時,有三個分層次的概念(在VB和ASP代碼中都會用到)需要注意:
·Project名字
·Class名字
·Method名字
VB工程的名字就是Project名字。許多開發人員都將Project名字看作是組件名字,但VB只將它看作是工程的名字。在我們的例子中,Project名字是ExampleProject,當然了,我們可以隨意命名自己的工程名字;Class名字名字是ExampleClass,Method名字是ExampleMethod。
工程名字(組件名字)也可以是由組件代碼編譯後得到的DLL檔案的名字,該DLL檔案將包含有被IIS用來向瀏覽器返迴文本或HTML代碼的經過編譯的VB代碼。
方法名字指的是管理特定代碼功能的VB代碼部分,例如計算日期或顯示資料庫中所有作者的清單。組件方法有點角個黑盒子,它完成特定的工作或根據輸入的資訊返回特定的資訊。一般情況下,在一個組件中可以有多個方法。為了更有效地管理組件的方法,可以將方法按照相似的分類組合在一起,這就是組件類的作用。
組件類能夠在記憶體中產生組件類代碼的一個拷貝,在使用ASP代碼建立對象時,它也被稱作對象,這就是執行個體化。一旦有了組件類代碼執行個體的對象引用,我們就可以從ASP代碼中調用類中包含的方法。
在我們的例子中,工程、類、方法的名字將用來在ASP代碼中執行個體化VB組件,並以方法參數的形式從ASP代碼中向VB代碼傳送值,在ASP代碼中接收從VB方法中返回的值。
從ASP檔案中調用VB組件
我們用來調用VB組件的ASP檔案將使用物件變數儲存VB對象的引用。在ASP檔案中,可以使用ASP Server對象的CreateObject()方法建立一個對象,該方法將返回一個它建立的對象的引用。在例子中,我們將使用objReference作為組件的物件變數。下面的代碼顯示ASP代碼在執行個體化VB組件時需要使用組件的工程名和類名(ExampleProject和ExampleClass)。
執行個體化VB組件的ASP代碼:
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
VB組件將從ASP代碼中接受3個變數的值,並向ASP代碼返回一個值,該值將儲存在名字為strMethodReturn的ASP變數中。下面的代碼顯示出ASP代碼是如何得到由VB組件返回的值的,它向VB方法傳送三個名字分別為Param1、Param2和Parma3的三個參數值:
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
Param1、Param2、Param3這三個參數必須與VB組件中方法的定義完全相同,下面是二行執行個體化VB組件的類、並調用類的方法獲得傳回值的ASP代碼的例子:
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)
下面的圖表直觀地顯示了VB組件的工程、類和方法名字是如何與ASP檔案中的組件執行個體化代碼協調的。在逐步地學習如何編寫例子中的VB代碼和ASP檔案時,可以將下面的圖表作為參考。
VB方法的作用
我們例子中簡單的VB組件將獲得使用者的名字和年齡,然後返回一個以天計的使用者的年齡,而且有一個可選項,能夠提醒某個使用者是否已經超過了45歲。
如果我們向組件傳送一個虛構的Eric Clapton作為方法的第一個參數值,將第二個參數設定為56,我們將得到下面的返回字串:
Eric Clapton is over 20440 days old.
如果我們將可選的第三個參數設定為True(這一參數將使方法判斷使用者是否已經超過45歲),我們將會得到下面的返回字串:
Eric Clapton is over 20440 days OLD.
由於使用了三個完全不同的變數━━使用者的姓名、年齡以及表示他們是否超過了45歲,因此我們需要使用三個方法參數將這些資訊從ASP檔案傳送給VB代碼。在VB中,考慮要使用哪些資料類型是十分重要的。我們將使用一個名字為strName的字串型變數表示使用者的姓名,名字為intAge的整型變數表示使用者的年齡,名字為blnAgeEmphasisOn的布爾型變數表明使用者是否已經超過了45歲。
三個方法參數(傳送給VB組件的方法代碼的變數):
strName (String)
intAge (Integer)
blnAgeEmphasisOn (Boolean)
在VB中建立伺服器端組件
啟動VB後,在“新工程”視窗中雙擊“ActiveX DLL”表徵圖。一旦VB載入了新的ActiveX DLL工程,至少會看到二個開啟的視窗:工程視窗和屬性視窗。如果有一個視窗顯示不出來,可以從VB的菜單中選擇“查看”功能表項目(分別使用“查看”->“工程管理器”、“查看”->“屬性視窗”)。
由於VB對第一個工程和類的預設命名分別是Project1、Class1,我們可以將它們分別改為ExampleProject 和ExampleClass。工程名字的修改可以在工程視窗中進行。在工程視窗中新輸入的工程名字左側有一個帶有+或-的小方框。如果顯示的是+號,選擇該小方框,+號就會變成-號,預設的類名(Class1)就會顯示在工程名字的下面。在工程視窗中選擇預設的類名,在屬性視窗中將預設的類名修改為ExampleClass。
在儲存工程時,VB會將包含類的代碼儲存在一個副檔名為CLS的檔案,工程檔案的副檔名為VBP,其中儲存有工程的各種設定、檔案名稱和檔案儲存體的位置。
伺服器端組件的屬性值
在屬性視窗中顯示ExampleClass類的屬性,注意Instancing屬性的值為“5 MultiUse”,如果將工程的類型設定為標準的EXE工程,該屬性的值就會隨之發生改變。
在VB的菜單中選擇“工程”->“ExampleProject屬性”,就會顯示出工程屬性視窗。在“常規”標籤的右下端的“線程模式”屬性的值應當被設定為“單元線程”,這將使多個訪問者能夠同時使用我們的組件類的不同的執行個體。另外,選擇“無人值守執行”和“駐留記憶體”二個選項,避免VB6中的記憶體泄露問題。
VB方法的代碼
現在我們就需要使用VB的代碼視窗來輸入VB代碼了。如果代碼視窗還是一片空白,那就輸入下面的代碼好了:
Option Explicit
'它將要求我們必須定義所有的變數。
Public Function ExampleMethod(ByVal strName As String, _
ByVal intAge As Integer, _
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
在上面的代碼中,我們將方法定義成了一個Public函數,這意味著該組件之外的任何代碼都能夠調用它,由於是一個函數,它還會向調用它的代碼返回一個值。
Public Function ExampleMethod() As String
上面的代碼錶示ExampleMethod()函數將向它的調用者返回一個字串類型的值。
我們的VB方法帶有3個從ASP代碼接受值的參數變數,最後一個參數變數是可選的。所有用來從VB組件之外接收值的參數變數都需要在VB方法的括弧間定義和使用,我們可以象在方法內定義的變數那樣使用以這種方式定義為方法參數的變數,二者之間唯一的區別是外面的ASP代碼來決定它們的值。
下面是三個變數和它們的資料類型:
ByVal strName As String
ByVal intAge As Integer
Optional ByVal blnAgeEmphasisOn As Boolean = False
上面的代碼定義了三個方法參數的資料類型,指明它們是按值傳送的,而且第三個參數是可選的,如果沒有第三個參數,則其預設值為False。
然後,我們將在方法的定義中添加一些必要的逗號、空格和底劃線(_),這樣才能符合VB的文法要求。我們將把參數列表放在方法定義的括弧中間,得到的方法定義如下:
Public Function ExampleMethod(ByVal strName As String, _
ByVal intAge As Integer, _
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
在VB的代碼視窗輸入上面的方法定義,就會產生一個End Function語句。方法的定義和End Function之間就是我們編寫自己的代碼的地方了。
我們在方法的主體中添加的第一行代碼就是定義一個字串變數,用來儲存該方法返回的字串資料。我們可以不使用字串變數而使用字串向調用方法的代碼返迴文本資料。
Dim strReturnString As String
下面我們就可以來建立返回的字串了。我們可以通過方法的參數列表使用由ASP代碼傳送的strName變數值。首先將strName參數變數值與字串“is over”串連起來。接下來我們將使用intAge參數變數計算一個已經生存的天數,然後在前面的字串上再添加“age in days”字串。需要注意的是,我們需要將intAge * 365二個整型數的乘積轉換為字串,然後才能將它組合在strReturnString字串,VB中的Cstr()方法可以實現這一目的。
strReturnString = strName & " is over " & CStr(intAge * 365)
如果假設從ASP代碼中傳給組件的姓名為Eric Clapton,年齡參數為56,因此,strReturnString應當包含下面的內容:
Eric Clapton is over 20440
我們最終的字串會根據intAge變數的值是否超過45和blnAgeEmphasisOn變數是否設定為true再添加上
“days old”或“days OLD”。下面的代碼可以實現該功能:
If blnAgeEmphasisOn And intAge > 44 Then
strReturnString = strReturnString & " days OLD."
Else
strReturnString = strReturnString & " days old."
End If
如果ASP代碼沒有將blnAgeEmphasisOn變數的值作為方法參數傳送給組件,根據我們的方法定義,它的值將被預設地設定為false。如果它被設定為true,而且intAge變數的值大於45,我們將得到下面的輸出:
Eric Clapton is over 20440 days OLD.
否則,我們會得到下面的輸出:
Eric Clapton is over 20440 days old.
為了將上面的字串返回給調用組件的ASP代碼,我們將字串的值賦給方法的名字:
ExampleMethod = strReturnString
完整的方法代碼如下所示:
Public Function ExampleMethod(ByVal strName As String, _
ByVal intAge As Integer, _
Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
'///// 建立局部變數
Dim strReturnString As String
'///// 建立返回的變數的值
strReturnString = strName & " is over " & CStr(intAge * 365)
'///// 完善strReturnString
If blnAgeEmphasisOn And intAge > 44 Then
strReturnString = strReturnString & " days OLD."
Else
strReturnString = strReturnString & " days old."
End If
'///// 返回字串
ExampleMethod = strReturnString
End Function
在ASP代碼中調用VB方法
在ASP代碼中執行個體化VB對象
我們需要的大部分ASP代碼已經在前面的A Conceptual Overview進行了討論。在ASP代碼中,我們仍然需要依次完成下面的工作:
·使用ASP Server對象的CreateObject()方法執行個體化VB組件。
·使用合適的方法參數變數調用組件的方法。
·將從VB方法中返回的字串值賦給ASP變數中的一個變數。
·然後在Response.Write()方法中使用該變數將字串發送給瀏覽器。
我們將使用ASP檔案中的一些代碼對VB組件的類進行執行個體化,下面是VB組件執行個體化的代碼:
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
ASP Server對象的CreateObject()方法返回VB代碼對象的地址,因此我們能夠在ASP中調用類的任何一個public方法。需要注意的是,作為ASP CreateObject()方法的方法參數的是VB工程和類的名字,objReference用來保持組件的類的對象執行個體的引用。
在ASP檔案中使用組件的方法
現在,我們就可以使用組件的類方法ExampleMethod,得到一個表明一個人以天計的壽命。下面的代碼使用參數的值,並將從方法中返回的字串的值賦給一個名字為strMethodReturn的變數:
strMethodReturn = objReference.ExampleMethod("Eric Clapton", 56, True)
提示:當我們的組件被執行個體化後,objReference就表示CreateObject()方法中出現過的ExampleProject.ExampleClass。儘管我們可以將objReference.ExampleMethod看作與ExampleProject.ExampleClass.ExampleMethod()等同,但我們不能這樣使用。
當然了,我們也可以使用變數而不是直接的值作為方法的參數,選擇的參數變數的名字無須與VB方法參數表中的相同,它們只要與參數表中的非選擇性參數個數、類型、順序相同就可以了。
aspName = "Eric Clapton" aspAge = 56 aspEmphasis = True strMethodReturn = objReference.ExampleMethod(aspName, aspAge, aspEmphasis)
使用變數取代值使代碼顯得更清晰,也更具有可管理性,尤其是代碼變得很長時。
現在我們只要在ASP Response.Write()方法中將strMethodReturn返回給訪問ASP代碼的瀏覽器即可。下面是完整的ASP代碼,在代碼的結束處,我們添加了一行分離組件對象地址的代碼,以清除組件的對象代碼:
<%
'///// 執行個體化組件對象
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
'///// 設定作為方法參數的局部變數
aspName = "Eric Clapton"
aspAge = 56
aspEmphasis = True
'///// 調用組件的方法,儲存傳回值
strMethodReturn = objReference.ExampleMethod(aspName, aspAge, aspEmphasis)
'///// 將傳回值發送給訪問的瀏覽器
Response.Write(strMethodReturn)
'///// 清除組件的對象
Set objReference = Nothing
%>
將上面的ASP代碼儲存在一個ASP檔案中,將會產生下面的字串輸出:
Eric Clapton is over 20440 days OLD.
使ASP代碼能夠調用DLL檔案
對我們的組件的測試就是讓Windows知道它的儲存位置以及ASP代碼何時調用它。首先,在VB的菜單中選擇“運行”表徵圖或“運行/開始”,VB就會臨時地向系統註冊該組件。
提示:不能象載入HTML檔案那樣直接使用瀏覽器載入ASP檔案,ASP檔案必須通過WEB伺服器被載入到瀏覽器上。
瀏覽器將顯示出“Eric Clapton is over 20440 days OLD.”的字樣。
為了使組件能夠在其他的伺服器上運行,它必須被編譯成DLL檔案,然後在伺服器上註冊。當然了,如果希望在開發用的電腦永久地使用該組件,也需要進行編譯、註冊。在其他電腦上運行該組件的唯一檔案就是編譯得到的DLL檔案,當然了,這需要電腦已經安裝了VB已耗用時間庫檔案。
如何編譯組件原始碼得到DLL檔案以及如何在電腦上註冊組件不是本篇文章的討論範圍,我們就不再詳細敘述了。
作為編寫IIS伺服器端組件的一個副產品,我們可以從任何ASP檔案和其他VB組件中調用編寫的組件的方法,這將進一步提高代碼的靈活性和模組化程度。