創建服務器端的ASP搜索組件(一)
”疚慕菔救綰未唇ㄒ桓鯝SP組件,用它搜索web站點的標題/描述數據庫,并在瀏覽器畫面上將URL連接作為標題列出。這就產生了一個與Microsoft的 Internet Explorer搜索相同的顯示結果。將一些asp web 站點的標題、描述、URL存在一個樣本數據庫Access 中。web站點標題在畫面上顯示的是URL連接,并允許訪問者在另一個畫面內閱讀站點。一個導航條允許將字符串查詢結果的標題列表進行分頁。

數據庫 在源代碼中要注冊Access SearchExample.mdb 數據庫文件,將Microsoft ODBC 數據源管理器作為系統DSN。將SearchExampleDSN 作為數據源名(Data Source Name)輸入。在進入代碼之前,首先來看看數據庫表的結構:
此表名為SearchTable,有四個定義域; ID、 Title 、 Text和 URL 。有一個唯一的初始域,隨著每一個新增加的記錄自動增加是個好辦法。這就是我們的ID域,在代碼中并沒有真正地使用它。
Title(標題)域是一個255字符的文本域,存儲web 站點的標題,查詢成功后列出。
URL 域也是一個255字符的文本域,存儲所引用站點的URL。
Text(正文)域的長度超出了文本域255個字符的限度,所以將其類型定義為Memo。Access Memo 類型和 SQL Server Text 類型的困難在于不要使用SQL 的LIKE 聲明搜索它們內容的忠告。為了饒過這個問題,我們需要走額外的一步,將Memo 域的內容存儲在一個字符串變量中,然后用訪問者的查詢字符串來搜索這一變量。

主機ASP和HTM文件
為了使我們的搜索組件正常工作,我們將使用3個文件,雖然使用其它的結構更容易實施。
第一個文件是htm 文件,將瀏覽器屏幕分割成兩個獨立的畫面。剩下的兩個文件被分別插入這兩個畫面中。將瀏覽器窗口左側的畫面稱為SearchFrame ,因為我們將在這個畫面中輸入搜索查詢。這個畫面還將列出web 站點標題連接供我們選擇。
右側的畫面叫做R ltFrame ,這不奇怪,因為最終要在這個畫面中瀏覽搜索的結果。第一個主文件沒有BODY 標記,并包含了FRAMESET and FRAME 標記:
SearchFrameSet.htm
< HTML >< HEAD >< TITLE >Search Example< /TITLE >< /HEAD >
< FRAMESET ROWS="100%" COLS="250,*" >
< FRAME NAME="SearchFrame" SRC="SearchPage.asp" SCROLLING="AUTO" >
< FRAME NAME="ResultFrame" SRC="ResultPage.htm" SCROLLING="AUTO" >
< /FRAMESET >
< /HTML >
在這里將ROWS 和 COLS 設置成一定的象素長度(250 ), 或者是占窗口的百分比( 100% ),或者是添滿剩余的部分( * ),以此來確定兩個畫面的大小和位置。如果你想探索畫面所有可能的配置,可以參考一本好的HTML書。
在這里重要的是用來填充畫面的代碼文件和畫面本身所使用的名字。左側畫面寬度是250象素,在其區域內裝載SearchPage.asp 文件。正是這個文件包含了我們的ASP組件。右側的畫面裝載ResultPage.htm 文件,作為我們在左側搜索到的連接的閱讀器。在SearchPage.asp 文件中,我們只是簡單地創建組件的一個示例,并調用顯示我們的搜索頁的Public 方法(稍后創建)。
SearchPage.asp
< HTML >< HEAD >< TITLE >Search Frame< /TITLE >< /HEAD >
< BODY BGCOLOR="Silver" TEXT="Navy" LINK="Navy" VLINK="Gray" >
< FONT FACE="Arial" SIZE="2" COLOR="Navy" >
< %
Set objSearch = mobjServer.CreateObject("prjSearch.clsSearch")
objSearch.ShowSearchFrame()
% >
< /FONT >
< /BODY >< /HTML >
我將組件與FONT 標記包在一起以便讓它更好看。除了這一個標記,我在這個例子程序中沒有增加任何文本格式標記。通常我在組件中自由地運用表格、隊列、文本格式標記來構成一個專業用戶接口。在這個例子中暫且放棄這些。右側的畫面中裝載了最簡單的htm 文件:
ResultPage.htm
< HTML >< HEAD >< TITLE >Result Page< /TITLE >< /HEAD >< BODY >
< CENTER >Introduction Result Page< /CENTER >
< /BODY >< /HTML >
它基本上是一個啟動頁面。在左側的畫面內選擇了我們想要瀏覽的web 站點的標題后,要用這個畫面的名字裝載它。現在我們想要瀏覽的web 站點頁面已經就位,現在準備編寫產生SearchPage.asp 動態內容的真正VB方法。
Visual Basic 工程文件
將代碼分成4個私用 VB 方法,從一個包裹了所有方法調用的Public 方法中調用它。在Visual Basic中開始一個新的ActiveX DLL 工程文件。將工程文件命名為prjSearch,將默認類命名為 clsSearch 。確認在Properties 窗口中將類的例示屬性設為5(MultiUse)。

