5. Web实用技巧

本章重点
 

介绍Web实用技巧,包括提高IIS执行效率、善用IIS 5.0 ASP新功能、制作Web图表、与资料库连结传送E-Mail、全文检索搜寻网页等实用技巧。

Web实用技巧
 

本章介绍Web实用的技巧,如下:

5-1 如何提高IIS执行效率呢?
 

提高IIS执行效率
 

如何提高IIS执行效率呢 ?

提高IIS执行效率的方法如下:

  1. 启用HTTP的持续作用可以改善15~20%的执行效率
  2. 不启用记录可以改善5~8%的执行效率。
  3. 使用 独立 的处理程序会损失20%的执行效率。
  4. 增加快取记忆体的保存档案数量,可提高Active Server Pages之效能。
  5. 勿使用CGI程式。
  6. 增加IIS 5.0电脑CPU数量。
  7. 勿启用ASP侦错功能。
  8. 静态网页采用HTTP压缩,大约可以减少20%的传输量。

简单介绍如下。

启用HTTP的持续作用
 

启用HTTP的持续作用(Keep-Alive)时,IIS与浏览器的连线不会断线,可以改善执行效率,直到浏览器关闭时连线才会断线。因为维持「Keep-Alive」状态时,当每次用户端请求时都不须重新建立一个新的连接,所以将改善伺服器的效率。

此功能为HTTP 1.1预设的功能,HTTP 1.0加上Keep-Alive header也可以提供HTTP的持续作用功能。

启用HTTP的持续作用可以改善15~20%的执行效率。

如何启用HTTP的持续作用呢 ? 步骤如下:

 Internet服务管理员 中,选取整个IIS电脑、或Web站台,於 内容  Web站台 标签页,勾选 启用HTTP的持续作用 选项,如下:


 

不启用记录
 

不启用记录可以改善5~8%的执行效率。

如何设定不启用记录呢 ? 步骤如下:

 Internet服务管理员 中,选取整个IIS电脑、或Web站台,於 内容  Web站台 标签页,不勾选 启用记录 选项,如下:


 

设定非独立的处理程序
 

使用 独立 的处理程序会损失20%的执行效率,此处所谓「独立」系指将 主目录  虚拟目录 标签页之 应用程式保护 选项设定为 高(独立的) 时。因此 应用程式保护 设定为 低 (IIS处理程序) 时执行效率较高,设定画面如下:

如何设定非「独立」的处理程序呢 ? 步骤如下:

 Internet服务管理员 中,选取整个IIS电脑、Web站台、或应用程式的起始目录。於 内容  主目录  虚拟目录 标签页,设定 应用程式保护 选项为 低 (IIS处理程序) ,如下:


 

调整快取(Cache)记忆体
 

IIS 5.0将静态的网页资料暂存於快取(Cache)记忆体当中;IIS 4.0则将静态的网页资料暂存於档案当中。调整快取(Cache)记忆体的保存档案数量可以改善执行效率。

ASP指令档案执行过後,会在暂存於快取(Cache)记忆体中以提高执行效能。增加快取记忆体的保存档案数量,可提高Active Server Pages之效能。

您可以设定所有在整个IIS电脑、「独立」Web站台、或「独立」应用程式上执行之应用程式的快取记忆体档案数量。

如何设定快取(Cache)功能呢 ? 步骤如下:

 Internet服务管理员 中,选取整个IIS电脑、「独立」Web站台、或「独立」应用程式的起始目录。於 内容  主目录  虚拟目录 标签页,按下 设定 按钮,即可由 处理程序选项 标签页设定 指令档快取记忆体 ,如下:


 

如何设定快取(Cache)记忆体档案数量呢 ? 步骤如下:

 Internet服务管理员 中,选取整个IIS电脑、或Web站台的起始目录。於 内容  伺服器扩充程式 标签页,按下 设定 按钮,如下:


 

即可设定快取(Cache)记忆体档案数量,如下:


 

勿使用CGI程式
 

使用CGI程式时,因为处理程序(Process)须不断地产生与摧毁,而造成执行效率不佳。

一般而言,执行效率比较如下:

  • 静态网页(Static):100
     
  • ISAPI:50
     
  • ASP:10
     
  • CGI:1
     

换句话说,ASP比CGI可能快10倍,因此勿使用CGI程式可以改善IIS的执行效率。

以弹性(Flexibility)而言:ASP > CGI > ISAPI > 静态网页(Static)。

以安全(Security)而言:ASP(独立) = ISAPI(独立)= CGI > ASP(非独立) = ISAPI(非独立)= 静态网页(Static)。

增加IIS 5.0电脑CPU数量
 

根据微软的测试报告,增加IIS 4.0电脑CPU数量,执行效率并不会改善多少;但是增加IIS 5.0电脑CPU数量,执行效率会几乎成正比地提供,换句话说,两颗CPU的IIS 5.0电脑执行效率几乎是一颗CPU电脑的两倍,四颗CPU的IIS 5.0电脑执行效率几乎是一颗CPU电脑的四倍。

IIS 5.0将静态的网页资料暂存於快取(Cache)记忆体当中;IIS 4.0则将静态的网页资料暂存於档案当中。调整快取(Cache)记忆体的保存档案数量可以改善执行效率。

勿启用ASP侦错功能
 

勿启用ASP侦错功能可以改善执行效率。

如何勿启用ASP侦错功能呢 ? 步骤如下:

 Internet服务管理员 中,选取Web站台、或应用程式的起始目录,按右键并选择 内容 ,然後按下 主目录  虚拟目录  目录 标签页,按下 设定 按钮,选择 应用程式侦错 标签页,请不要勾选 启用ASP伺服器端指令侦错  启用ASP用户端指令侦错 选项,如下:


 

静态网页采用HTTP压缩
 

静态网页采用HTTP压缩,大约可以减少20%的传输量。

HTTP压缩功能启用或关闭,系针对整台IIS伺服器来设定。

用户端使用IE 5.0浏览器连线到已经启用HTTP压缩IIS 5.0之Web伺服器,才有HTTP压缩功能。

如何启用HTTP压缩功能呢 ? 步骤如下:

若要启用HTTP压缩功能,方法为在 Internet服务管理员 中,选取电脑之 内容 ,於 主要内容 之下选取 WWW服务 。然後按一下 编辑 按钮,於 服务 标签页上,选取 压缩静态档案 可以压缩静态档案,请不要选取 压缩应用程式档案 ,如下:


 

动态产生的内容档案(压缩应用程式档案)也可以压缩,但是须耗费额外CPU处理时间,若% Processor Time已经百分之八十或更多时,建议不要压缩。

