内容载入中...
ShowSearchFrame 方法
ShowSearchFrame是唯一一个声明为Public 的主方法。它不接收自变量,动态生成搜索-输入域、导航条和标题列表。这是通过调用4个支持性Private 方法实现的。
在ShowSearchFrame 方法中要声明多个变量,是为了引用我们的支持性Private 方法时进行传递。在应用它们的Private 方法的上下文中进行解释。
调用的第一个Private 方法是 SearchInputField 函数。这个函数返回一个字符串,在我们这个例子中,字符串由HTML标记和文本填充,以产生一个文本输入区和搜索按钮。
我们将这个HTML代码存储在字符串变量strHTML中:
Public Function ShowSearchFrame() As String
"~~~~~ Local variables
Dim strHTML As String
"===== Search input field
strHTML = SearchInputField
End Function
SearchInputField 函数 SearchInputField 函数不接收自变量。但是它动态地设置一个由页面访问者决定的变量。它还设置源文件名和画面名,与在SearchFrameSet.htm 文件中使用的FRAME 标记名相匹配,这是与决定我们站点的画面特征的SearchFrameSet.htm 相同的文件。
首先看看将要返回的HTML代码:
< FORM NAME="SearchForm" METHOD="GET" ACTION="SearchPage.asp" TARGET="SearchFrame" >
< INPUT TYPE="TEXT" NAME="Src" MAXLENGTH="50" SIZE=15 VALUE="" >
< INPUT TYPE=SUBMIT VALUE="Search" >
< /FORM >
表单的NAME标记设置为 SearchForm。ACTION标记设置为SearchPage.asp, 这是mstrSearchFrameURL变量的默认值。
任何从这个表单的输入域中输入的文本都将传送到源文件(SearchPage.asp )。我们的情况是,这个源文件自引用完全相同的asp 文件,其中容纳着包含SearchInputField 方法的组件。实质上,这个表单调用了它自己,这是设置默认的结构。
在浏览器中,这个HTML代码生成下面的文本输入控件:

现在当访问者在输入域中键入文本并且点击Search 按钮时,文本就会被附在SearchPage.asp URL结尾处。这是因为FORM标记内的METHOD被设置为GET,而不是POST。
POST当然是这两种方法中较好的一个,因为它在HTTP 头文件中隐藏了输入的文本并且允许更长的值。但是我们的例子中,是一个短的文本值,? T 也能允许通过将一个查询字符串附在任何URL的结尾来调用方法。它还有一个好处就是允许浏览器缓存查询结果,因为在进行GET 时,缓存在完整的URL上工作。这样就可以快速访问每个搜索页面,并且在后来离线浏览。
当访问者输入"component" 作为他们的文本输入时,我们的表单发送下面的URL和查询字符串:
SearchPage.asp?Src=component
你还可以从任何站点将这一声明作为一个连接包含在一个HREF标记内--SearchPage.asp 文件不需FORM标记就能工作。
以下是完整的SearchInputField 函数,它生成以上的HTML 代码和浏览器输入控制:
Private Function SearchInputField() As String
Dim strHTML As String
"~~~~ Search input form start
strHTML = strHTML & "< FORM NAME=""SearchForm"" METHOD=""GET"" ACTION=""" _
& mstrSearchFrameURL & """ TARGET=""" & mstrSearchFrameName & """ >"
"~~~~ Search input field
strHTML = strHTML & "< INPUT TYPE=""TEXT"" NAME=""Src"" MAXLENGTH=""50""" _
& "SIZE=15 VALUE=""" & mobjRequest.QueryString("Src") & """ >"
"~~~~ Search input button
strHTML = strHTML & "< INPUT TYPE=SUBMIT VALUE=""Search"" >"
"~~~~ Search input form end
strHTML = strHTML & "< /FORM >"
SearchInputField = strHTML
End Function
请注意我们是如何在HTML代码的连接片段内连接属性程序变量来使用它们的。还要注意HTML标记内要求的单引号(") 是如何被双引号("") 引用的,这样就可以避免VB把它作为一个字符串常量的开头或结尾而产生错误。
还有一个需要注意的是,在INPUT标记内被设置为VALUE的变量。它从查询字符串mobjRequest.QueryString("Src") 中得到它的值,聪明的读者会认出它就是标记本身的名字:
VALUE=""" & mobjRequest.QueryString("Src")
这个自引用查询字符串将在它的文本域内显示发送时在域中键入的任何文本。由于在文本输入域中键入"component" 将把?Src=component附在URL的结尾,INPUT 标记的值将在输入文本框中显示Src的值。
假设在文本输入域内键入的是"component" ,则发送的URL是?/P >
SearchPage.asp?Src=component
而下面的VB代码< INPUT TYPE=""TEXT"" NAME=""Src"" VALUE=""" & _
mobjRequest.QueryString("Src") & """ >
将生成
< INPUT TYPE="TEXT" NAME="Src" VALUE="component" >
而且将显示:

