小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

使用VB創(chuàng)建服務(wù)器端組件

 加菲 2005-08-16

使用VB創(chuàng)建服務(wù)器端組件

2004-03-18 12:22:48
本篇文章通過(guò)與傳統(tǒng)的設(shè)計(jì)方法相比較,介紹了如何在ASP代碼中調(diào)用VB組件的方法。在本篇文章中,我們假設(shè)讀者具有VB和ASP的相關(guān)入門(mén)知識(shí)。

服務(wù)器端組件和客戶(hù)端組件的比較

服務(wù)器端組件和客戶(hù)端組件有許多不同之處。服務(wù)器端組件是在計(jì)算機(jī)服務(wù)器上注冊(cè)的DLL文件,客戶(hù)端組件則在瀏覽器運(yùn)行的計(jì)算機(jī)上注冊(cè),在IE中,這些客戶(hù)端組件被稱(chēng)作ActiveX瀏覽器插件組件。

ActiveX客戶(hù)端組件可以使用VB編寫(xiě),并通過(guò)互聯(lián)網(wǎng)或內(nèi)聯(lián)網(wǎng)發(fā)送給瀏覽器,生成很精彩的效果。問(wèn)題是,ActiveX客戶(hù)端組件只限于IE,而使用VB編寫(xiě)的服務(wù)器端組件則能夠產(chǎn)生純HTML代碼,適用于所有的瀏覽器。服務(wù)器端組件的最大問(wèn)題是該組件必須在Windows+IIS環(huán)境中或與IIS的API兼容的應(yīng)用中運(yùn)行。相比較而言,在服務(wù)器端實(shí)現(xiàn)這種兼容性似乎更容易一些。

IIS服務(wù)器端組件駐留在與IIS相同的內(nèi)存空間中,并隨時(shí)準(zhǔn)備服務(wù)器上處理的ASP網(wǎng)頁(yè)的調(diào)用。從理論上說(shuō),我們可以在返回瀏覽器的ASP代碼中插入任何文本或代碼,但一般來(lái)說(shuō),大多數(shù)服務(wù)器端組件被用來(lái)處理需要大量時(shí)間的計(jì)算或數(shù)據(jù)庫(kù)信息查找,然后將所得到的結(jié)果以HTML代碼的形勢(shì)返回給瀏覽器。

VB組件的解析

由于本篇文章旨在討論編寫(xiě)VB組件的基本方法,因此在能夠說(shuō)明問(wèn)題的情況下,其中的例子將是十分簡(jiǎn)單的。在詳細(xì)討論編寫(xiě)VB組件之前,我們將首先從概念上對(duì)VB組件作一番剖析。

在使用VB編寫(xiě)服務(wù)器端的組件時(shí),有三個(gè)分層次的概念(在VB和ASP代碼中都會(huì)用到)需要注意:

·Project名字

·Class名字

·Method名字

VB工程的名字就是Project名字。許多開(kāi)發(fā)人員都將Project名字看作是組件名字,但VB只將它看作是工程的名字。在我們的例子中,Project名字是ExampleProject,當(dāng)然了,我們可以隨意命名自己的工程名字;Class名字名字是ExampleClass,Method名字是ExampleMethod。

工程名字(組件名字)也可以是由組件代碼編譯后得到的DLL文件的名字,該DLL文件將包含有被IIS用來(lái)向?yàn)g覽器返回文本或HTML代碼的經(jīng)過(guò)編譯的VB代碼。

方法名字指的是管理特定代碼功能的VB代碼部分,例如計(jì)算日期或顯示數(shù)據(jù)庫(kù)中所有作者的清單。組件方法有點(diǎn)角個(gè)黑盒子,它完成特定的工作或根據(jù)輸入的信息返回特定的信息。一般情況下,在一個(gè)組件中可以有多個(gè)方法。為了更有效地管理組件的方法,可以將方法按照相似的分類(lèi)組合在一起,這就是組件類(lèi)的作用。

組件類(lèi)能夠在內(nèi)存中生成組件類(lèi)代碼的一個(gè)拷貝,在使用ASP代碼創(chuàng)建對(duì)象時(shí),它也被稱(chēng)作對(duì)象,這就是實(shí)例化。一旦有了組件類(lèi)代碼實(shí)例的對(duì)象引用,我們就可以從ASP代碼中調(diào)用類(lèi)中包含的方法。