测试执行效率
 

执行效率可使用一些工具来测试,譬如使用加压测试工具(Stress Tool),您可由以下网址下载:

 http://webtool.rte.microsoft.com 

您学会了吗 ?

5-2 如何善用IIS 5.0新功能呢?
 

针对IIS 5.0所提供的新功能,您要如何善用呢 ?

本节依照本书所介绍,归纳如下:

  1. 判断是否使用IIS 5.0
  2. 侦测使用者是否仍然连线
  3. 使用新的转向方法Transfer与Execute
  4. 使用伺服器端Scriptlet
  5. Recordset与XML整合
  6. 善用Active Directory Service
  7. 善用Certificate Services
  8. 善用Indexing Service

简单介绍如下。

判断是否使用IIS 5.0
 

使用Request.ServerVariables("SERVER_SOFTWARE")判断是否使用IIS 5.0("Microsoft-IIS/5.0"),如下:

if Request.ServerVariables("SERVER_SOFTWARE") = "Microsoft-IIS/5.0" then
	'IIS 5.0程式 
else
	'IIS 4.0程式
end if

侦测使用者是否仍然连线
 

Response.IsClientConnected侦测使用者是(True)否(False)仍然连线。

譬如:

如何善用IIS 5.0新功能呢 ?

<% 
  '侦测使用者是(True)否(False)仍然连线
  If Response.IsClientConnected = False Then 
    '若未连线则取得SessionID,并加予处理
     Shutdown(Session.SessionID) 
  End If
%>

若侦测使用者未连线,则取得SessionID,并呼叫Shutdown函数加予处理。

使用新的转向方法Transfer与Execute
 

使用新的转向方法Server.Transfer与Server.Execute方法,直接由IIS 5.0於网站伺服器端直接转向到另一个网页,不需像Response.Redirect先传送到浏览器再要求网站伺服器转向,如此会减少一次用户端与网站伺服器之间的来回通讯时间。


说明

有关新的转向方法部份,请参阅 2-2〈如何使用Server.Transfer/Execute呢 ? 〉 。


使用伺服器端Scriptlet
 

ASP支援伺服器端Scriptlet(指令元件)指令技术,可以从.asp档案以将Scriptlet当成COM元件的方式来呼叫。

您可以用VBScript或Jscript的语言(不需要使用Visual Basic、C++、或者Java语言来编写程式)编写Scriptlet,储存成.sct副档名,注册为元件成功後,即可当成COM元件(Component Object Model)般来呼叫使用。


说明

有关Scriptlet部份,请参阅 2-4〈ASP如何支援伺服器端Scriptlet呢 ? 〉 。


Recordset与XML整合
 

ADO支援XML,可以直接将recordset的资料,以XML格式储存成一个XML档案或输出(Response)到浏览器;或将recordset的资料以XML格式储存於记忆体中(使用STREAM物件)。包括:

  1.  Recordset储存成XML档案: ADO 2.1版,直接将recordset的资料,以XML格式储存成一个XML档案,使用RS.Save "xxx.xml", adPersistXML指令。
  2.  Recordset以XML格式输出到浏览器: ADO 2.5版,直接将recordset的资料,以XML格式输出(Response)到浏览器,使用RS.Save Response, adPersistXML指令。
  3.  Recordset以XML格式储存於记忆体: ADO 2.5版,将recordset的资料以XML格式储存於记忆体(使用STREAM物件)中,使用RS.Save ST, adPersistXML指令。
  4.  记忆体XML格式资料转到Recordset: ADO 2.5版,将储存於记忆体(使用STREAM物件)中XML格式资料转到recordset中,使用RS.Open ST指令。

说明

有关XML部份,请参阅 第叁章〈IIS 5.0与XML〉 。


善用Active Directory Service
 

Active Directory Service让我们使用浏览器透过网际网路或intranet内部网路,来存取管理Windows 2000的资源。

Active Directory Service,将使用者帐号、群组、服务、档案、网路上的印表机、IIS、Exchange Server等,都视为目录下的一个个体,我们可以查询,或是控制目录下的个体。


说明

有关Active Directory Service部份,请参阅 第四章〈ASP与ADSI〉 。


善用Certificate Services
 

Certificate Services 2.0可以自己扮演CA(凭证授权单位),自己可以发行伺服器凭证、用户端凭证。

CA所发行凭证,用於数位签章、SSL安全传输、TLS传输层安全、S/MIME保护邮件等。


说明

有关Certificate Services部份,请参阅 第十章〈伺服器凭证与SSL〉 、 第十一章〈用户端凭证与数位签名〉 。


善用Indexing Service
 

Indexing Service(索引服务)可搜寻虚拟目录中的网页内容。

Indexing Service(索引服务),提供中文全文检索的搜寻功能,可以搜寻网站中Microsoft Word或Microsoft Excel档案、text、html、ASP等档案格式内的资料。


说明

有关Indexing Service部份,请参阅 5-5〈如何全文检索搜寻网页呢 ? 〉 。


5-3 如何制作Web图表呢?
 

如何於浏览器上显示Web图表
 

图表能让使用者方便地看到资料间的比较和趋势。若於浏览器上可以显示图表,使用者就可以透过网际网路或intranet内部网路,来查询资料库资料所制作出的Web图表。如何於浏览器制作Web图表呢 ?

答案之一为使用Microsoft Office 2000 Web元件。

Microsoft Office Web元件
 

Microsoft Office Web元件,让使用者可以建立动态的互动式Web图表,而这种Web图表可以用浏览器在网路上检视。如果变更图表的资料,Web图表也会自动更新。

若使用试算表元件控制项,当使用浏览器的使用者变更了试算表中的数值时,Web图表将自动更新以反映出所作变更。

Web图表可以使用资料库的资料,也可以使用由Microsoft Office Web元件建立的试算表或枢纽分析表清单中的资料。

如果要检视和处理图表,使用者必须安装 Microsoft Office Web元件 。您可以透过安装Microsoft Office 2000来安装这些元件,或者,如果公司具有Office 2000授权允许,则可以透过公司的企业内部网下载 Microsoft Office Web元件 。使用者必须具有Microsoft Internet Explorer 4.01版或更高版本才可以处理图表。

Web图表的类型
 