现在用户可以输入一个查询字符串,并将其发送到我们的组件看看查询字符串完成一次搜索。
||||||回到ShowSearchFrame 方法第二部分 回到我们的ShowSearchFrame 方法,它是在SearchInputField 方法中被调用的,我们将返回的HTML代码存储在strHTML变量中。但是在我们将它发送给浏览器之前,必须要确定访问者是否已经输入了一个搜索查询文本让我们在搜索数据库过程中使用。
这是通过校验Src 查询字符串变量是否为空实现的。如果为空,就通知访问者现在他们可以输入查询字符串了。当访问者进入一个搜索站点,连接到一个没有Src 查询字符串的网页时通常就会看到这样的提示。
ShowSearchFrame 调用 SearchInputField 方法并将HTML输入控制代码存储到strHTML 变量后,我们要查看一下这是不是一个新用户或查询请求:
"===== Search input field
strHTML = SearchInputField
If mobjRequest.QueryString("Src") = "" Then
"~~~~~ No query was entered
strHTML = strHTML & "Enter a query"
Else
"[Search code here]
End If
如果没有名为Src的查询字符串,连接来自我们的组件以外,我们可以将一个介绍性的信息附在strHTML 代码上(从这个组件发送一个空查询也会产生同样效果):
strHTML = strHTML & "Enter a query"
现在我们的第一个HTML代码已经完整了,我们将它发送给 IIS在访问者的浏览器上显示:
Else
"[Search code here]
End If
"~~~~~ Send html code to IIS for delivery to visitors browse r
mobjResponse.Write (strHTML )
产生下面的显示:

访问者输入了要组件搜索的文本以后,以上的条件If 语句就会发现VBmobjRequest.QueryString("Src") 变量不为空,分支控制逻辑就会流向选择的Else 部分。然后连接到数据库并在数据库中搜索匹配的Title 和 Text 域。
因为我们要搜索一个Access Memo 型域,或者说是SQL 服务器文本型域,我们不在SQL声明内使用LIKE 语句。相反,我们通过以下的SQL字符串返回一个记录集:
SELECT Title, Text, URL FROM SearchTable
可以用一个帐号群ID、一个典型范围或者在过滤表中有相关内容的任何类别来限制初始查询。
由于SQL声明恢复每个记录,我们就很快地搜索Title和 Text 域寻找与我们的访问者所提交的文本查询字符串相匹配的内容。这个字符串的搜索用VB InStr声明来实现。如果找到了匹配,并且我们在导航分界线的范围之内,就将标题和URL放置在动态字符串数列里。
查看导航分界线限制实质上是从记录的子集中选择一个标题和UR列表L。然后,用户就可以用"next"来访问标题的下一个列表或用"back" 来访问已经看过的列表中的前一个。实际上就是在向浏览器进行显示时,限制从数据库搜索返回的文本数量。
现在我们的数据库中充满了从SQL声明中提取出来的记录(如果你在SQL 声明中使用了WHERE 过滤器的话就可能是一个有限数量的记录)。然后用InStr 声明在每一个返回记录中搜索一个匹配。这就在SQL声明返回的数据库记录中创建了一个虚拟子集。如果这个子集比我们将要显示的大的话,就不将它存储在VB变量中。相反我们选择我们子集的另一个子集在web 页面上显示。我们将数据库域的变量分配限制在最后的子集中,从而节省系统资源并提高运行速度。

document.getElementById('loading').style.display="none";