在我們的例子中,工程、類(lèi)、方法的名字將用來(lái)在ASP代碼中實(shí)例化VB組件,并以方法參數(shù)的形式從ASP代碼中向VB代碼傳送值,在ASP代碼中接收從VB方法中返回的值。

從ASP文件中調(diào)用VB組件

我們用來(lái)調(diào)用VB組件的ASP文件將使用對(duì)象變量保存VB對(duì)象的引用。在ASP文件中,可以使用ASP Server對(duì)象的CreateObject()方法創(chuàng)建一個(gè)對(duì)象,該方法將返回一個(gè)它創(chuàng)建的對(duì)象的引用。在例子中,我們將使用objReference作為組件的對(duì)象變量。下面的代碼顯示ASP代碼在實(shí)例化VB組件時(shí)需要使用組件的工程名和類(lèi)名(ExampleProject和ExampleClass)。

實(shí)例化VB組件的ASP代碼:

Set objReference = Server.CreateObject("ExampleProject.ExampleClass")


VB組件將從ASP代碼中接受3個(gè)變量的值,并向ASP代碼返回一個(gè)值,該值將存儲(chǔ)在名字為strMethodReturn的ASP變量中。下面的代碼顯示出ASP代碼是如何得到由VB組件返回的值的,它向VB方法傳送三個(gè)名字分別為Param1、Param2和Parma3的三個(gè)參數(shù)值:

strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)

Param1、Param2、Param3這三個(gè)參數(shù)必須與VB組件中方法的定義完全相同,下面是二行實(shí)例化VB組件的類(lèi)、并調(diào)用類(lèi)的方法獲得返回值的ASP代碼的例子:


Set objReference = Server.CreateObject("ExampleProject.ExampleClass")
strMethodReturn = objReference.ExampleMethod(Param1, Param2, Param3)


下面的圖表直觀地顯示了VB組件的工程、類(lèi)和方法名字是如何與ASP文件中的組件實(shí)例化代碼協(xié)調(diào)的。在逐步地學(xué)習(xí)如何編寫(xiě)例子中的VB代碼和ASP文件時(shí),可以將下面的圖表作為參考。

   



VB方法的作用

我們例子中簡(jiǎn)單的VB組件將獲得用戶(hù)的名字和年齡,然后返回一個(gè)以天計(jì)的用戶(hù)的年齡,而且有一個(gè)可選項(xiàng),能夠提醒某個(gè)用戶(hù)是否已經(jīng)超過(guò)了45歲。

如果我們向組件傳送一個(gè)虛構(gòu)的Eric Clapton作為方法的第一個(gè)參數(shù)值,將第二個(gè)參數(shù)設(shè)置為56,我們將得到下面的返回字符串:

Eric Clapton is over 20440 days old.

如果我們將可選的第三個(gè)參數(shù)設(shè)置為T(mén)rue(這一參數(shù)將使方法判斷用戶(hù)是否已經(jīng)超過(guò)45歲),我們將會(huì)得到下面的返回字符串:

Eric Clapton is over 20440 days OLD.

由于使用了三個(gè)完全不同的變量━━用戶(hù)的姓名、年齡以及表示他們是否超過(guò)了45歲,因此我們需要使用三個(gè)方法參數(shù)將這些信息從ASP文件傳送給VB代碼。在VB中,考慮要使用哪些數(shù)據(jù)類(lèi)型是十分重要的。我們將使用一個(gè)名字為strName的字符串型變量表示用戶(hù)的姓名,名字為intAge的整型變量表示用戶(hù)的年齡,名字為blnAgeEmphasisOn的布爾型變量表明用戶(hù)是否已經(jīng)超過(guò)了45歲。

三個(gè)方法參數(shù)(傳送給VB組件的方法代碼的變量):

strName (String)
intAge (Integer)
blnAgeEmphasisOn (Boolean)


在VB中創(chuàng)建服務(wù)器端組件