Microsoft Office Web元件所提供的Web图表之类型如下:

  1.  区域图: 区域图显示绘图值的和,以及显示部分与整体之间的关联。如下图:
     

  2.  直条图: 直条图显示了一段时间内的资料变化情况,或说明了各项之间的比较情况。如下图:
     

    堆叠直条图显示了单项与整体之间的关联。如下图:


     

  3.  长条图: 长条图说明了各单项之间的比较情况。如下图:
     

    堆叠横条图显示了各单项与整体之间的关联。如下图:


     

  4.  折线图: 折线图等间距地显示了资料的预测趋势。如下图:
     

  5.  平滑图: 平滑图等间距地显示了资料的预测趋势,并透过平滑设定弧形显示了间距间的估计值。如下图:
     

  6.  圆形图: 圆形图显示了各项相对於项总和的比例大小。如下图:
     

    可以建立具有多个数列的堆叠圆形图。如下图:


     

  7.  环圈图: 像圆形图一样,环圈图也显示部分与整体之间的关联,但环圈图可以包含多个值数列,环圈图的每个环都代表一个值数列。如下图:
     

  8.  股票图: 两种股价的股票图:开盘—盘高—盘低—收盘图和盘高—盘低—收盘图。
  9.  XY散布图: XY散布图可以显示多个值数列中数值之间的关联,也可以将两组数字绘图成一系列XY座标。如下图:
     

  10.  泡泡图: 泡泡图是一种XY散布图。
  11.  雷达图: 在雷达图中,每个类别都有自己的值轴,此值轴由中心点向外发散。折线连接了相同数列中的所有值。如下图:
     

  12.  极座标图: 极座标图可比较角度和距离之间的关联。如下图:
     

如何制作Web图表呢?
 

如何制作以上各种Web图表呢 ?

Web图表与资料相结合的方式如下:

  1. 於阵列设定资料
  2. 使用字串设定资料
  3. 使用ADO记录集中的资料
  4. 使用Microsoft Office试算表中的资料
  5. 使用Microsoft Office资料来源控制项中的资料

分别说明如下:

於阵列设定资料
 

於阵列中设定资料建立图形的方法为,首先将阵列设定为类别资料和值资料,然後透过SetData方法设定图形资料。

於阵列中设定资料之HTML码webcompl.htm与说明如下,用浏览器在网路上检视的结果如上各图:

<object id=ChartSpace1 classid=CLSID:0002E500-0000-0000-C000-000000000046 style="
width:100%;height:350"></object> 
<script language=vbs> Sub Window_OnLoad()
	Dim categories(3), values(3) 
建立具有二个数列和四季的直条图,用於显示每季的营业额净利 
建立代表类别的字串阵列。
所有二个数列的类别都一样。
	categories(0) = "Q1"
	categories(1) = "Q2"
	categories(2) = "Q3"
	categories(3) = "Q4" 
清除图形工作空间中的内容。这将移除任何既存图形,并彻底清空图形工作空间。
随後再新增一个图表物件。
	ChartSpace1.Clear
	ChartSpace1.Charts.Add
	Set c = ChartSpace1.Constants 
向图形中新增二个数列。
	ChartSpace1.Charts(0).SeriesCollection.Add
	ChartSpace1.Charts(0).SeriesCollection.Add  
第一个数列中包含每季的净利资料。
设定数列的标题(图例中显示的文字)。
ChartSpace1.Charts(0).SeriesCollection(0).Caption = "净利" 
设定第一个数列的类别(此集合最小为零) 
ChartSpace1.Charts(0).SeriesCollection(0).SetData 
c.chDimCategories,c.chDataLiteral, categories 
	values(0) = 120 ' Q1
	values(1) = 150 ' Q2
	values(2) = 190 ' Q3
	values(3) = 250 ' Q4 
	ChartSpace1.Charts(0).SeriesCollection(0).Caption = "净利"
	ChartSpace1.Charts(0).SeriesCollection(0).SetData c.chDimCategories, 
c.chDataLiteral, categories
	ChartSpace1.Charts(0).SeriesCollection(0).SetData c.chDimValues, 
c.chDataLiteral, values 
	' 第二个数列中包含每季的营业额资料。
	' 更新值阵列,然後设定图形资料。
	values(0) = 420 ' Q1
	values(1) = 500 ' Q2
	values(2) = 630 ' Q3
	values(3) = 940 ' Q4 
	ChartSpace1.Charts(0).SeriesCollection(1).Caption = "营业额"
	ChartSpace1.Charts(0).SeriesCollection(1).SetData c.chDimCategories, 
c.chDataLiteral, categories
	ChartSpace1.Charts(0).SeriesCollection(1).SetData c.chDimValues, 
c.chDataLiteral, values 
	' 使图表图例可见,将左数值座标轴的格式设定为百分比, 
	' 并指定数值格线的间隔为10%。
	ChartSpace1.Charts(0).HasLegend = True
	ChartSpace1.Charts(0).Type = 0
	ChartSpace1.Charts(0).Axes(c.chAxisPositionLeft).NumberFormat = "000"
	ChartSpace1.Charts(0).Axes(c.chAxisPositionLeft).MajorUnit = 100
End Sub 
Sub next1()
if ChartSpace1.Charts(0).Type = 45 then		
	ChartSpace1.Charts(0).Type = 0
else	
	ChartSpace1.Charts(0).Type = ChartSpace1.Charts(0).Type + 1
end if
form1.bu1.value = "Type = " & ChartSpace1.Charts(0).Type
End Sub
</script> 
<form name=form1>
<input name=bu1 type=button value="Type = 0" onclick=next1()>
</form>

使用字串设定资料
 

除了於阵列中设定资料建立图形的方法外,您也可以首先用Tab Chr(9) 分隔为类别资料和值资料,然後透过SetData方法设定图形资料。譬如:

categories = "Q1" & Chr(9) & "Q2" & Chr(9) & "Q3" & Chr(9) & "Q4"

使用ADO记录集中的资料
 

您可以使用ADO记录集连结到使用者电脑资料库中的资料譬如webcomp2.htm:

<object id=ChartSpace1 classid=CLSID:0002E500-0000-0000-C000-000000000046 
style="width:100%;height:350"></object>
<object id=ADOConnection1 classid=CLSID:00000514-0000-0010-8000-00AA006D2EA4></object> 
<script language=vbs> Sub Window_OnLoad()
    Dim rs, categories, values
    categories = ""
    values = "" 
    ' 开启连接并执行查询。
    ADOConnection1.Open "DRIVER={Microsoft Access Driver 