增加對Microsoft Active Server Pages Object Library 和Microsoft ActiveX Data Objects 2.0 Library 的引用。
聲明類變量
有些讀者要求本文涉及用屬性程序設置主機ASP文件的服務器端ASP組件內的變量的解釋和代碼舉例。熟悉VB面向對象編程的讀者可以跳過這部分。在我們的類代碼中,將模塊級變量設置為Private ,提供Let 和 Get 屬性程序將那些變量暴露給主機ASP文件。這將我們的變量裝入類中,這樣一來它們就只能被從頭至尾執行屬性程序的用戶所設置。我們所要聲明的第一組變量是用來保持ScriptingContext 對象變量的:
"''''' Scripting Context Declarations
Private mobjScriptingContext As ScriptingContext
Private mobjRequest As Request
Private mobjResponse As Response
Private mobjServer As Server
為了更加靈活機動,我們允許我們的畫面名和源文件名在主機ASP文件內部修改。在VB方法內,這些變量的值將決定標題將在哪出現,及訪問者選擇的站點在哪顯示。如果畫面名或源文件名在FrameSet FRAMES 標記內被改變了,默認變量就不匹配了。在主機ASP文件中將這些變量設置為新的FRAME 值,就一切恢復正常了。將這些值設置為同樣的ASP源文件還可以避免畫面混在一起。
< %
Set objSearch = mobjServer.CreateObject("prjSearch.clsSearch")
objSearch.SearchFrameURL = "NewSearchPage.asp"
objSearch.ResultFrameURL = "NewResultPage.htm"
objSearch.SearchFrameName = "NewSearchFrame"
objSearch.ResultFrameName = "NewResultFrame"
objSearch.MaxSearchReturn = 10
objSearch.ShowSearchFrame()
% >
在這個例子中我們改變了源文件和畫面的值。我們還將在列表中顯示的標題數從默認的5改為10。當我不能肯定什么樣的設置對于一個程序的功能最好的時候,我就把選擇的權利留給最終用戶。屬性程序就是做這個的。
所以我們聲明6個私用變量,用來寫Get和 Let 屬性,并允許我們從主機ASP文件中設置這些變量。例子中另外一個變量是一個只對Get程序的ASP文件只讀變量。
"'''''' Let/Get Property Procedure Variables
Private mintMaxSearchReturn As Integer
Private mstrSearchFrameURL As String
Private mstrResultFrameURL As String
Private mstrSearchFrameName As String
Private mstrResultFrameName As String
"'''''' Get Property Proceedure Variable
Private mintRecordsSearched As Integer
"'''''' Modular Class Variable
Private mintSearchStart As Integer
變量初始化
盡管這些變量可以由外部設置(通過屬性程序),我們還是希望替他們設置好默認值--以防沒有機會在ASP文件中設置他們。這在類的初始化方法中完成:
Private Sub Class_Initialize()
"''''' Set variables to default values
mintMaxSearchReturn = 5
mstrSearchFrameURL = "SearchPage.asp"
mstrResultFrameURL = "ResultPage.htm"
mstrSearchFrameName = "SearchFrame"
mstrResultFrameName = "ResultFrame"
End Sub
當創建一個類的例示時(主機ASP文件調用它時),我們的變量將被初始化為以上值。可以在代碼內改變變量的值和/或從對象外部通過方法設置它們。
為了讓我們的代碼能夠利用ASP對象模塊,光初始化變量是不夠的,必須獲取ASP對象。當容納了我們組件的ASP頁被訪問瀏覽器打開時,OnStartPage 方法就被調用,這些ASP對象變量就被賦予ASP對象的值。
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
"''''' Set the ASP object variables to use in this class
Set mobjScriptingContext = PassedScriptingContext
Set mobjRequest = mobjScriptingContext.Request
Set mobjResponse = mobjScriptingContext.Response
Set mobjServer = mobjScriptingContext.Server
End Sub
作為一個好的程序員,當離開當前命令行外殼時要將這些對象設置為nothing。
Public Sub OnEndPage()
"''''' Clean up in an instance
Set mobjScriptingContext = Nothing
Set mobjRequest = Nothing
Set mobjResponse = Nothing
Set mobjServer = Nothing
End Sub
從屬性方面設置變量
因為我們將這些變量設置為Properties,它們就只能被這個類模塊內部的代碼所使用。但是用戶確實需要從模塊外部設置這些變量的途徑。這樣我們就需要使用暴露為Public 的屬性程序。
下面的代碼是Get 和LEt 屬性方法設置 mintMaxSearchReturn 變量:
Public Property Get MaxSearchReturn() As Integer
MaxSearchReturn = mintMaxSearchReturn
End Property
Public Property Let MaxSearchReturn(ByVal RHS As Integer)
If RHS >= 0 Then
mintMaxSearchReturn = RHS
End If
End Property
注意Get屬性將當前mintMaxSearchReturn變量賦值為MaxSearchReturn 程序的返回值 - 這是一個基本函數。mintMaxSearchReturn 變量是在類內部聲明的變量之一,它的初始化值為5。通過向組件中設置一個對象變量,ASP主機文件可以得到這個變量的值,然后用對象變量來使用這一方法:
aspVariable = objVariable.MaxSearchReturn
要從ASP主機文件中設置變量中的一個值,我們通過賦一個值 調用Let 方法:
objVariable.MaxSearchReturn = 8
現在Let 方法通過給RHS (右側) 變量賦值8而接收到這個值。增加一個校驗來確定值大于0(負數沒有意義)。這就顯示了屬性程序的威力,因為它允許我們控制用戶可以給私用變量賦予哪些值。如果通過了校驗,就將這個值賦予mintMaxSearchReturn變量。這是在初始化方法賦值之后完成的,因此主機ASP文件就會至少讓最后一個詞與初始化方法有關系。在這種情況下代碼最終說了算。
下面是屬性程序的其余部分:
Public Property Get SearchFrameURL() As String
SearchFrameURL = mstrSearchFrameURL
End Property
Public Property Let SearchFrameURL(ByVal RHS As String)
mstrSearchFrameURL = RHS
End Property
Public Property Get ResultFrameURL() As String
ResultFrameURL = mstrResultFrameURL
End Property
Public Property Let ResultFrameURL(ByVal RHS As String)
mstrResultFrameURL = RHS
End Property
Public Property Get SearchFrameName() As String
SearchFrameName = mstrSearchFrameName
End Property
Public Property Let SearchFrameName(ByVal RHS As String)
mstrSearchFrameName = RHS
End Property
Public Property Get ResultFrameName() As String
ResultFrameName = mstrResultFrameName
End Property
Public Property Let ResultFrameName(ByVal RHS As String)
mstrResultFrameName = RHS
End Property
Public Property Get RecordsSearched() As String
RecordsSearched = mintRecordsSearched
End Property
注意通過僅僅提供Get 方法,我們從本質上創建了一個類以外的只讀變量。