啟動(dòng)VB后,在“新工程”窗口中雙擊“ActiveX DLL”圖標(biāo)。一旦VB加載了新的ActiveX DLL工程,至少會(huì)看到二個(gè)打開(kāi)的窗口:工程窗口和屬性窗口。如果有一個(gè)窗口顯示不出來(lái),可以從VB的菜單中選擇“查看”菜單項(xiàng)(分別使用“查看”->“工程管理器”、“查看”->“屬性窗口”)。

由于VB對(duì)第一個(gè)工程和類(lèi)的缺省命名分別是Project1、Class1,我們可以將它們分別改為ExampleProject 和ExampleClass。工程名字的修改可以在工程窗口中進(jìn)行。在工程窗口中新輸入的工程名字左側(cè)有一個(gè)帶有+或-的小方框。如果顯示的是+號(hào),選擇該小方框,+號(hào)就會(huì)變成-號(hào),缺省的類(lèi)名(Class1)就會(huì)顯示在工程名字的下面。在工程窗口中選擇缺省的類(lèi)名,在屬性窗口中將缺省的類(lèi)名修改為ExampleClass。

在保存工程時(shí),VB會(huì)將包含類(lèi)的代碼保存在一個(gè)擴(kuò)展名為CLS的文件,工程文件的擴(kuò)展名為VBP,其中存儲(chǔ)有工程的各種設(shè)置、文件名和文件存儲(chǔ)的位置。

服務(wù)器端組件的屬性值

在屬性窗口中顯示ExampleClass類(lèi)的屬性,注意Instancing屬性的值為“5 MultiUse”,如果將工程的類(lèi)型設(shè)置為標(biāo)準(zhǔn)的EXE工程,該屬性的值就會(huì)隨之發(fā)生改變。

在VB的菜單中選擇“工程”->“ExampleProject屬性”,就會(huì)顯示出工程屬性窗口。在“常規(guī)”標(biāo)簽的右下端的“線(xiàn)程模式”屬性的值應(yīng)當(dāng)被設(shè)置為“單元線(xiàn)程”,這將使多個(gè)訪問(wèn)者能夠同時(shí)使用我們的組件類(lèi)的不同的實(shí)例。另外,選擇“無(wú)人值守執(zhí)行”和“駐留內(nèi)存”二個(gè)選項(xiàng),避免VB6中的內(nèi)存泄露問(wèn)題。

VB方法的代碼

現(xiàn)在我們就需要使用VB的代碼窗口來(lái)輸入VB代碼了。如果代碼窗口還是一片空白,那就輸入下面的代碼好了:

Option Explicit
      ‘它將要求我們必須定義所有的變量。
 
  Public Function ExampleMethod(ByVal strName As String, _
                           ByVal intAge As Integer, _
                  Optional ByVal blnAgeEmphasisOn As Boolean = False) As String

   


在上面的代碼中,我們將方法定義成了一個(gè)Public函數(shù),這意味著該組件之外的任何代碼都能夠調(diào)用它,由于是一個(gè)函數(shù),它還會(huì)向調(diào)用它的代碼返回一個(gè)值。

Public Function ExampleMethod() As String


上面的代碼表示ExampleMethod()函數(shù)將向它的調(diào)用者返回一個(gè)字符串類(lèi)型的值。

我們的VB方法帶有3個(gè)從ASP代碼接受值的參數(shù)變量,最后一個(gè)參數(shù)變量是可選的。所有用來(lái)從VB組件之外接收值的參數(shù)變量都需要在VB方法的括號(hào)間定義和使用,我們可以象在方法內(nèi)定義的變量那樣使用以這種方式定義為方法參數(shù)的變量,二者之間唯一的區(qū)別是外面的ASP代碼來(lái)決定它們的值。

下面是三個(gè)變量和它們的數(shù)據(jù)類(lèi)型:


         ByVal strName As String
           ByVal intAge As Integer
  Optional ByVal blnAgeEmphasisOn As Boolean = False
 


上面的代碼定義了三個(gè)方法參數(shù)的數(shù)據(jù)類(lèi)型,指明它們是按值傳送的,而且第三個(gè)參數(shù)是可選的,如果沒(méi)有第三個(gè)參數(shù),則其缺省值為False。

然后,我們將在方法的定義中添加一些必要的逗號(hào)、空格和底劃線(xiàn)(_),這樣才能符合VB的語(yǔ)法要求。我們將把參數(shù)列表放在方法定義的括號(hào)中間,得到的方法定義如下:

Public Function ExampleMethod(ByVal strName As String, _
                             ByVal intAge As Integer, _
                    Optional ByVal blnAgeEmphasisOn As Boolean = False) As String
 


在VB的代碼窗口輸入上面的方法定義,就會(huì)生成一個(gè)End Function語(yǔ)句。方法的定義和End Function之間就是我們編寫(xiě)自己的代碼的地方了。

我們?cè)诜椒ǖ闹黧w中添加的第一行代碼就是定義一個(gè)字符串變量,用來(lái)存儲(chǔ)該方法返回的字符串?dāng)?shù)據(jù)。我們可以不使用字符串變量而使用字符串向調(diào)用方法的代碼返回文本數(shù)據(jù)。

Dim strReturnString As String
下面我們就可以來(lái)建立返回的字符串了。我們可以通過(guò)方法的參數(shù)列表使用由ASP代碼傳送的strName變量值。首先將strName參數(shù)變量值與字符串“is over”連接起來(lái)。接下來(lái)我們將使用intAge參數(shù)變量計(jì)算一個(gè)已經(jīng)生存的天數(shù),然后在前面的字符串上再添加“age in days”字符串。需要注意的是,我們需要將intAge * 365二個(gè)整型數(shù)的乘積轉(zhuǎn)換為字符串,然后才能將它組合在strReturnString字符串,VB中的Cstr()方法可以實(shí)現(xiàn)這一目的。

strReturnString = strName & " is over " & CStr(intAge * 365)


如果假設(shè)從ASP代碼中傳給組件的姓名為Eric Clapton,年齡參數(shù)為56,因此,strReturnString應(yīng)當(dāng)包含下面的內(nèi)容:

Eric Clapton is over 20440

我們最終的字符串會(huì)根據(jù)intAge變量的值是否超過(guò)45和blnAgeEmphasisOn變量是否設(shè)置為true再添加上

“days old”或“days OLD”。下面的代碼可以實(shí)現(xiàn)該功能:

If blnAgeEmphasisOn And intAge > 44 Then
       strReturnString = strReturnString & " days OLD."
  Else
       strReturnString = strReturnString & " days old."
  End If


如果ASP代碼沒(méi)有將blnAgeEmphasisOn變量的值作為方法參數(shù)傳送給組件,根據(jù)我們的方法定義,它的值將被缺省地設(shè)置為false。如果它被設(shè)置為true,而且intAge變量的值大于45,我們將得到下面的輸出:

Eric Clapton is over 20440 days OLD.

否則,我們會(huì)得到下面的輸出:

Eric Clapton is over 20440 days old.

為了將上面的字符串返回給調(diào)用組件的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
 
      ‘///// 創(chuàng)建返回的變量的值
      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代碼中調(diào)用VB方法

在ASP代碼中實(shí)例化VB對(duì)象

我們需要的大部分ASP代碼已經(jīng)在前面的A Conceptual Overview進(jìn)行了討論。在ASP代碼中,我們?nèi)匀恍枰来瓮瓿上旅娴墓ぷ鳎?

·使用ASP Server對(duì)象的CreateObject()方法實(shí)例化VB組件。

·使用合適的方法參數(shù)變量調(diào)用組件的方法。

·將從VB方法中返回的字符串值賦給ASP變量中的一個(gè)變量。

·然后在Response.Write()方法中使用該變量將字符串發(fā)送給瀏覽器。

我們將使用ASP文件中的一些代碼對(duì)VB組件的類(lèi)進(jìn)行實(shí)例化,下面是VB組件實(shí)例化的代碼:

Set objReference = Server.CreateObject("ExampleProject.ExampleClass")


ASP Server對(duì)象的CreateObject()方法返回VB代碼對(duì)象的地址,因此我們能夠在ASP中調(diào)用類(lèi)的任何一個(gè)public方法。需要注意的是,作為ASP CreateObject()方法的方法參數(shù)的是VB工程和類(lèi)的名字,objReference用來(lái)保持組件的類(lèi)的對(duì)象實(shí)例的引用。

在ASP文件中使用組件的方法