(*.mdb)};DBQ=c:\iis5samp\samples.mdb"
    Set rs = ADOConnection1.Execute("SELECT CustID,SellQty FROM ORDER1")
    rs.MoveFirst
    While Not rs.EOF
        categories = categories & rs.Fields(0).Value & Chr(9)
        values = values & rs.Fields(1).Value & Chr(9)
        rs.MoveNext
    Wend
    rs.Close
    ADOConnection1.Close
    
    ' 删除字元串末尾的额外定位字元。
    categories = Left(categories, Len(categories) - 1)
    values = Left(values, Len(values) - 1)
    
    ' 建立只有一个销售数列的图形。
    ChartSpace1.Clear
    ChartSpace1.Charts.Add
    ChartSpace1.Charts(0).SeriesCollection.Add
    ChartSpace1.Charts(0).SeriesCollection(0).Caption = "销售" 
    '使用根据记录集建立的字串设定数列类别和值。
    Set c = ChartSpace1.Constants
    ChartSpace1.Charts(0).SeriesCollection(0).SetData c.chDimCategories, 
c.chDataLiteral, categories
    ChartSpace1.Charts(0).SeriesCollection(0).SetData c.chDimValues, 
c.chDataLiteral, values
    
    ' 设定图表类型并将座标轴设定为圆形。
    ChartSpace1.Charts(0).Type = 18
    'ChartSpace1.Charts(0).Axes(c.chAxisPositionBottom).NumberFormat = "$#,##0"
End Sub
</script>

用浏览器在网路上检视的结果如下图:


 

使用Microsoft Office试算表中的资料
 

使用Microsoft Office试算表中资料的方法为,首先用DataSource属性将图形与试算表相结合,然後使用SetData方法设定来自试算表区域中的图形资料。用浏览器在网路上检视webcomp3.htm的结果如下图:


 

使用试算表元件控制项,当使用浏览器的使用者变更了试算表中的数值时,Web图表将自动更新以反映出所作变更。使用Microsoft Office试算表中资料之HTML码与webcomp3.htm说明如下:

<object id=ChartSpace1 classid=CLSID:0002E500-0000-0000-C000-000000000046 
style="width:100%;height:350"></object> 
<object id=Spreadsheet1 classid=CLSID:0002E510-0000-0000-C000-000000000046 
style="width:49%;height:350"></object> 
<script language=vbs> Sub Window_OnLoad()
    ' 先将资料放入 [Spreadsheet1] 中。
    Spreadsheet1.ActiveSheet.Cells.Clear
    Spreadsheet1.ActiveSheet.Cells(2, 1).Value = "Q1"
    Spreadsheet1.ActiveSheet.Cells(3, 1).Value = "Q2"
    Spreadsheet1.ActiveSheet.Cells(4, 1).Value = "Q3"
    Spreadsheet1.ActiveSheet.Cells(5, 1).Value = "Q4"    
    Spreadsheet1.ActiveSheet.Cells(1, 2).Value = "净利"
    Spreadsheet1.ActiveSheet.Cells(2, 2).Value = 100
    Spreadsheet1.ActiveSheet.Cells(3, 2).Value = 120
    Spreadsheet1.ActiveSheet.Cells(4, 2).Value = 134
    Spreadsheet1.ActiveSheet.Cells(5, 2).Value = 150    
    Spreadsheet1.ActiveSheet.Cells(1, 3).Value = "营业额"
    Spreadsheet1.ActiveSheet.Cells(2, 3).Value = 540
    Spreadsheet1.ActiveSheet.Cells(3, 3).Value = 670
    Spreadsheet1.ActiveSheet.Cells(4, 3).Value = 777
    Spreadsheet1.ActiveSheet.Cells(5, 3).Value = 989 
' 清除图形工作空间中的内容。这将移除任何既存图形,并彻底清空图形工作空间。
' 随後再新增一个图表物件。

ChartSpace1.Clear
ChartSpace1.Charts.Add
Set c = ChartSpace1.Constants 
    ' 将图形的DataSource属性设定为试算表。
    ' 可指定多个值源,但本范例只用一个。
    ChartSpace1.DataSource = Spreadsheet1
     ' 向图形中新增叁个数列。
    ChartSpace1.Charts(0).SeriesCollection.Add
    ChartSpace1.Charts(0).SeriesCollection.Add 
    ' 第一个数列中包含每季的净利资料。
    ' 请将数列名称、类别名称和数值结合起来。
    ChartSpace1.Charts(0).SeriesCollection(0).SetData c.chDimSeriesNames, 0, "B1"
    ChartSpace1.Charts(0).SeriesCollection(0).SetData c.chDimCategories, 0, "A2:A5"
    ChartSpace1.Charts(0).SeriesCollection(0).SetData c.chDimValues, 0, "B2:B5"
        ' 第二个数列中包含每季的营业额资料。
    ChartSpace1.Charts(0).SeriesCollection(1).SetData c.chDimSeriesNames, 0, "C1"
    ChartSpace1.Charts(0).SeriesCollection(1).SetData c.chDimCategories, 0, "A2:A5"
    ChartSpace1.Charts(0).SeriesCollection(1).SetData c.chDimValues, 0, "C2:C5" 
ChartSpace1.Charts(0).HasLegend = True
ChartSpace1.Charts(0).Type = 0
ChartSpace1.Charts(0).Axes(c.chAxisPositionLeft).NumberFormat = "000"
ChartSpace1.Charts(0).Axes(c.chAxisPositionLeft).MajorUnit = 100
End Sub 
Sub next1()
if ChartSpace1.Charts(0).Type = 45 then
	ChartSpace1.Charts(0).Type = 0
else
	ChartSpace1.Charts(0).Type = ChartSpace1.Charts(0).Type + 1
end if
form1.bu1.value = "Type = " & ChartSpace1.Charts(0).Type
End Sub
</script>
<form name=form1>
<input name=bu1 type=button value="Type = 0" onclick=next1()>
</form>

您学会了吗 ?

5-4 如何与资料库连结传送E-Mail呢?
 

SMTP Service
 

SMTP Service提供Internet Mail的传送方式,适合各种Internet Mail Server,使用SMTP Service传送E-Mail的语法,如下mail.asp:

Set mail1 = Server.CreateObject("CDONTS.NewMail")
mail1.To = "收件者E-Mail位址"
mail1.From = "寄件者E-Mail位址"         
mail1.Subject = "主旨"
mail1.Body = "E-Mail内文"              
mail1.Send

定义SMTP元件後,设定收件者E-Mail位址、寄件者E-Mail位址、主旨、内文後,只要下个「mail1.Send」指令,即可开始执行传送一封E-Mail的动作。

「收件者E-Mail位址」必须为「xxx@yyy」格式。

看个例子就知道「传送E-Mail」如何设计了!

浏览本书所附安装於网站伺服器的mail.asp档案,填入待传送E-Mail的内容,按下 传送 按钮来传送一封E-Mail,浏览执行的结果如下:


 