數據庫 在源代碼中要注冊Access SearchExample.mdb 數據庫文件,將Microsoft ODBC 數據源管理器作為系統DSN。將SearchExampleDSN 作為數據源名(Data Source Name)輸入。在進入代碼之前,首先來看看數據庫表的結構:
ID | AutoNumber (Primary Key) |
---|---|
Title | Text (255) |
Text | Memo |
URL | Text (255) |
此表名為SearchTable,有四個定義域; ID、 Title 、 Text和 URL 。有一個唯一的初始域,隨著每一個新增加的記錄自動增加是個好辦法。這就是我們的ID域,在代碼中并沒有真正地使用它。
Title(標題)域是一個255字符的文本域,存儲web 站點的標題,查詢成功后列出。
URL 域也是一個255字符的文本域,存儲所引用站點的URL。
Text(正文)域的長度超出了文本域255個字符的限度,所以將其類型定義為Memo。Access Memo 類型和 SQL Server Text 類型的困難在于不要使用SQL 的LIKE 聲明搜索它們內容的忠告。為了饒過這個問題,我們需要走額外的一步,將Memo 域的內容存儲在一個字符串變量中,然后用訪問者的查詢字符串來搜索這一變量。

主機ASP和HTM文件
為了使我們的搜索組件正常工作,我們將使用3個文件,雖然使用其它的結構更容易實施。
第一個文件是htm 文件,將瀏覽器屏幕分割成兩個獨立的畫面。剩下的兩個文件被分別插入這兩個畫面中。將瀏覽器窗口左側的畫面稱為SearchFrame ,因為我們將在這個畫面中輸入搜索查詢。這個畫面還將列出web 站點標題連接供我們選擇。
右側的畫面叫做R ltFrame ,這不奇怪,因為最終要在這個畫面中瀏覽搜索的結果。第一個主文件沒有BODY 標記,并包含了FRAMESET and FRAME 標記:
SearchFrameSet.htm
< HTML >< HEAD >< TITLE >Search Example< /TITLE >< /HEAD >
< FRAMESET ROWS="100%" COLS="250,*" >
< FRAME NAME="SearchFrame" SRC="SearchPage.asp" SCROLLING="AUTO" >
< FRAME NAME="ResultFrame" SRC="ResultPage.htm" SCROLLING="AUTO" >
< /FRAMESET >
< /HTML >

