5. Web实用技巧
介绍Web实用技巧,包括提高IIS执行效率、善用IIS 5.0 ASP新功能、制作Web图表、与资料库连结传送E-Mail、全文检索搜寻网页等实用技巧。
Web实用技巧
本章介绍Web实用的技巧,如下:
5-1 如何提高IIS执行效率呢?
提高IIS执行效率
如何提高IIS执行效率呢 ?
提高IIS执行效率的方法如下:
简单介绍如下。
启用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)须不断地产生与摧毁,而造成执行效率不佳。
一般而言,执行效率比较如下:
换句话说,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所提供的新功能,您要如何善用呢 ?
本节依照本书所介绍,归纳如下:
简单介绍如下。
判断是否使用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物件)。包括:
说明
有关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图表之类型如下:
堆叠直条图显示了单项与整体之间的关联。如下图:
堆叠横条图显示了各单项与整体之间的关联。如下图:
可以建立具有多个数列的堆叠圆形图。如下图:
如何制作Web图表呢?
如何制作以上各种Web图表呢 ?
Web图表与资料相结合的方式如下:
分别说明如下:
於阵列设定资料
於阵列中设定资料建立图形的方法为,首先将阵列设定为类别资料和值资料,然後透过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当中读到,如下:
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)如下:
Query物件的方法
Query物件的方法(methods)如下:
Utility物件
Utility物件(object),为一个伺服器端的ActiveX控制元件,提供几个方法(methods)如下:
您学会了吗 ?