於用户端的浏览器填好表单(form)的输入资料,按下「传送」的Submit按钮後,经过Internet、Intranet传送HTTP讯息到网站伺服器,请求於网站伺服器执行一个表单所设定的相同应用程式mail.asp。

伺服器由「Request.("Action")」得知是按了 传送 按钮,而由「Request.("表单栏位")」得知表单的各输入值。您只要设定收件者E-Mail位址、寄件者E-Mail位址、主旨、内文後,下个「mail1.Send」指令,即可开始执行传送一封E-Mail的动作。

相关的程式码如下:

<FORM Name=Form1 METHOD=GET ACTION="mail.asp">        
	收件人: <Input Type=Text VALUE="james@abc.net.tw" Name=to><br> 
寄件人: <Input Type=Text VALUE="jack@abc.net.tw" Name=from><br>
	主旨: <Input Type=Text VALUE="Say Hello!" Name=sub><br>
	内文: <TEXTAREA NAME=TEXT1>How are you?</TEXTAREA>
   	<INPUT Type=Submit Value="传送">                
</FORM> 
<%
if Request("Action") = "传送" then
	Set mail1 = Server.CreateObject("CDONTS.NewMail")
         
	mail1.To = Request("to")
	mail1.From = Request("from")          
	mail1.Subject = Request("sub")
	mail1.Body = Request("txt")
    	mail1.Send 
	Response.Write("e-mail已经传送.<br>")
end if 
%>

所传送的E-Mail置於\Inetpub\mailroot\下:


 


说明

注意此台IIS电脑不能安装Exchange Server。


有意思吗 ?

与资料库连结传送E-Mail
 

SMTP Service可与资料库连结後,传送E-Mail给资料库所有的收件者。

若E-Mail的收件者位於一个资料库,想要传送E-Mail给所有符合资料库查询结果的多个E-Mail位址时,首先使用Microsoft Access、Microsoft SQL Server 、Text档案、或任何一种支援ODBC的资料库,建立一个资料表Customer,其中Email栏位储存想要传送的所有E-Mail位址。

譬如使用Microsoft Access建立一个资料表Customer,如下:


 

於用户端使用浏览器,填入待传送E-Mail的内容,按下 Send All EMail 按钮,浏览执行mail.asp的结果如下,您传送了所有Email栏位的E-Mail位址:


 

所传送E-Mail的内容,如下:

How are you?
Company: abc
Name: Tom
Addresss: 台北市
Tel: 1234-2545

其中收件者等以下资料系取自资料库,随不同的收件者而异。

於用户端的浏览器填好表单(form)的输入资料,按下「Send All EMail」的Submit按钮後,经过Internet、Intranet传送HTTP讯息到网站伺服器,请求於网站伺服器执行一个表单所设定的相同应用程式mail.asp。

伺服器由「Request. ("Action")」得知是按了 Send All EMail 按钮,而由「Request.("表单栏位")」得知表单的各输入值。

下个「SELECT * FROM Customer」的SQL指令,读取资料表Customer资料库的资料,储存到recordset。

您可由「IF RS.EOF THEN 」判断是否有资料。若有资料,伺服器由「Do While Not RS.EOF... RS.MoveNext... Loop」读取资料表Customer所有的资料,由「RS("栏位")得知资料表某个栏位的值,如由「RS("EMail") 」设定收件者。由「RS("Company") 」得知公司等资料,加入到E-Mail内文。

设定收件者E-Mail位址、寄件者E-Mail位址、寄件者、主旨、内文後,下个「mail1.Send」指令,即可开始执行传送所有E-Mail的动作。

相关的程式码如下:

<FONT COLOR="#FF8080">■ </FONT> <FONT COLOR="BLUE">传送资料库所有E-Mail</FONT><p>     
<form action="mail.asp" method="post">     
收件者: Customer资料库EMail栏位<BR>     
寄件者: <INPUT TYPE=TEXT NAME=FROM1 VALUE="jack@abc.net.tw" SIZE=30><BR>     
主旨: <INPUT TYPE=TEXT NAME=SUB1 VALUE="Say Hello!" SIZE=30><BR>     
内文: <TEXTAREA NAME=TEXT1 rows="1" cols="20">How are you?</TEXTAREA><BR>     
<INPUT TYPE=submit VALUE="Send All EMail" name= "Action">     
</form>     
<%     
IF Request("Action") = "Send All EMail" then     
  Set Conn = Server.CreateObject("ADODB.Connection")     
  Conn.Open "DBQ="& Server.MapPath("mail.mdb") &";Driver={Microsoft Access 
Driver (*.mdb)};FIL=MS Access;"      
  SQL = "SELECT * FROM Customer"     
  Set RS = Conn.Execute(SQL)        
  IF RS.EOF THEN      
  '找不到 !     
    response.Write "找不到资料库EMail栏位的收件者 !"     
  ELSE          
   Do While Not RS.EOF      
	Set mail1 = Server.CreateObject("CDONTS.NewMail")  
	mail1.To = RS("EMail")     
	mail1.From = Request("FROM1")               
	mail1.Subject = Request("SUB1")     
	Body = Request("TEXT1") & chr(10)     
    	Body = Body & "Company: " & RS("Company") & chr(10)     
    	Body = Body & "Name: " & RS("Name") & chr(10)     
    	Body = Body & "Addresss: " & RS("Address") & chr(10)     
    	Body = Body & "Tel: " & RS("Tel")     
	mail1.Body = Body                     
	mail1.Send     
	Set mail1 = nothing
    	response.Write "<BR>传送收件者 " &  RS("Name") & " " &  RS("EMail")         
   RS.MoveNext     
   Loop    	     
  END IF      
  RS.Close     
  Conn.Close      
	Response.Write("<p>已经传送资料库所有E-Mail.<br>")     
END IF     
%>

精彩吗 ?

5-5 如何全文检索搜寻网页呢?
 

Indexing Service
 

使用者可以使用Indexing Service(索引服务)来搜寻虚拟目录中的网页内容。

Indexing Service(索引服务),提供中文全文检索的搜寻功能,可以搜寻网站中Microsoft Word或Microsoft Excel档案、text、html、ASP等档案格式内的资料。

首先必须先启动Indexing Service(索引服务),除了於Service启动外,另一个方法为在命令提示字元下输入以下指令:

net start cisvc

如下画面:


 

其次必须启动虚拟目录的 编制这个资源的索引  读取 权限,方法为在 Internet服务管理员 中,在 内容  虚拟目录 标签页,勾选 编制这个资源的索引  读取 存取权限选项,如下画面:


 