現(xiàn)在,我們就可以使用組件的類(lèi)方法ExampleMethod,得到一個(gè)表明一個(gè)人以天計(jì)的壽命。下面的代碼使用參數(shù)的值,并將從方法中返回的字符串的值賦給一個(gè)名字為strMethodReturn的變量:

strMethodReturn = objReference.ExampleMethod("Eric Clapton", 56, True)


提示:當(dāng)我們的組件被實(shí)例化后,objReference就表示CreateObject()方法中出現(xiàn)過(guò)的ExampleProject.ExampleClass。盡管我們可以將objReference.ExampleMethod看作與ExampleProject.ExampleClass.ExampleMethod()等同,但我們不能這樣使用。

當(dāng)然了,我們也可以使用變量而不是直接的值作為方法的參數(shù),選擇的參數(shù)變量的名字無(wú)須與VB方法參數(shù)表中的相同,它們只要與參數(shù)表中的非可選參數(shù)個(gè)數(shù)、類(lèi)型、順序相同就可以了。



aspName = "Eric Clapton" aspAge = 56 aspEmphasis = True strMethodReturn = objReference.ExampleMethod(aspName, aspAge, aspEmphasis)


使用變量取代值使代碼顯得更清晰,也更具有可管理性,尤其是代碼變得很長(zhǎng)時(shí)。

現(xiàn)在我們只要在ASP Response.Write()方法中將strMethodReturn返回給訪問(wèn)ASP代碼的瀏覽器即可。下面是完整的ASP代碼,在代碼的結(jié)束處,我們添加了一行分離組件對(duì)象地址的代碼,以清除組件的對(duì)象代碼:



<%
‘///// 實(shí)例化組件對(duì)象
Set objReference = Server.CreateObject("ExampleProject.ExampleClass")

‘///// 設(shè)置作為方法參數(shù)的局部變量
aspName = "Eric Clapton"
aspAge = 56
aspEmphasis = True

‘///// 調(diào)用組件的方法,存儲(chǔ)返回值
strMethodReturn = objReference.ExampleMethod(aspName, aspAge, aspEmphasis)

‘///// 將返回值發(fā)送給訪問(wèn)的瀏覽器
Response.Write(strMethodReturn)

‘///// 清除組件的對(duì)象
Set objReference = Nothing
%>


將上面的ASP代碼存儲(chǔ)在一個(gè)ASP文件中,將會(huì)產(chǎn)生下面的字符串輸出:

Eric Clapton is over 20440 days OLD.

使ASP代碼能夠調(diào)用DLL文件

對(duì)我們的組件的測(cè)試就是讓W(xué)indows知道它的存儲(chǔ)位置以及ASP代碼何時(shí)調(diào)用它。首先,在VB的菜單中選擇“運(yùn)行”圖標(biāo)或“運(yùn)行/開(kāi)始”,VB就會(huì)臨時(shí)地向系統(tǒng)注冊(cè)該組件。

提示:不能象加載HTML文件那樣直接使用瀏覽器加載ASP文件,ASP文件必須通過(guò)WEB服務(wù)器被加載到瀏覽器上。

瀏覽器將顯示出“Eric Clapton is over 20440 days OLD.”的字樣。

為了使組件能夠在其他的服務(wù)器上運(yùn)行,它必須被編譯成DLL文件,然后在服務(wù)器上注冊(cè)。當(dāng)然了,如果希望在開(kāi)發(fā)用的計(jì)算機(jī)永久地使用該組件,也需要進(jìn)行編譯、注冊(cè)。在其他計(jì)算機(jī)上運(yùn)行該組件的唯一文件就是編譯得到的DLL文件,當(dāng)然了,這需要計(jì)算機(jī)已經(jīng)安裝了VB運(yùn)行時(shí)間庫(kù)文件。

如何編譯組件源代碼得到DLL文件以及如何在計(jì)算機(jī)上注冊(cè)組件不是本篇文章的討論范圍,我們就不再詳細(xì)敘述了。

作為編寫(xiě)IIS服務(wù)器端組件的一個(gè)副產(chǎn)品,我們可以從任何ASP文件和其他VB組件中調(diào)用編寫(xiě)的組件的方法,這將進(jìn)一步提高代碼的靈活性和模塊化程度

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多