在這里將ROWS 和 COLS 設置成一定的象素長度(250 ), 或者是占窗口的百分比( 100% ),或者是添滿剩余的部分( * ),以此來確定兩個畫面的大小和位置。如果你想探索畫面所有可能的配置,可以參考一本好的HTML書。
在這里重要的是用來填充畫面的代碼文件和畫面本身所使用的名字。左側畫面寬度是250象素,在其區域內裝載SearchPage.asp 文件。正是這個文件包含了我們的ASP組件。右側的畫面裝載ResultPage.htm 文件,作為我們在左側搜索到的連接的閱讀器。在SearchPage.asp 文件中,我們只是簡單地創建組件的一個示例,并調用顯示我們的搜索頁的Public 方法(稍后創建)。
SearchPage.asp
< HTML >< HEAD >< TITLE >Search Frame< /TITLE >< /HEAD >
< BODY BGCOLOR="Silver" TEXT="Navy" LINK="Navy" VLINK="Gray" >
< FONT FACE="Arial" SIZE="2" COLOR="Navy" >
< %
Set objSearch = mobjServer.CreateObject("prjSearch.clsSearch")
objSearch.ShowSearchFrame()
% >
< /FONT >
< /BODY >< /HTML >
我將組件與FONT 標記包在一起以便讓它更好看。除了這一個標記,我在這個例子程序中沒有增加任何文本格式標記。通常我在組件中自由地運用表格、隊列、文本格式標記來構成一個專業用戶接口。在這個例子中暫且放棄這些。右側的畫面中裝載了最簡單的htm 文件:
ResultPage.htm
< HTML >< HEAD >< TITLE >Result Page< /TITLE >< /HEAD >< BODY >
< CENTER >Introduction Result Page< /CENTER >
< /BODY >< /HTML >
它基本上是一個啟動頁面。在左側的畫面內選擇了我們想要瀏覽的web 站點的標題后,要用這個畫面的名字裝載它。現在我們想要瀏覽的web 站點頁面已經就位,現在準備編寫產生SearchPage.asp 動態內容的真正VB方法。
Visual Basic 工程文件
將代碼分成4個私用 VB 方法,從一個包裹了所有方法調用的Public 方法中調用它。在Visual Basic中開始一個新的ActiveX DLL 工程文件。將工程文件命名為prjSearch,將默認類命名為 clsSearch 。確認在Properties 窗口中將類的例示屬性設為5(MultiUse)。