勾选 编制这个资源的索引 时,Indexing Service(索引服务)会为此目录建立索引,以进行搜寻。勾选 读取 选项,让使用者可以於搜寻目录後,观看搜寻的结果。

搜寻设计方法
 

Indexing Service(索引服务)搜寻设计的方法十分简单,首先定义物件,如下:

set Q = Server.CreateObject("ixsso.Query")

定义後即可由物件的Query、SortBy、Columns、MaxRecords属性(properties)来设定搜寻字串、排列顺序、搜寻的栏位、最多搜寻笔数,如下:

Q.Query = 搜寻字串

Q.SortBy = 排列顺序

Q.Columns = 搜寻的栏位

Q.MaxRecords = 最多搜寻笔数

排列顺序可依照栏位、和排列方式,设定为「栏位1 [ [a]|[d] ] [ , 栏位2 [ [a]|[d] ] ] . . . 」,排列方式为向上(a,预设值)或向下(d)。

搜寻的栏位可设定为DocTitle(标题)、vpath(URL位址)、filename(档案名称)、size(档案大小)、write(档案写入日期时间)、characterization(摘要)、rank(搜寻相符率),栏位中间以逗点相分隔之。

最後下个执行搜寻的方法CreateRecordSet,即可开始搜寻,并将搜寻结果储存於ADO recordset当中,如下:

set RS = Q.CreateRecordSet("nonsequential")

搜寻结果,可以由ADO recordset当中读到,如下:

  • RS.RecordCount:搜寻相符的笔数。
     
  • RS("rank"):搜寻相符率,最大为1000。
     
  • RS("DocTitle"):标题。
     
  • RS("vpath"):URL位址。
     
  • RS("characterization"):摘要。
     
  • RS("size"):档案大小。
     
  • RS("filename"):档案名称。
     
  • RS("write"):档案写入日期时间。
     

Indexing Service(索引服务)搜寻范例
 

看个例子就知道「Indexing Service(索引服务)」如何设计了!

於用户端使用浏览器,浏览本书所附安装於网站伺服器的query1.asp档案,填入待搜寻的字串,按下 搜寻 按钮,如下:


 

搜寻执行的结果如下:


 

相关的程式码如下:

<%
if Request("Action") = "搜寻" then
    set Q = Server.CreateObject("ixsso.Query") 
    Q.Query = Request("SearchString")
    Q.SortBy = "rank[d]"
    Q.Columns = "DocTitle, vpath, filename, size, write, characterization, rank"
    Q.MaxRecords = 50 
    set RS = Q.CreateRecordSet("nonsequential") 
Response.Write "总计 " & RS.RecordCount & " 项<p>" 
%>
<% Do While Not RS.EOF %>
<%if VarType(RS("DocTitle")) = 1 or RS("DocTitle") = "" then%> 
<a href="<%=RS("vpath")%>"><%= Server.HTMLEncode( RS("filename") )%>
</a> (<%= rs("rank") %>)
<%else%> <a href="<%=RS("vpath")%>"><%= Server.HTMLEncode(RS("DocTitle"))%></a> (<%= rs("rank") %>)
<%end if%>
<BR> 
<%if VarType(RS("characterization")) = 8 and RS("characterization") <> "" then%> 
摘要:<%= Server.HTMLEncode(RS("characterization"))%><br>
<%end if%> 
http://<%=Request("server_name")%><%=RS("vpath")%><br>
<%if not RS("size") = "" then%> size <%=RS("size")%> bytes - <%=RS("write")%> GMT
<%end if%>
<P>
<%
      RS.MoveNext
      Loop 
end if
%> 
<hr> 
<FORM ACTION="query1.asp" METHOD=POST> 搜寻字串:
<INPUT TYPE="TEXT" NAME="SearchString" SIZE="30" MAXLENGTH="100" VALUE="<%=Request("SearchString")%>"></TD>
<INPUT TYPE="SUBMIT" NAME="Action" 
VALUE="搜寻">
</FORM>

於用户端的浏览器的表单输入查询字串,按下「搜寻」的Submit按钮後,经过Internet、Intranet传送HTTP讯息到网站伺服器,请求於网站伺服器执行一个表单所设定的相同应用程式query1.asp。

伺服器由「Request.("Action")」得知是按了 搜寻 按钮,由「Request.("表单栏位 ")」得知表单的各输入值。

定义搜寻物件後,由物件的Query、SortBy、Columns、MaxRecords属性(properties)来设定搜寻字串、排列顺序、搜寻的栏位、最多搜寻笔数。最後下个执行搜寻的方法CreateRecordSet,即可开始搜寻,并将搜寻结果储存於ADO recordset当中。

搜寻结果,可以由ADO recordset的RS.RecordCount(搜寻相符的笔数)、RS("rank")(搜寻相符率)、RS("DocTitle")(标题)、RS("vpath")(URL位址)、RS("characterization") (摘要)、RS("size") (档案大小)、RS("filename")(档案名称)、RS("write")(档案写入日期时间)显示出来。

动作是否正常呢?

Indexing Service(索引服务)搜寻完整范例
 

让我们看个完整的例子!

於用户端使用浏览器,浏览本书范例query2.asp,填入待搜寻的字串,按下 搜寻 按钮,如下:


 

搜寻执行的结果如下:


 

您可做下一页、和上一页的搜寻,如下:


 

相关的程式码如下:

<%
FormformScopeope = "/"
PageSize = 10
SiteLocale = "EN-US" 
%>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=big5">
<%
NewQuery = FALSE
UseSavedQuery = FALSE
SearchString = "" 
QueryForm = Request.ServerVariables("PATH_INFO") 
'查询
if Request.ServerVariables("REQUEST_METHOD") = "POST" then
        SearchString = Request("SearchString")
        FreeText = Request("FreeText") 
        if Request("Action") = "查询" then
            NewQuery = TRUE
            RankBase=1000
        end if
end if 
    '上下一页
if Request.ServerVariables("REQUEST_METHOD") = "GET" then
            SearchString = Request("searchString")
            FreeText = Request("FreeText")
            FormformScopeope = Request("formScope")
            RankBase = Request("RankBase")
        if Request("page") <> "" then
            NextPageNumber = Request("page")
            NewQuery = FALSE
            UseSavedQuery = TRUE
        else
            NewQuery = SearchString <> ""
        end if
