使用VB創建ASP服務器端組件
2024-05-04 11:06:30
供稿:網友
使用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組件中調用編寫的組件的方法,這將進一步提高代碼的靈活性和模塊化程度。