增加對Microsoft Active Server Pages Object Library 和Microsoft ActiveX Data Objects 2.0 Library 的引用。
聲明類變量
有些讀者要求本文涉及用屬性程序設置主機ASP文件的服務器端ASP組件內的變量的解釋和代碼舉例。熟悉VB面向對象編程的讀者可以跳過這部分。在我們的類代碼中,將模塊級變量設置為Private ,提供Let 和 Get 屬性程序將那些變量暴露給主機ASP文件。這將我們的變量裝入類中,這樣一來它們就只能被從頭至尾執行屬性程序的用戶所設置。我們所要聲明的第一組變量是用來保持ScriptingContext 對象變量的:
"''''' Scripting Context Declarations
Private mobjScriptingContext As ScriptingContext
Private mobjRequest As Request
Private mobjResponse As Response
Private mobjServer As Server
為了更加靈活機動,我們允許我們的畫面名和源文件名在主機ASP文件內部修改。在VB方法內,這些變量的值將決定標題將在哪出現,及訪問者選擇的站點在哪顯示。如果畫面名或源文件名在FrameSet FRAMES 標記內被改變了,默認變量就不匹配了。在主機ASP文件中將這些變量設置為新的FRAME 值,就一切恢復正常了。將這些值設置為同樣的ASP源文件還可以避免畫面混在一起。
< %
Set objSearch = mobjServer.CreateObject("prjSearch.clsSearch")
objSearch.SearchFrameURL = "NewSearchPage.asp"
objSearch.ResultFrameURL = "NewResultPage.htm"
objSearch.SearchFrameName = "NewSearchFrame"
objSearch.ResultFrameName = "NewResultFrame"
objSearch.MaxSearchReturn = 10
objSearch.ShowSearchFrame()
% >
在這個例子中我們改變了源文件和畫面的值。我們還將在列表中顯示的標題數從默認的5改為10。當我不能肯定什么樣的設置對于一個程序的功能最好的時候,我就把選擇的權利留給最終用戶。屬性程序就是做這個的。
所以我們聲明6個私用變量,用來寫Get和 Let 屬性,并允許我們從主機ASP文件中設置這些變量。例子中另外一個變量是一個只對Get程序的ASP文件只讀變量。
"'''''' Let/Get Property Procedure Variables
Private mintMaxSearchReturn As Integer
Private mstrSearchFrameURL As String
Private mstrResultFrameURL As String
Private mstrSearchFrameName As String
Private mstrResultFrameName As String
"'''''' Get Property Proceedure Variable
Private mintRecordsSearched As Integer
"'''''' Modular Class Variable
Private mintSearchStart As Integer
變量初始化
盡管這些變量可以由外部設置(通過屬性程序),我們還是希望替他們設置好默認值--以防沒有機會在ASP文件中設置他們。這在類的初始化方法中完成:
Private Sub Class_Initialize()
"''''' Set variables to default values
mintMaxSearchReturn = 5
mstrSearchFrameURL = "SearchPage.asp"
mstrResultFrameURL = "ResultPage.htm"
mstrSearchFrameName = "SearchFrame"
mstrResultFrameName = "ResultFrame"
End Sub
當創建一個類的例示時(主機ASP文件調用它時),我們的變量將被初始化為以上值。可以在代碼內改變變量的值和/或從對象外部通過方法設置它們。
為了讓我們的代碼能夠利用ASP對象模塊,光初始化變量是不夠的,必須獲取ASP對象。當容納了我們組件的ASP頁被訪問瀏覽器打開時,OnStartPage 方法就被調用,這些ASP對象變量就被賦予ASP對象的值。
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
"''''' Set the ASP object variables to use in this class
Set mobjScriptingContext = PassedScriptingContext
Set mobjRequest = mobjScriptingContext.Request
Set mobjResponse = mobjScriptingContext.Response
Set mobjServer = mobjScriptingContext.Server
End Sub
作為一個好的程序員,當離開當前命令行外殼時要將這些對象設置為nothing。
Public Sub OnEndPage()
"''''' Clean up in an instance
Set mobjScriptingContext = Nothing
Set mobjRequest = Nothing
Set mobjResponse = Nothing
Set mobjServer = Nothing
End Sub
從屬性方面設置變量
因為我們將這些變量設置為Properties,它們就只能被這個類模塊內部的代碼所使用。但是用戶確實需要從模塊外部設置這些變量的途徑。這樣我們就需要使用暴露為Public 的屬性程序。
下面的代碼是Get 和LEt 屬性方法設置 mintMaxSearchReturn 變量:
Public Property Get MaxSearchReturn() As Integer
MaxSearchReturn = mintMaxSearchReturn
End Property
Public Property Let MaxSearchReturn(ByVal RHS As Integer)
If RHS >= 0 Then
mintMaxSearchReturn = RHS
End If
End Property
注意Get屬性將當前mintMaxSearchReturn變量賦值為MaxSearchReturn 程序的返回值 - 這是一個基本函數。mintMaxSearchReturn 變量是在類內部聲明的變量之一,它的初始化值為5。通過向組件中設置一個對象變量,ASP主機文件可以得到這個變量的值,然后用對象變量來使用這一方法:
aspVariable = objVariable.MaxSearchReturn
要從ASP主機文件中設置變量中的一個值,我們通過賦一個值 調用Let 方法:
objVariable.MaxSearchReturn = 8
現在Let 方法通過給RHS (右側) 變量賦值8而接收到這個值。增加一個校驗來確定值大于0(負數沒有意義)。這就顯示了屬性程序的威力,因為它允許我們控制用戶可以給私用變量賦予哪些值。如果通過了校驗,就將這個值賦予mintMaxSearchReturn變量。這是在初始化方法賦值之后完成的,因此主機ASP文件就會至少讓最后一個詞與初始化方法有關系。在這種情況下代碼最終說了算。
下面是屬性程序的其余部分:
Public Property Get SearchFrameURL() As String
SearchFrameURL = mstrSearchFrameURL
End Property
Public Property Let SearchFrameURL(ByVal RHS As String)
mstrSearchFrameURL = RHS
End Property
Public Property Get ResultFrameURL() As String
ResultFrameURL = mstrResultFrameURL
End Property
Public Property Let ResultFrameURL(ByVal RHS As String)
mstrResultFrameURL = RHS
End Property
Public Property Get SearchFrameName() As String
SearchFrameName = mstrSearchFrameName
End Property
Public Property Let SearchFrameName(ByVal RHS As String)
mstrSearchFrameName = RHS
End Property
Public Property Get ResultFrameName() As String
ResultFrameName = mstrResultFrameName
End Property
Public Property Let ResultFrameName(ByVal RHS As String)
mstrResultFrameName = RHS
End Property
Public Property Get RecordsSearched() As String
RecordsSearched = mintRecordsSearched
End Property
注意通過僅僅提供Get 方法,我們從本質上創建了一個類以外的只讀變量。