end if
%> 
</HEAD><BODY> 
<% 
  if NewQuery then
    set Session("Query") = nothing
    set Session("Recordset") = nothing
    NextRecordNumber = 1 
    '移除查询字串前後的" 
        SrchStrLen = len(SearchString) 
        if left(SearchString, 1) = chr(34) then
                SrchStrLen = SrchStrLen-1
                SearchString = right(SearchString, SrchStrLen)
        end if 
        if right(SearchString, 1) = chr(34) then
                SrchStrLen = SrchStrLen-1
                SearchString = left(SearchString, SrchStrLen)
        end if 
    if FreeText = "on" then
      SearchString = "$contents " & chr(34) & SearchString & chr(34)
    end if 
    set Q = Server.CreateObject("ixsso.Query")
    set util = Server.CreateObject("ixsso.Util") 
    Q.Query = SearchString
    Q.SortBy = "rank[d]"
    Q.Columns = "DocTitle, vpath, filename, size, write, characterization, rank"
    Q.MaxRecords = 200 
    set RS = Q.CreateRecordSet("nonsequential") 
    RS.PageSize = PageSize
    ActiveQuery = TRUE 
  elseif UseSavedQuery then 
    if IsObject( Session("Query") ) And IsObject( Session("RecordSet") ) then
      set Q = Session("Query")
      set RS = Session("RecordSet") 
      if RS.RecordCount <> -1 and NextPageNumber <> -1 then
        RS.AbsolutePage = NextPageNumber
        NextRecordNumber = RS.AbsolutePosition
      end if 
      ActiveQuery = TRUE
    else
      Response.Write "ERROR - No saved query"
    end if
  end if 
  if ActiveQuery then
    if not RS.EOF then
 %> 
<HR> 
<%
     LastRecordOnPage = NextRecordNumber + RS.PageSize - 1
     CurrentPage = RS.AbsolutePage
     if RS.RecordCount <> -1 AND RS.RecordCount < LastRecordOnPage then
           LastRecordOnPage = RS.RecordCount
     end if 
        if RS.RecordCount <> -1 then
            Response.Write "总计 " & RS.RecordCount & " 项" 
        end if 
        Response.Write " 符合查核字串 " & chr(34) & "<I>"
        Response.Write SearchString & "</I>" & chr(34) & ".<br>"
        Response.Write "第 " & NextRecordNumber & " 项到 " & LastRecordOnPage & " 项" 
 %> 
<% if Not RS.EOF and NextRecordNumber <= LastRecordOnPage then %>
<table border=0>
<% end if %> 
<% Do While Not RS.EOF and NextRecordNumber <= LastRecordOnPage %> <tr>
		<td valign=top align=right>
			<%= NextRecordNumber%>.
		</td>
		<td valign=top bgcolor="#DDFFFF"> 
	<%if VarType(RS("DocTitle")) = 1 or RS("DocTitle") = "" then%>
		<a href="<%=RS("vpath")%>"><%= Server.HTMLEncode( RS("filename") )%>
< /a> (<%= rs("rank") %>)
	<%else%>
		<a href="<%=RS("vpath")%>"><%= Server.HTMLEncode(RS("DocTitle"))%>
</a> (<%= rs("rank") %>)
	<%end if%>
	</td>
	</tr> 
	<tr><td></TD>
		<td valign=top align=left>
	<%if VarType(RS("characterization")) = 8 and RS("characterization") <> "
	" then%><Font color=blue>摘要:  </Font>
<%= Server.HTMLEncode(RS("characterization"))%> <%end if%>
			<br>
	<Font size=-1><i><a href="<%=RS("vpath")%>">
	http://<%=Request("server_name")%><%=RS("vpath")%></a>
       	<br><%if RS("size") = "" then%> (size and time unknown) 
<%else%>size <%=RS("size")%> bytes - <%=RS("write")%> GMT 
<%end if%></i></font> </td>
	</tr>
	<tr><TD> <br></TD>
	</tr> 
<%
          RS.MoveNext
          NextRecordNumber = NextRecordNumber+1
      Loop
 %> 
</table> 
<P><BR> 
<%
  else   
      if NextRecordNumber = 1 then
          Response.Write "找不到符合的项目<P>"
      else
          Response.Write "没有其他符合的项目<P>"
      end if 
  end if 
if Q.OutOfDate then %> <P><I><B>The index is out of date.</B></I><BR>
<%
end if 
if Q.QueryIncomplete then %>
<P><I><B>The query is too expensive to complete.</B></I><BR> 
<% 
end if 
if Q.QueryTimedOut then %> <P><I><B>The query took too long to complete.</B></I><BR>
<% end if %> 
<hr> 
第 <%=CurrentPage%> 页
<% if RS.PageCount <> -1 then
     Response.Write " 总计 " & RS.PageCount & "页"
  end if %> 
<TABLE> 
<%SaveQuery = FALSE%>
<%if CurrentPage > 1 and RS.RecordCount <> -1 then %> <td align=left>
    <form action="<%=QueryForm%>" method="get">
    <INPUT TYPE="HIDDEN" NAME="searchString" VALUE= "<%=SearchString%>">
    <INPUT TYPE="HIDDEN" NAME="FreeText" VALUE= "<%=FreeText%>">
    <INPUT TYPE="HIDDEN" NAME="formScope" VALUE="<%= FormformScopeope%>">
    <INPUT TYPE="HIDDEN" name="page" VALUE="<%= CurrentPage-1%>" >
	  <INPUT TYPE="HIDDEN" NAME = "RankBase" VALUE="<%= RankBase%>">
    <input type="submit" value="上一页 (前<%=RS.PageSize%>项)">
    </form>
    </td>
        <%SaveQuery = TRUE%> 
<%end if%> 
<% if Not RS.EOF then %> 
    <td align=right>
    <form action="<%=QueryForm%>" method="get">
    <INPUT TYPE="HIDDEN" NAME="searchString" VALUE="<%=SearchString%>">
    <INPUT TYPE="HIDDEN" NAME="FreeText" VALUE= "<%=FreeText%>">
    <INPUT TYPE="HIDDEN" NAME="formScope" VALUE= "<%=FormformScopeope%>">
    <INPUT TYPE="HIDDEN" NAME = "RankBase" VALUE= "<%=RankBase%>">
	 <INPUT TYPE="HIDDEN" name="page" VALUE= "<%=CurrentPage+1%>"> 
<% 
     if RS.RecordCount <> -1 then
         NextSet = (RS.RecordCount - NextRecordNumber) + 1
         if NextSet > RS.PageSize then
                 NextSet = RS.PageSize
         end if
         NextString = "下一页 (後" & NextSet & "项)"
     else
         NextString = "下一页"
     end if
%>
<input type="submit" value="<%=NextString%>">
</form>
</td>
<%SaveQuery = TRUE%>
<%end if%> 
</TABLE> 
<%
    if SaveQuery then 
        set Session("Query") = Q
        set Session("RecordSet") = RS
