使用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元件中呼叫編寫的元件的方法,這將進一步提高程式碼的靈活性和模組化程度。