else 
        RS.close
        Set RS = Nothing
        Set Q = Nothing
        set Session("Query") = Nothing
        set Session("RecordSet") = Nothing
    end if
%>
<hr>
<% end if %> 
<FORM ACTION="<%=QueryForm%>" METHOD=POST>
<TABLE>
<TR><TD>查询字串:</TD></TR>
<TR>
<TD><INPUT TYPE="TEXT" NAME="SearchString" SIZE="30" MAXLENGTH="100"
VALUE="<%=SearchString%>"></TD> <TD><INPUT TYPE="SUBMIT" NAME="Action"
VALUE="查询"></TD>
</TR><TR>
</TR>
<TR>
<TD><INPUT NAME="FreeText" TYPE=CHECKBOX
<% if FreeText = "on" then 
Response.Write(" CHECKED") end if %> 
使用句子 (Free-Text) 查询</a></TD></TR>
</TABLE>
</FORM>

於用户端的浏览器的表单(form)输入搜寻字串资料,按下「搜寻」或「上下一页」的Submit按钮後,经过Internet、Intranet传送HTTP讯息到网站伺服器,请求於网站伺服器执行一个表单所设定的相同应用程式query2.asp。

伺服器由Request.ServerVariables("REQUEST_METHOD") 得到表单传送方式,由POST、GET区分为搜寻、上下一页的表单。由「Request.("表单栏位")」得知表单的各输入值。

定义搜寻物件後,由物件的Query、SortBy、Columns、MaxRecords属性(properties)来设定搜寻字串、排列顺序、搜寻的栏位、最多搜寻笔数。最後下个执行搜寻的方法CreateRecordSet,即可开始搜寻,并将搜寻结果储存於ADO recordset当中。

搜寻结果,可以由ADO recordset的RS.RecordCount(搜寻相符的笔数)、RS("rank")(搜寻相符率)、RS("DocTitle")(标题)、RS("vpath")(URL位址)、RS("characterization") (摘要)、RS("size") (档案大小)、RS("filename")(档案名称)、RS("write")(档案写入日期时间)显示出来。

Query物件
 

Indexing Service(索引服务)提供两个搜寻物件(object),包括Query物件和Utility物件。

Query物件(object),提供搜寻的参数设定和执行,包括方法(methods)和属性(properties)。

Query物件的属性
 

Query物件的属性(properties)如下:

  •  AllowEnumeration = TRUE | FALSE: TRUE表示使用enumeration(列举细目)方法来解析查核的结果,FALSE(预设值)则仅使用index(索引)方法,譬如Q.AllowEnumeration = TRUE。
     
  •  Catalog: local电脑的目录名称(catalog name),譬如Q.Catalog = "kb"。
     
  •  Columns = [Fname1 [ , fname2 ] . . . ]: 搜寻的栏位,譬如Q.Columns = "DocAuthor, vpath, doctitle"。
     
  •  LocaleID: 搜寻所使用的语言,为Win32 LocaleID (LCID),譬如Q.LocaleID = 1033表示EN-US locale code。
     
  •  MaxRecords: 搜寻的最大记录笔数,譬如Q.MaxRecords = 200表示搜寻200笔。
     
  •  OptimizeFor = [performance] | [recall]: 最佳化搜寻考虑的是性能( performance )或做细部搜寻( recal ,预设值)的最大记录笔数,譬如Q.OptimizeFor = "performance"。
     
  •  Query = 搜寻字串:搜寻字串,譬如Q.Query = "iis"。
     
  •  SortBy = 栏位1 [ a|d ] [ , 栏位2 [ a|d ] ] . . .: 排列顺序为向上( [a] ,预设值)或向下( [d] ),譬如Q.SortBy = "DocAuthor, rank[d]"。
     

Query物件的方法
 

Query物件的方法(methods)如下:

  •  RecordSet= CreateRecordSet( CursorType ): 执行搜寻和产生储存搜寻结果的ADO recordset 。CursorType为设定recordset为sequential(连续)或nonsequential(不连续)。呼叫此方法前须先设定Query和Columns属性。譬如set recordset = Q.CreateREcordSet("sequential")。
     
  •  DefineColumn strColumnDef: 定义一个新栏位的名称。譬如Q.DefineColumn "DocAuthor(DBTYPE_WSTR|DBTYPE_BYREF) = F29F85E0-4FF9-1068-AB91-08002B27B3D9 4"。
     
  •  strQueryString = QueryToURL(): 产生反映Query物件status的URL形态的搜寻字串。譬如Href = "http://server/sample.asp?" & Q.QuerytoURL()。
     
  •  Reset: 重置并清除Query物件的status。譬如Q.Reset。
     
  •  SetQueryFromURL ( strQueryString ): 设定URL形态的搜寻字串。譬如Q.SetQueryFromURL ("qu=%40size+%3E+10000&so= rank%5bd% 5d&mh=200")。
     
  •  SetQueryFromURL ( strQueryString ): 设定URL形态的搜寻字串。譬如Q.SetQueryFromURL ("qu=%40size+%3E+10000&so= rank%5bd% 5d&mh=200")。
     

Utility物件
 

Utility物件(object),为一个伺服器端的ActiveX控制元件,提供几个方法(methods)如下:

  •  AddScopeToQuery QueryObj, Path[ , Depth ]: 加入范围的限制,Path设定搜寻的虚拟或物理路径,QueryObj为Query物件,Depth设定包括子路径,譬如util.AddScopeToQuery Q, "/kb", "deep"。
     
  •  varResult = GetArrayElement( varArray, iElem ): 取得阵列的元件值,varArray为阵列,IElem 为阵列元件,譬如Request.Write (Util.GetArrayElement( RS("vector-col"), i ) )。
     
  •  LocaleID = ISOToLocaleID( strLanguage ): 转换ISO语言为LocaleID,LocaleID为Win 32 LCID,strLanguage为ISO语言,譬如Lcid = Util.ISOToLocaleID (Request.QueryString("HTTP_ACCEPT _LANGUAGE") )。
     
  •  strLanguage =LocaleIDToISO( LocaleID ): 转换LocaleID为ISO语言,LocaleID为Win 32 LCID,strLanguage为ISO语言,譬如Response.Write "Language is " & Util.LocaleIDToISO(iLocale)。
     
  •  NewStringTruncateToWhitespace( String, Length ): 显示搜寻结果为缩写方式,String为字串,Length为字串最大长度,譬如Response.Write util.TruncateToWhitespace(RS("Characterization"), 200)。
     

您学会了吗 ?