附录C 快速学会ASP元件

本章重点
 

本章介绍ActiveX伺服器元件的技巧,包括读写伺服器档案、Page Counter访客计数器、Content Rotator内容轮播器、Ad Rotator广告轮播器、取得浏览器资讯、Content Linking管理URL、Permission Checker允许检查、自制ActiveX伺服器元件等。

ActiveX Server Components
 

使用Active Server Pages的「ActiveX伺服器元件」(ActiveX Server Components),可让您重复使用设计好的功能(像副程式般可以一再地重复呼叫使用),制作出动态、互动的网页内容。

「ActiveX Server Components」,以前叫做「Automation servers」,让您将网站伺服器成为网页应用程式的一部份。ASP内建的「ActiveX伺服器元件」提供了存取资料库、读写伺服器档案、轮流显示广告图片、得知用户端浏览器的资讯、和管理超连结表等精彩的功能。

Active Server Pages可经由「ActiveX伺服器元件」来扩充增加功能,可使用Visual Basic、Java、Visual C++、COBOL等程式语言来发展。

「ActiveX伺服器元件」一般由.asp档案的ASP程式码所呼叫使用,但是也可以由ISAPI应用程式、其他伺服器元件、或其他OLE相容的语言所呼叫。

Active Server Pages内含数个内建的「ActiveX伺服器元件」,如下:

  1.  File Access component(档案存取元件): 经由FileSystemObject物件、和TextStream物件,提供读写伺服器档案的功能,常见的访客计数器、和每次载入网页时都给一个不同的提示或座右铭等应用,皆可经由此ActiveX伺服器元件设计出。
  2.  Ad Rotator component(广告轮播器元件): 提供广告轮播器的功能,让广告图片轮流显示於网页上,您可设定各广告出现的机率。
  3.  Content Rotator Component(内容轮播器元件): 让HTML内容轮流显示於网页上,您可设定各内容出现的机率。
  4.  Content Linking component(内容连结元件): 让您很方便地使用一个文字档,来管理超连结、上一页、下一页等连结功能。几行的ASP程式码,加上准备一个URL表的文字档,网页内容将自动更新,不须修改网页的程式码。
  5.  Page Counter Component(访客计数器元件): 记录访客的次数,每次有访客浏览此网页,自动将访客计数器加一。
  6.  Counters Component(计数器元件): 产生、储存、新增、读取多个个别的计数器。
  7.  Browser Capabilities component(浏览器资讯元件): 提供用户端使用浏览器的功能资讯给网站伺服器。
  8.  Permission Checker Component(允许检查元件): 让设计者检查使用者是否有权存取某个档案,以便决定显示不同的网页内容给不同的使用者。
  9.  Database Access component(资料库存取元件): 使用ActiveX Data Object(简称ADO)的技术,让您可以与Active Server Pages结合,以提供存取伺服器资料库的功能。
  10.  Tools(工具元件): 提供判断档案是否存在、取得-32768 ~ 32767乱数等功能。
  11.  Logging Utility: 提供读取IIS Log档案内容的功能,IIS Log档案位於c:\WinNT\System32\LogFiles\W3SVC1\exYYMMDD.log。

IIS 5.0比IIS 4.0新增加Counters、Tools、Logging Utility叁个可安装的元件。

除了这些「内建」的「ActiveX伺服器元件」,您可以制作自己的「ActiveX伺服器元件」,来符合自己特殊的需求,以增加扩充Active Server Pages的功能,您可使用Visual Basic、Java、Visual C++、COBOL等程式语言来发展。或购买别人已经开发好的「ActiveX伺服器元件」来使用。建议您使用浏览器连线到 http://www.microsoft.com/iis 以下载新的components。

定义一个ActiveX伺服器元件
 

要使用「ActiveX伺服器元件」(ActiveX Server Components)须先定义。定义一个ActiveX伺服器元件,以产生ActiveX伺服器元件的instance,定义後即可呼叫此ActiveX伺服器元件的方法(methods)、或存取其属性(properties)。

定义一个「ActiveX伺服器元件」有两个方法:

  1. 使用「CreateObject」的方法定义一个ActiveX伺服器元件。譬如以下定义一个Browser Capabilities component:
     
    <% Set bc = Server.CreateObject("MSWC.BrowserType")%>
  2. 使用<OBJECT> 标记定义一个ActiveX伺服器元件。譬如以下定义一个Ad Rotator Component:
     
    <OBJECT RUNAT=Server ID=MyAd ROGID="MSWC.AdRotator">
    </OBJECT>

一般而言,您可以於Global.asa使用<OBJECT> 标记,定义使用於一个session、或application的ActiveX伺服器元件。

C-1 如何存取IIS伺服器的档案呢?
 

使用ASP内建的一个ActiveX伺服器元件,称为File Access component(档案存取元件),可以存取IIS伺服器的档案。

写入资料到一个伺服器的档案的方法,如下:

Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
TestFile = Server.MapPath("写入的档案名称")
Set OutStream= FileObject.CreateTextFile(TestFile, True, False)
OutStream.WriteLine "写入的资料"

其中「OutStream.WriteLine」为写入一行的资料。

从一个伺服器的档案读取资料的方法,如下:

Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
TestFile = Server.MapPath("读取的档案名称")
Set InStream= FileObject.OpenTextFile(TestFile, 1, False, False)
"读取的资料" = Instream.Readline 
InStream.SkipLine()

其中「Instream.Readline」为读取一行的资料。「InStream.SkipLine( )」为跳下一行。

读写伺服器档案范例
 

看个例子就知道如何使用了!

於用户端使用浏览器,浏览aspfile.asp执行的结果如下,显示读写伺服器档案的结果:


 

ASP程式码,如下:

<%
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
TestFile = Server.MapPath("asptest.txt") 
Set OutStream= FileObject.CreateTextFile(TestFile, True, False)
OutputString = "读写测试..." & Now() 
OutStream.WriteLine OutputString
Response.Write "於档案: " & TestFile & "<br> 写入:
 " & OutputString & "<P>" 
OutStream.Close 
Response.Write "於档案: " & TestFile & "<BR> 读取: " 
Set InStream= FileObject.OpenTextFile(TestFile, 1, False, False)
While not InStream.AtEndOfStream
Response.Write Instream.Readline & "<BR>"
Wend 
Instream.Close
%>

另一个读写伺服器档案范例
 

写入资料时所使用的「Set OutStream= FileObject.CreateTextFile(TestFile, True, False)」也可以改为「Set OutStream= FileObject.CreateTextFile(TestFile, 2)」;读取资料时所使用的「Set InStream= FileObject.OpenTextFile(TestFile, 1, False, False)」也可以改为「Set InStream= FileObject.OpenTextFile(TestFile, 1)」,如下:

ASP程式码aspfile.asp,如下:

<%
Set Object1 = Server.CreateObject("Scripting.FileSystemObject")
file1 = Server.MapPath("test1.txt")
Set out1 = Object1.CreateTextFile(file1, 2)'write
                
For x = 1 to 3
	out1.WriteLine "第 " & x & " 行写入 " & now & "<br>"
Next
out1.Close 
Set in1 = Object1.OpenTextFile(file1, 1)'read
Response.Write in1.ReadAll
in1.Close
%>

其中「ReadAll」为读取所有行的资料。

於用户端使用浏览器,浏览aspfile.asp执行的结果如下,显示读写伺服器档案的结果:


 

好玩吗 ?

访客计数器范例
 

常见的访客计数器,记录访客的次数,每次有访客浏览此网页,自动将访客计数器加一并显示出来,就可以使用读写伺服器档案的方式来产生。

於用户端使用浏览器,浏览aspfile.asp执行的结果如下,显示访客计数器的次数:


 

ASP程式码,每次载入会读写伺服器档案aspcount.txt,此档案只储存一个数字而已,每次将加一再储存回去,如下:

<% 
CountFile = Server.MapPath("aspcount.txt")
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
Set Out= FileObject.OpenTextFile(CountFile, 1, FALSE, FALSE)
counter = Out.ReadLine
Out.Close 
SET FileObject = Server.CreateObject("Scripting.FileSystemObject")
Set Out= FileObject.CreateTextFile(CountFile, TRUE, FALSE)
Application.lock
counter= counter + 1
Out.WriteLine(counter)
Application.unlock
Out.Close
%> 
<%=UserName%> 您是第 <%=FormatNumber(counter,0)%> 位访客.
<A href = "aspfile.asp">再度光临</A>

其中使用「Application.lock」暂时禁止别人使用,以写入访客计数器档案aspcount.txt,写完再使用「Application.unlock」解除之。

座右铭范例
 

可不可以做到每次载入网页时,都给一个不同的资讯呢 ? 譬如,给一个不同提示、座右铭。

於用户端使用浏览器,浏览aspfile.asp执行的结果如下,每次载入网页时,都得到一个不同的座右铭:


 

ASP程式码,使用「Int(10 * Rnd)」产生一个随机0-9的乱数,由asptips.txt档案读取那一行的座右铭,如下:

<%
  Randomize
  tipsNo = Int(10 * Rnd)
  Response.Write "座右铭编号: " & tipsNo & "<P>" 
  tipsfile = Server.MapPath("asptips.txt")
  Set InStream = FileObject.OpenTextFile(tipsfile, 1, False, False)
  While tipsNo > 0
	InStream.SkipLine()
	tipsNo = tipsNo-1
  Wend 
  TipOfTheDay = Instream.ReadLine 
  Response.Write  "今天的座右铭: <FONT COLOR=BLUE><BR><B>
  " & TipOfTheDay & "</B></FONT>"
  InStream.Close
%>

座右铭asptips.txt档案的内容如下:

日行一善
诚恳待人
让生命热烈灿烂地开放
勿做政客
...
利害当前 方现真正人性

您的座右铭是什麽呢 ?

FileSystemObject物件
 

读写伺服器档案所用到的FileSystemObject物件、和TextStream物件,是否想知道得更详细一些呢 ?

FileSystemObject物件存取电脑的档案,语法如下:

Scripting.FileSystemObject

FileSystemObject物件提供数个方法(methods):

  •  BuildPath方法: 建立子路径,语法如下,其中path为现存路径,name为於此现存路径下所建的子路径:

     
    object.BuildPath(path, name)
  •  CopyFile方法: 复制档案,语法如下,其中source为待复制的档案,destination为新复制档案,overwrite表示是(True,预设值)否(False)覆盖相同档名的档案:

     
    object.CopyFile source, destination[, overwrite]

    譬如:


     

    FileSystemObject.CopyFile "c:\temp\*.doc", c:\test\"
  •  CopyFolder方法: 复制整个路径的档案,语法如下,其中source为待复制的路径档案,destination为新复制路径档案,overwrite表示是(True,预设值)否(False)覆盖相同档名的档案:

     
    object.CopyFolder source, destination[, overwrite]

    譬如:


     

    FileSystemObject.CopyFolder "c:\temp\*", "c:\test\"
  •  CreateFolder方法: 建立子路径,语法如下,其中foldername用於所建的子路径:

     
    object.CreateFolder(foldername)
  •  CreateTextFile方法: 产生文字(text)档。详见下述。
     
  •  DeleteFile方法: 删除档案,语法如下,其中filespec为待删除的路径档案, force表示是(True)否(False,预设值)删除唯读的档案:

     
    object.DeleteFile filespec[, force]
  •  DeleteFolder方法: 删除子路径,语法如下,其中folderspec为待删除的子路径,force表示是(True)否(False,预设值)删除唯读的子路径:

     
    object.DeleteFolder folderspec[, force]
  •  DriveExists方法: 检查磁碟机是(True)否(False)存在,语法如下,其中drivespec为磁碟机代号:

     
    object.DriveExists(drivespec)
  •  FileExists方法: 检查档案是(True)否(False)存在,语法如下,其中filespec为档案名称:

     
    object.FileExists(filespec)
  •  FolderExists方法: 检查子路径是(True)否(False)存在,语法如下,其中folderspec为子路径名称:

     
    object.FolderExists(folderspec)
  •  GetAbsolutePathName方法: 取得完整的绝对路径,语法如下,其中pathspec为路径名称:

     
    object.GetAbsolutePathName(pathspec)
  •  GetBaseName方法: 取得档案名称,语法如下,其中path为路径名称:

     
    object.GetBaseName(path)
  •  GetDrive方法: 取得磁碟机代号,语法如下,其中drivespec为网路磁碟机代号:

     
    object.GetDrive drivespec
  •  GetDriveName方法: 取得路径的磁碟机代号,语法如下,其中path为路径名称:

     
    object.GetDriveName(path)
  •  GetExtensionName方法: 取得路径的Extension,语法如下,其中path为路径名称:

     
    object.GetExtensionName(path)
  •  GetFile方法: 取得路径的档案名称,语法如下,其中filespec为路径档案名称:

     
    object.GetFile(filespec)
  •  GetFileName方法: 取得档案名称,语法如下,其中pathspec为路径档案名称:

     
    object.GetFileName(pathspec)
  •  GetFolder方法: 取得路径的名称,语法如下,其中folderspec为绝对或相对路径名称:

     
    object.GetFolder(folderspec)
  •  GetParentFolderName方法: 取得父路径的名称,语法如下,其中path为路径名称:

     
    object.GetParentFolderName(path)
  •  GetSpecialFolder方法: 取得特殊子路径名称,语法如下,其中folderspec为特殊子路径:

     
    object.GetSpecialFolder(folderspec)
  •  GetTempName方法: 取得暂时随机产生的档案或路径:

     
    object.GetTempName
  •  MoveFile方法: 移动档案,语法如下,其中source为档案的原本位置,destination为档案新的位置:

     
    object.MoveFile source, destination
  •  MoveFolder方法: 移动整个子路径,语法如下,其中source为子路径的原本位置,destination为子路径新的位置:

     
    object.MoveFolder source, destination
  •  OpenTextFile方法: 开启文字档。详见下述。
     

检查档案是否存在
 

以下举一个使用FileExists方法检查档案是否存在的例子。

於用户端使用浏览器,浏览执行aspfile.asp的结果如下,检查default.htm档案是否存在:


 

ASP程式码,使用FileExists方法检查default.htm档案是否存在,如下:

<%
On Error Resume Next
Set oFS = Server.CreateObject("Scripting.FileSystemObject")
FileExist1 = oFS.FileExists(Server.MapPath("default.htm"))
		If Err = 0 And FileExist1 Then	 
			chkresult2 = "存在"
		Else
			chkresult2 = "不存在"
		End If
%>
<% = chkresult2 %>

CreateTextFile方法
 

CreateTextFile方法产生文字(text)档,并传回一个TextStream物件,以读写所产生的文字档。

语法如下,其中中括弧[...]部份为选项,可有可无:

[object.]CreateTextFile(filename[, overwrite[, unicode]])
  •  object: FileSystemObject的名称。
     
  •  filename: 产生的文字(text)档案名称。
     
  •  overwrite: 是(True)否(False)可以覆盖原来的档案,若未设定表示不可覆盖。若档案已存在而overwrite设定为不可覆盖时,将发生错误。
     
  •  unicode: 档案是Unicode型态(True)或为ASCII型态(False),若未设定表示为ASCII型态。
     

以下的例子显示如何写入一个文字档的资料:

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\test.txt", True)
a.WriteLine("快速掌握Internet技术.")
a.Close

第一行使用CreateObject函数传回FileSystemObject(fs),第二行CreateTextFile方法产生一个文字档(c:\test.txt),第叁行WriteLine方法於所产生的文字档写入一行的资料(快速掌握Internet技术),第四行Close方法清除缓冲器资料、并关闭此文字档。

OpenTextFile方法
 

OpenTextFile方法开启文字档,并传回一个TextStream物件,以读取、或附加写入(append)所产生的文字档。

语法如下,其中中括弧[...]部份为选项,可有可无:

[object.]OpenTextFile(filename[, iomode[, create[, format]]])
  •  object: FileSystemObject的名称。
     
  •  filename: 开启的文字(text)档案名称。
     
  •  iomode: 开启的档案是要待读取(设定为ForReading)、或待附加写入append(ForAppending)。
     
  •  create: 若开启的档案不存在,是(设定为True)否(False)产生一个新的档案。若未设定表示False。
     
  •  format: 开启档案的型态为Unicode(设定为TristateTrue)、ASCII型态(TristateFalse)、或系统预设(TristateUseDefault)型态,若未设定表示为ASCII型态。
     

以下的例子显示如何开启一个文字档,并附加写入资料:

Dim fs, a
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile("c:\test.txt", ForAppending, FALSE)
...
a.Close

有意思吗 ?

TextStream物件
 

TextStream物件循序存取(sequential access)电脑的档案,语法如下:

TextStream变数.{property | method}
  •  TextStream变数: 由FileSystemObject物件取得。
     

TextStream物件方法(methods)
 

TextStream物件的方法(methods)有几个:

  •  Close方法: object.Close清除缓冲器资料、并关闭此文字档。
     
  •  Read方法: object.Read(n)读入n个字元。
     
  •  ReadAll方法: object.ReadAll读入文字档所有的资料。
     
  •  ReadLine方法: object.ReadLine於文字档读入一整行的资料,不含跳下一行字元。
     
  •  Skip方法: object.Skip(n)跳过n个字元。
     
  •  SkipLine方法: object.SkipLine跳下一行。
     
  •  Write方法: object.Write(string)写入string的资料。
     
  •  WriteLine方法: object.WriteLine([string])於所产生的文字档写入一行的string资料,string若未设定表示写入跳下一行於字元。
     
  •  WriteBlankLines方法: object.WriteBlankLines(n)写入n行的空白资料。
     

TextStream物件属性(properties)
 

TextStream物件的属性(properties)有几个:

  •  AtEndOfLine属性: object.AtEndOfLine得知是(True)否(False)已指到TextStream档案的底部。仅用於已开启待读取(设定为ForReading)的TextStream档案。譬如:

     
    Dim fs, a, retstring
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.OpenTextFile("c:\testfile.txt", ForReading, False)
    Do While a.AtEndOfLine <> True
    retstring = a.Read(1) 
    ...
    Loop
    a.Close
  •  AtEndOfStream属性: object.AtEndOfStream得知是(True)否(False)已指到TextStream档案的底部。仅用於已开启待读取(设定为ForReading)的TextStream档案。譬如:

     
    im fs, a, retstring
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.OpenTextFile("c:\testfile.txt", ForReading, False)
    Do While a.AtEndOfStream <> True
    retstring = a.ReadLine
    ...
    Loop
    a.Close
  •  Column属性: object.Column得知现在位置为一行的第几个字,由1算起。
     
  •  Line属性: object.Line得知现在位置为第几行,由1算起。
     

以下的例子显示如何写入一个文字档的资料:

Set fs = CreateObject("Scripting.FileSystemObject")
Set abc = fs.CreateTextFile("c:\test.txt", True)
abc.WriteLine("快速掌握Internet技术.")
abc.Close

第一行使用CreateObject函数传回FileSystemObject(fs),第二行CreateTextFile方法产生一个文字档(c:\test.txt),abc即为TextStream变数,第叁行使用这个TextStream变数(abc)的WriteLine方法於所产生的文字档写入一行的资料(快速掌握Internet技术),第四行Close方法关闭此文字档。

C-2 如何用Ad Rotator轮播广告呢?
 

Ad Rotator Component的应用
 

ASP内建的一个ActiveX Server component,叫做Ad Rotator Component(广告轮播器元件),让广告图片轮流显示於网页上,您可设定各广告出现的机率。

看个例子就知道「广告轮播器」是什麽东西了!

於用户端使用浏览器,浏览aspadrot.asp执行的结果如下,每次载入此网页时,可能看到不同的广告图片:


 

「广告轮播器」的应用设计,十分简易,只要两行ASP程式码如下:

<% Set Ad = Server.CreateObject("MSWC.Adrotator")%>
<%= Ad.GetAdvertisement("aspadv.txt")%>

广告图片须准备一个 「Rotator Schedule File」(轮播行程档案)的文字档,譬如以上所设定的aspadv.txt,内容如下:

redirect aspdir.asp
width 300
height 40
border 1
* 
1.gif
activex.htm
ActiveX应用技术大公开
20 
2.gif
idesign.htm
Internet程式设计宝典
20 
3.gif
html.htm
动态网页设计99招
30

您可看到所设定轮流显示的叁个图片档名(1.gif、2.gif、3.gif),和所设定各广告出现的机率(20、20、30),「activex.htm」等档为当此广告图片被按到时所连结的HTML档案,「ActiveX应用技术大公开」等文字为图片未显示前的替代显示文字。

其中所用到的「Redirection File」档案aspdir.asp,内容如下:

<%  Response.Redirect(Request.QueryString("url"))%>

另一个「广告轮播器」范例
 

再看看另一个例子就知道「广告轮播器」如何设计了!

於用户端使用浏览器,浏览aspadrot.asp执行的结果如下,每次载入此网页或按下 再度光临 时,可能看到不同的广告图片:


 

aspadrot.asp的ASP程式码也十分简易,如下:

<% Set ad1 = Server.CreateObject("MSWC.AdRotator")%>
<%= ad1.GetAdvertisement("aspadv2.txt")%>
<A href = "aspadrot.asp">再度光临</A>

广告图片须准备一个 「Rotator Schedule File」的文字档,譬如以上所设定的aspadv2.txt,内容如下:

redirect aspdir.asp
width 106
height 135
border 1
*
book8.gif
Booklst8.htm

Internet Explorer4推播频道设计班
 

20
book7.gif
Booklst7.htm

Internet Explorer4动态HTML设计班
 

20
book4.gif
Booklst4.htm
NT动态网站速成班
10
...

您可看到所设定轮流显示的八个图片档名(book1.gif~book8.gif),和所设定各广告出现的机率(20、20、10、...),「Booklst8.htm」等档为当此广告图片被按到时所连结的HTML档案,「Internet Explorer4推播频道设计班」等文字为图片未显示前的替代显示文字。

其中所用到的「Redirection File」档案aspdir.asp,内容如下:

<%  Response.Redirect(Request.QueryString("url"))%>

是否想知道Ad Rotator Component更详细一些的资料呢 ?

Ad Rotator Component语法
 

Ad Rotator component(广告轮播器元件)将广告图片自动轮流显示於网页上,每次载入此网页时,可能看到不同的广告图片。

显示的广告图片於一个「Rotator Schedule File」(轮播行程档案)档案设定。您可设定此档案的REDIRECT参数,当此广告图片被按到时,连结到广告客户的网页,此将被记录於Web server activity logs。

所用到的档案,如下:

  •  Adrot.dll: Ad Rotator component的DLL档案。
     
  •  Rotator Schedule File(轮播行程档案): 设定广告图片和轮流显示机率。
     
  •  Redirection File: 设定广告图片被按到时的连结redirection,并将启动各个广告图片被按到次数的记录。
     

    语法,如下:


     

    Set AdRotator = Server.CreateObject("MSWC.AdRotator")
  •  AdRotator: 设定呼叫Server.CreateObject产生的物件名称。
     

Ad Rotator属性(properties)
 

Ad Rotator属性(properties)如下:

  •  Border: Border(n)设定广告图片的四周边框宽度为n(pixels),边界宽度预设值於「Rotator Schedule File」的「border n」中加予设定。譬如以下设定无图片边框:

     
    <%  
    Set ad = Server.CreateObject("MSWC.AdRotator")
    ad.BorderSize(0)
    %>
    <%= ad.GetAdvertisement("/ads/adrot.txt")%>
  •  Clickable: Clickable(value)设定是(value设定为True时)否(False)当广告图片被按到时,连结到别的网页。预设值为TRUE。譬如以下设定无连结:

     
    <%  
    Set ad = Server.CreateObject("MSWC.AdRotator")
    ad.Clickable(FALSE)
    %>
    <%= ad.GetAdvertisement("/ads/adrot.txt")%>
  •  TargetFrame: TargetFrame(frame)设定广告图片显示的视窗frame名称或_TOP, _NEW, _CHILD, _SELF, _PARENT, _BLANK。预设值为NO FRAME。譬如以下设定广告图片显示的视窗frame名称为Frame100:

     
    <%  
    Set ad = Server.CreateObject("MSWC.AdRotator")
    ad.TargetFrame(Frame100)
     %> 
    <%= ad.GetAdvertisement("/ads/adrot.txt")%>

Ad Rotator方法(methods)
 

Ad Rotator方法(methods)如下:

  •  GetAdvertisement: GetAdvertisement("SchedulePath ")得知下一个预定显示的广告图片,传回值为显示下一个广告图片的HTML。其中SchedulePath设定Rotator Schedule File相对於virtual directory的path。譬如若Rotator Schedule File的physical path是C:\Inetpub\Wwwroot\Ads\Adrot.txt,其中Wwwroot是"/"virtual directory,则您应设定SchedulePath为\Ads\Adrot.txt。譬如以下得知virtual directory为/ads/的adrot.txt下一个预定显示的广告图片:

     
    <% Set NextAd = Server.CreateObject("MSWC.AdRotator")%>
    <%= NextAd.GetAdvertisement("/ads/adrot.txt")%>

Rotator Schedule File
 

Rotator Schedule File(轮播行程档案)设定广告图片、大小、和轮流显示机率等Ad Rotator component用到的资讯。

语法如下,其中中括弧[ ]部份为选项,可有可无:

[REDIRECT URL] 
[WIDTH numWidth] 
[HEIGHT numHeight] 
[BORDER numBorder] 
* 
adURL 
adHomePageURL 
Text 
impressions
  •  URL: 设定dynamic-link library(.dll)的path或设定redirection资讯之.asp档案。可设定为全路径(譬如http://www.abc.com /MyDir/redirect)、或virtual directory之相对path(譬如/MyDir/redirect)。
     
  •  numWidth: 设定显示的广告图片宽度(pixels)。预设值为440(pixels)。
     
  •  numHeight: 设定显示的广告图片高度(pixels)。预设值为60(pixels)。
     
  •  numBorder: 设定广告图片的四周边框的宽度(pixels)。预设值为1(pixel)。
     
  •  adURL: 设定各个广告图片的URL位址。
     
  •  adHomePageURL: 设定各个广告客户的网页URL位址。当各个广告图片被按到时,连结到各个广告客户的网页。「-」表示无连结位址。
     
  •  Text: 设定各个广告图片未显示前的替代显示文字。若浏览器关闭图片显示功能或不能显示图片时,将显示此替代显示文字。
     
  •  impressions: 设定轮流显示相对机率,值为0~4,294,967,295。譬如叁个广告图片将impressions设为20、30、50,则各个广告图片轮流显示的机率为20%、30%、50%。
     

Rotator Schedule File的例子,譬如:

REDIRECT /scripts/adredir.asp 
WIDTH 440 
HEIGHT 60 
BORDER 1 
*
http://ads/a.gif 
http://www.abc.com/
WWW技术与设计
20 
http://ads/d.gif 
-
MAPI技术与设计
20 
http://ads/c.gif 
http://www.who.com/
USENET技术与设计
10

Redirection File
 

Redirection File设定广告图片被按到时的连结redirection,并将启动各个广告图片被按到次数的记录。一般设定为如下的内容,当各个广告图片被按到时,连结到於Rotator Schedule File设定之各个广告客户的网页:

<% Response.Redirect(Request.QueryString("url"))%>

您可在此档案加入script程式码以计算各个广告图片被按到的次数,并记录到伺服器的档案。

有趣吗 ?

C-3 如何用Content Rotator轮播内容?
 

Content Rotator Component的应用
 

ASP内建的一个ActiveX Server component,叫做Content Rotator Component(内容轮播器元件),让HTML内容轮流显示於网页上,您可设定各内容出现的机率。

「内容轮播器」范例
 

看个例子就知道「内容轮播器」是什麽东西了!

於用户端使用浏览器,浏览aspcont.asp执行的结果如下,每次载入此网页时,可能看到不同的内容:


 

「内容轮播器」的应用设计,也十分简易,只要两行ASP程式码如下:

Set cont1 = Server.CreateObject("MSWC.ContentRotator")
Response.Write("促销活动:<br>" & cont1.ChooseContent("aspcont1.txt"))

轮播的内容请准备一个叫做「Content Schedule File」(轮播行程档案)的文字档,譬如以上设定的aspcont1.txt,内容如下:

%% #1
<Font color=blue size=+2>跳楼大拍卖</Font><BR>
列表机NT$2,999 ! 
%% #2 
<IMG SRC="book8.gif"><br> 新书介绍: <A href = "Booklst8.htm">
Internet Explorer4推播频道设计班</A> 
%% #2 
<IMG SRC="book5.gif"><br> 畅销书: <A href = "Booklst5.htm">
NT网站资料库速成班 设计实例篇班</A> 
%% #1 
钢琴买一送一!

您可看到所设定轮流显示的四个轮播的内容(位於%%下的HTML码),和所设定各内容出现的机率为1、2、2、1(位於#後的数字)。

另一个「内容轮播器」范例
 

再看看另一个例子就可更清楚了!

於用户端使用浏览器,浏览aspcont.asp执行的结果如下,每次载入此网页时,可能看到不同的内容:


 

「内容轮播器」的ASP程式码如下:

<%
Set cont1 =Server.CreateObject("IISSample.ContentRotator")%>
技术支援: <% = cont1.ChooseContent("aspcont2.txt")%>

轮播的内容的aspcont2.txt,内容如下:

%% #1
<a href="mailto:chen@abc.com">陈明</a> %% #2
<a href="mailto:jack@abc.com">王子馨</a> %% #1
<a href="mailto:gary@abc.com">姜子牙</a> %% 
抱歉 公司旅游中

您可看到所设定轮流显示的四个轮播的内容(位於%%下的HTML码),和所设定各内容出现的机率为1、2、1、1(位於#後的数字),未设定则表示为1。

Content Rotator语法
 

Content Rotator的语法,首先定义如下:

Set cont1 = Server.CreateObject("IISSample.ContentRotator")
  •  cont1: 设定呼叫Server.CreateObject产生的物件名称。
     

轮流显示的HTML码於一个「Content Schedule File」(轮播行程档案)的行程档案当中设定,设定如下:

cont1.ChooseContent("行程档案名称")

其中ChooseContent为Content Rotator的方法(methods)之一。

Content Rotator提供的方法(methods)如下:

  •  ChooseContent: ChooseContent("SchedulePath ")得知下一个预定显示的内容,传回值为显示下一个内容的HTML码。其中SchedulePath设定Content Schedule File相对於virtual directory的path。譬如若Content Schedule File的physical path是C:\Inetpub\Wwwroot\Content.txt,其中Wwwroot是"/"virtual directory,则您应设定SchedulePath为\Wwwroot\Content.txt。
     
  •  GetAllContent: GetAllContent("SchedulePath ")得知轮播行程档案所有的内容,传回值为所有内容的HTML码。譬如aspcont.asp:

     
    <% = cont1.GetAllContent("aspcont2.txt")%>

於用户端使用浏览器,浏览执行的结果如下,显示aspcont2.txt所有的内容,中间以横线分隔之:


 

有趣吗 ?

Content Schedule File
 

Content Schedule File(轮播行程档案)设定内容、和轮流显示机率等Content Rotator component用到的资讯。

语法如下,其中中括弧[ ]部份为选项,可有可无:

%% [#Weight] [//Comments]
ContentString
  •  Weight: 设定轮流显示相对机率,值为0~ 65,535。譬如叁个内容将Weight设为2、3、5,则各个内容轮流显示的机率为20%、30%、50%。未设定Weight表示为1。
     
  •  Comments: 注解。
     
  •  ContentString: 设定显示内容的HTML码。可为多行、或包括声音、图片等HTML码。
     

有意思吗 ?

C-4 Content Linking如何管理URL?
 

Content Linking Component
 

使用ASP内建的一个ActiveX Server component,叫做Content Linking component(内容连结元件),让您能够很方便地使用一个文字档Content Linking List File,来管理超连结、上一页、下一页等连结功能。几行的ASP程式码,加上准备一个URL表的文字档即可。若URL表内容有所变动,网页内容将自动更新,而不须修改网页的程式码。

看个例子就知道「Content Linking component」的功能!

於用户端使用浏览器,浏览asplink.asp执行的结果如下,将一个aspnlink.txt档案所有的URL位址和叙述转成超连结:


 

asplink.asp的ASP程式码,使用GetNthURL(listURL, n)得知Content Linking List File中的第n个URL位址,使用GetNthDescription(listURL, n)得知其叙述。如下:

<% Set NLink = Server.CreateObject("MSWC.NextLink")  %>
<% count = NLink.GetListCount("aspnlink.txt")%> 
<% I = 1 %> 
快速掌握Internet技术
<ol>
<ul>
<%  Do While(I <= count) %>  
<li><a href=" <%= NLink.GetNthURL("aspnlink.txt", I)%>  "> 
<%= NLink.GetNthDescription("aspnlink.txt", I)%>  </a> 
<%  I =(I + 1) %>  
<%  Loop  %>  
</ul>
</ol>

所用到的aspnlink.txt内容,如下:

activex.asp	1. ActiveX应用技术大公开
idesign.asp	2. Internet程式设计宝典
html.asp	3. 动态网页设计99招

接着要看看「上一页」、「下一页」的功能,如下:

於用户端使用浏览器,浏览idesign.asp执行的结果如下,按 上一页、下一页 时,会根据aspnlink.txt内容的顺序,超连结到相关的网页,譬如按 上一页 将显示目前网页「2. Internet程式设计宝典」(第二个)的上一个网页「1. ActiveX应用技术大公开」(第一个):


 

idesign.asp的ASP程式码,如下:

<% Set NLink = Server.CreateObject("MSWC.NextLink") %> 这页是:
<% = NLink.GetNthDescription("aspnlink.txt"
,NLink.GetListIndex("aspnlink.txt"))%><BR> 
GetListIndex = <% = NLink.GetListIndex("aspnlink.txt")%> <p> 
上一页: <a href=" <%= NLink.GetPreviousURL("aspnlink.txt")%>
"><% = NLink.GetPreviousDescription("aspnlink.txt")%></a> 
<BR> 下一页: <a href=" <%= NLink.GetNextURL("aspnlink.txt")%>
"><% = NLink.GetNextDescription("aspnlink.txt")%></a>

使用GetPreviousURL和GetPreviousDescription取得「上一页」的URL位址和叙述,使用GetNextURL和GetNextDescription取得「下一页」的URL位址和叙述。

Content Linking语法
 

是否想知道Content Linking Component更详细一些的资料呢 ?

Content Linking component(内容连结元件),让您很方便地使用一个储存於文字档的URL表,来管理超连结、上一页、下一页等连结功能。

只要准备一个文字档,以後若URL表有增减修改,只要更新这个文字档即可,网页内容将自动更新,您不须修改网页的程式码。

这个功能很适合用於线上新闻、公共讯息等用途。

所用到的档案,如下:

  •  Nextlink.dll: Content Linking component的DLL档案。
     
  •  Content Linking List: 文字档,储存URL的顺序表,包括URL位址和叙述,须置於网站的virtual path。

     

    语法如下:

    Set NextLink = Server.CreateObject("MSWC.Nextlink")
  •  NextLink: 设定由Server.CreateObject产生的物件名称。
     

Content Linking方法(methods)
 

Content Linking方法(methods)如下:

  •  GetListCount: GetListCount(listURL)得知Content Linking List File中的URL总数目,其中listURL为Content Linking List File的URL位址。
     
  •  GetListIndex: GetListIndex(listURL)得知目前显示的网页位於Content Linking List File中的位置,由1编起,若目前显示的网页不在Content Linking List File当中时,GetListIndex为0。
     
  •  GetPreviousURL: GetPreviousURL(listURL)得知Content Linking List File中的上一个URL位址。若目前显示的网页不在Content Linking List File当中时,传回Content Linking List File的第一个URL位址。
     
  •  GetPreviousDescription: GetPreviousDescription(listURL)得知Content Linking List File中的上一个URL之叙述。若目前显示的网页不在Content Linking List File当中时,传回Content Linking List File的第一个URL位址之叙述。
     
  •  GetNextURL: GetNextURL(listURL)得知Content Linking List File中的下一个URL位址。若目前显示的网页不在Content Linking List File当中时,传回Content Linking List File的最後一个URL位址。
     
  •  GetNextDescription: GetNextDescription(listURL)得知Content Linking List File中的下一个URL之叙述。若目前显示的网页不在Content Linking List File当中时,传回Content Linking List File的最後一个URL位址之叙述。
     
  •  GetNthURL: GetNthURL(listURL, n)得知Content Linking List File中的第n个URL位址。
     
  •  GetNthDescription: GetNthDescription(listURL, n)得知Content Linking List File中的第n个URL之叙述。
     

请看个例子就知道方法(methods)是如何使用了!

於用户端使用浏览器,浏览asplink.asp执行的结果如下,因目前显示的网页asplink.asp不在Content Linking List File当中,因此GetListIndex=0,GetPreviousURL传回Content Linking List File的第一个URL位址,GetNextURL传回Content Linking List File的最後一个URL位址:


 

找一个在Content Linking List File当中目前所显示的网页idesign.asp,因此GetListIndex等方法就能传回正确的值,如下:


 

ASP程式码,如下:

GetListCount = <% = NLink.GetListCount("aspnlink.txt")%> <BR> 
GetListIndex = <% = NLink.GetListIndex("aspnlink.txt")%> <p> 
GetNthDescription = <% = NLink.GetNthDescription("aspnlink.txt",2)%>
<BR> 
GetNthURL = <% = NLink.GetNthURL("aspnlink.txt",2)%> <p> 
GetNextDescription = <% = NLink.GetNextDescription("aspnlink.txt")%>
<BR> 
GetNextURL = <% = NLink.GetNextURL("aspnlink.txt")%> <p> 
GetPreviousDescription = <% = NLink.GetPreviousDescription
("aspnlink.txt")%> <BR>
GetPreviousURL = <% = NLink.GetPreviousURL("aspnlink.txt")%>

Content Linking List File
 

Content Linking List File是一个文字档,储存URL的顺序表,包括URL位址、叙述、和注解,须置於网站的virtual path。

一个URL位址和其叙述、和注解须写为一行,结尾为carriage return,URL位址、叙述、和注解中间以TAB分隔之。

语法如下,其中中括弧[]部份为选项,可有可无:

Web-page-URL [ text-description [ comment]]
  •  Web-page-URL: 虚拟或相对的URL位址,格式为directory\filename。起头为 「http:」 、「//」、「\\」的绝对URL位址,无法使用GetNextURL、和GetListIndex方法。
     
  •  text-description: 对此URL位址的叙述。
     
  •  comment: 注解。
     

有趣吗 ?

C-5 如何用Page Counter计数网页?
 

Page Counter(网页计数器)的应用
 

在上几节当中,我们使用读写伺服器档案的方式,来产生常见的访客计数器,以记录访客的次数,并显示出来。

您也可以使用ASP内建的一个ActiveX Server component,叫做Page Counter Component(网页计数器元件),来记录访客的次数,每次有访客浏览此网页,会自动将访客计数器加一。

Page Counter(网页计数器)范例
 

请看个例子就知道Page Counter(网页计数器)如何使用了!

於用户端使用浏览器,浏览asppcont.asp执行的结果如下,每次有访客浏览此网页,会自动将访客计数器加一,并显示出来:


 

Page Counter(网页计数器)的ASP程式码如下:

<% 
Set pCounter1 = Server.CreateObject( "MSWC.PageCounter" )
pCounter1.PageHit
%> 您是第 <% = pCounter1.Hits %> 位访客!<p> 
您光临此网页 <% = pCounter1.Hits("/iis5samp/asppcont.asp")%> 次!<p> 
<A href = " asppcont.asp ">再度光临</A>

解说如下:

  •  Server.CreateObject( "MSWC.PageCounter" ): 定义Page Counter(网页计数器)。

     

    定义後即可以使用Page Counter所提供的叁个方法(methood):

    •  PageHit方法: 将访客计数器加一。
       
    •  Hits方法: 读取访客计数器的值。
       
    •  Reset方法: 将访客计数器的值归零。
       

学会了吗 ?

C-6 如何用Counters计数器呢?
 

Counters(计数器)
 

可以使用ASP内建的一个ActiveX Server component,叫做Counters Component(计数器元件),以产生、储存、新增、读取多个个别的计数器。

使用Counters Component(计数器元件)时必须先於global.asa档案中定义如下:

<OBJECT RUNAT=Server SCOPE=Application ID=Counter
 PROGID="MSWC.Counters"> 
</OBJECT>

计数器的内容储存於以下路径之Counters.txt档案中:

\WinNT\system32\inetsrv\Data\Counters.txt

Counters(计数器)方法
 

Counters(计数器)方法如下:

  •  Get(CounterName)方法: 读取计数器CounterName的值。
     
  •  Increment(CounterName)方法: 将计数器CounterName加一。
     
  •  Remove(CounterName)方法: 移除计数器CounterName,并从Counters.txt档案中移除此计数器。
     
  •  Set(CounterName, int)方法: 设定计数器CounterName的值为int。
     

Counters(计数器)范例
 

请看个例子就知道Counters(计数器)如何使用了!

於用户端使用浏览器,浏览aspcounter.asp执行的结果如下,每次有访客浏览此网页,会自动将计数器加一,并显示出来:


 

Counters(计数器)的ASP程式码如下:

第 <% = Counters.Increment("visitors")%> 位访客.

Increment将visitors计数器加一。

Counters.txt档案中储存计数器的内容如下:

visitors:14

旅游地点投票范例
 

让我们多看几个范例,您可以使用Counters(计数器)来做为投票结果的统计,譬如针对旅游地点做投票,浏览aspcounter.asp执行的结果如下,每次有投票某一旅游地点时,会自动将计数器加一,并显示出来:


 

相关的ASP程式码如下:

<% 
If Request("vote")= "1" Then 
    	Counters.Increment("place1")
Elseif Request("vote")= "2" Then
      	Counters.Increment("place2")
Else 
      	Counters.Increment("place3")
End If 
%>
<P>投票结果:
<P><A href=aspcounter.asp?vote=1>大陆桂林</A> <% 
=Counters.Get("place1")%>
<P><A href=aspcounter.asp?vote=2>泰国</A> <% 
=Counters.Get("place2")%>
<P><A href=aspcounter.asp?vote=3>澳洲</A> <% 
=Counters.Get("place3")%>

每次有投票某一旅游地点时,由Request("vote")取得投票旅游地点,Increment方法自动将此旅游地点之计数器加一,而Get方法取得计数器的值。

Counters.txt档案中储存计数器的内容如下:

place3:6
place1:0
place2:7

Set/Remove范例
 

让我们看看Set方法、Remove方法范例,您可以使用Counters(计数器)来做为投票结果的统计,譬如针对旅游地点做投票,浏览aspcounter.asp执行的结果如下,每次有投票某一旅游地点时,会自动将计数器加一,并显示出来:
 

 

相关的ASP程式码如下:

<HR>Counters.Set<p>
<% 
Counters.Increment("pagehit")
Response.Write Counters.Get("pagehit")
Counters.Set "pagehit", 100 
Response.Write "<BR>"
Response.Write Counters.Get("pagehit")
%> 
<HR>Counters.Remove<p> <% 
Counters.Increment("test1")
Response.Write Counters.Get("test1")
Counters.Remove("test1")
Response.Write Counters.Get("test1")
%>

Counters.Set "pagehit", 100设定计数器pagehit的值为100。Counters.Remove("test1")移除计数器test1。

学会了吗 ?

C-7 如何使用取得浏览器资讯呢?
 

ASP内建的一个ActiveX Server component,叫做「Browser Capabilities component」(浏览器资讯元件),可提供用户端使用浏览器的功能资讯给网站伺服器。

浏览器版本
 

若得知用户端使用的浏览器版本,您可以依据不同浏览器,提供不同的网页内容。

由navigator.appName可得知用户端使用的浏览器名称和版本,譬如:

<SCRIPT LANGUAGE="JavaScript">
<!--
document.write("浏览器: " + navigator.appName +
       " 版本: " + navigator.appVersion)
// -->
</SCRIPT>

使用不同的浏览器,浏览aspbrow.asp执行的结果如下,显示浏览器名称和版本:


 

这可不是ASP程式码!这种方式是先由网站伺服器下载判断的网页,於用户端浏览器判断浏览器的版本,判断後再向网站伺服器要求适合执行的网页内容。

让我们看看ASP程式码如何於网站伺服器就得知用户端使用的浏览器版本 ? 而直接传送适合其执行的网页内容。

看个例子就知道「Browser Capabilities component」是什麽东西了!

於用户端使用不同的浏览器,执行aspbrow.asp的结果如下,显示了浏览器名称和版本:


 

ASP程式码如下:

<% 
Set a = Server.CreateObject("MSWC.BrowserType") 
msg = "浏览器: " + a.Browser + "<br>版本: " + a.Version %>
<%=msg %>

浏览器资讯
 

可以得到更多的浏览器资讯吗 ?

於用户端使用不同的浏览器,浏览aspbrow.asp执行的结果如下,显示浏览器的资讯:


 

ASP程式码如下:

<% Set bc = Server.CreateObject("MSWC.BrowserType")%> 
         <Table border=1 cellpadding=0 cellspacing=0> 
             <tr>
             <td>Browser Name</td>
             <td> <%=bc.Browser %>  </Td>
             <tr>
             <td>Browser Version</td> 
             <td> <%=bc.Version %>  </Td>
             <tr>
             <td>Major Version</td>
             <td> <%=bc.Majorver %>  </Td>
             <tr>
             <td>Minor Version</td>
             <td> <%=bc.Minorver %>  </Td>
             <tr>
             <td>Frame Support</td>
             <td> <%=bc.Frames %>  </Td>
             <tr>
             <td>Table Support</td>
             <td> <%=bc.Tables %>  </Td>
             <tr>
             <td>Cookie Support</td>
             <td> <%=bc.Cookies %>  </Td>
             <tr>
             <td>Background Sound Support</td>
             <td> <%=bc.BackgroundSounds %>  </Td>
             <tr>
             <td>VBScript Support</td>
             <td> <%=bc.VBScript %>  </Td>
             <tr>
             <td>JavaScript Support</td>
             <td> <%=bc.JavaScript %>  </Td>
         </table>

是否想知道Browser Capabilities component更详细一些的资料呢 ?

Browser Capabilities语法
 

Browser Capabilities component(浏览器资讯元件),提供用户端使用浏览器的功能资讯给网站伺服器。

当浏览器连线到网站伺服器时,会自动传送一个User Agent HTTP header表头,这个表头包括浏览器的版本,Browser Capabilities component将之与Browscap.ini档案所定义的[HTTPUserAgentHeader]相比较。

若发现传送来的表头与一个[HTTPUserAgentHeader]相符合时,Browser Capabilities component以此[HTTPUserAgentHeader]所定义的浏览器特性,视为用户端使用的浏览器特性。

若未发现任何一个符合的浏览器时,Browser Capabilities component使用Browscap.ini档案中的[Default Browser Capability Settings]预设浏览器特性,当做用户端使用的浏览器特性。若Browscap.ini档案中未定义[Default Browser Capability Settings],则设定每一个浏览器特性为未知的「UNKNOWN」。

您可以於Browscap.ini档案加入新推出的浏览器特性。

所用到的档案,如下:

  •  Browscap.dll: Browser Capabilities component的DLL档案。
     
  •  Browscap.ini: 文字档,设定浏览器特性以与浏览器连线传来的User Agent HTTP header表头比较。须与Browscap.dll位於相同的路径下。
     

语法如下:

Set BrowserType = Server.CreateObject("MSWC.BrowserType")
  •  BrowserType: 设定由Server.CreateObject产生的物件名称。
     

Browscap.ini档案
 

Browscap.ini为一个文字档,可设定浏览器特性以与浏览器连线传来的User Agent HTTP header表头比较。

於Browscap.ini档案,您可以设定多个浏览器的特性。也可以设定预设的浏览器特性,若未发现任何一个符合的浏览器时,则使用Browscap.ini档案中预设的浏览器特性[Default Browser Capability Settings]当做用户端所使用的浏览器之特性。

定义一个浏览器特性时,提供比较用的[HTTPUserAgentHeader],和定义此浏览器的所有特性。

语法如下:

[; comments] 
[HTTPUserAgentHeader] 
[parent = browserDefinition] 
[property1 = value1] 
... 
[propertyN = valueN] 
[Default Browser Capability Settings] 
[defaultProperty1 = defaultValue1] 
... 
[defaultPropertyN = defaultValueN] 
Parameters 
comments
  • 以分号「;」为起头的行表示为注解部份,不会被理会。
     
  •  HTTPUserAgentHeader: 设定此浏览器特性的HTTP User Agent header字串,以供比较之用。可使用「*」代表零或多个所有字元。譬如 [HTTPUserAgentHeader]设定为:
     
[Mozilla/2.0(compatible; MSInternet Explorer 3.0;* Windows 95)]

表示以下的HTTP User Agent header都算吻合:

[Mozilla/2.0(compatible; MSInternet Explorer 3.0; Windows 95)]
[Mozilla/2.0(compatible; MSInternet Explorer 3.0; AK; Windows 95)]
[Mozilla/2.0(compatible; MSInternet Explorer 3.0; SK; Windows 95)]
[Mozilla/2.0(compatible; MSInternet Explorer 3.0; AOL; Windows 95)]

若比较多个[HTTPUserAgentHeader]都吻合,以第一个吻合的浏览器特性为准。

  •  browserDefinition: 设定parent浏览器的[HTTPUserAgent Header],现在的浏览器将继承parent浏览器的所有特性(除非另外有新的定义)。
     
  •  propertyN : 浏览器特性名称,可自行定义,须小於255个字元。以下为一些可能的特性名称:

     
    •  ActiveXControls: 是(True)否(False)支援ActiveX controls。
       
    •  backgroundsounds: 是(True)否(False)支援背景声音。
       
    •  beta: 是(True)否(False)为beta版本。
       
    •  browser: 浏览器名称。
       
    •  cookies: 是(True)否(False)支援cookies。
       
    •  frames: 是(True)否(False)支援frames分割视窗。
       
    •  javascript: 是(True)否(False)支援JScript。
       
    •  platform: 浏览器的工作平台。
       
    •  tables: 是(True)否(False)支援tables表单。
       
    •  vbscript: 是(True)否(False)支援VBScript。
       
    •  version: 浏览器版本。
       
  •  valueN: 浏览器特性的值,预设为字串。起头加#表示整数。或直接定义为TRUE或FALSE。
     
  •  defaultPropertyN: 预设的浏览器特性[Default Browser Capability Settings]名称。若未发现任何一个符合的浏览器时,则使用Browscap.ini档案中预设的浏览器特性当做用户端所使用的浏览器之特性。
     
  •  defaultValueN: 预设浏览器特性的值。预设为字串。起头加#表示整数。或直接定义为TRUE或FALSE。
     

范 例
 

以下的例子, Internet Explorer 3.0、Mozilla/2.0(compatible; MSInternet Explorer 3.01*; Windows 95)、Netscape 3.0、Microsoft Internet Explorer/4.40.308(Windows 95) 为[HTTPUserAgentHeader],将与浏览器传送的User Agent HTTP header表头比较。若相同,则以其下列定义的浏览器特性,当做用户端所使用的浏览器之特性。

[Default Browser Capability Settings]定义预设的浏览器特性,若未发现任何一个符合的浏览器时,则以其下列定义的预设浏览器特性当做用户端所使用的浏览器之特性。

Internet Explorer 3.01浏览器将继承parent浏览器Internet Explorer 3.0的所有特性(譬如frames=TRUE, tables=TRUE, and cookies=TRUE等),并新定义platform=Win95,和version=3.01盖掉原Internet Explorer 3.0的version定义。

;;ie 3.0
[Internet Explorer 3.0]
browser=Internet Explorer
Version=3.0
majorver=#3
minorver=#0
frames=TRUE
tables=TRUE 
cookies=TRUE
backgroundsounds=TRUE
vbscript=TRUE
javascript=TRUE
ActiveXControls=TRUE
Win16=False
beta=False
AK=False
SK=False
AOL=False 
;;ie 3.01
[Mozilla/2.0(compatible; MSInternet Explorer 3.01*; Windows 95)]
parent=Internet Explorer 3.0
version=3.01
minorver=01
platform=Win95 
[Netscape 3.0]
browser=Netscape
version=3.0
majorver=#3
minorver=#0
frames=TRUE
tables=TRUE
cookies=TRUE
backgroundsounds=FALSE
vbscript=FALSE
javascript=TRUE
javaapplets=TRUE
ActiveXControls=FALSE
beta=False 
 [Microsoft Internet Explorer/4.40.308(Windows 95)]
browser=Internet Explorer
version=1.0
majorver=#1
minorver=#0
frames=FALSE
tables=FALSE 
cookies=FALSE
backgroundsounds=FALSE
vbscript=FALSE
javascript=FALSE
javaapplets=FALSE
platform=Windows95
 
; Default Browser 
[Default Browser Capability Settings]
browser=Default
frames=FALSE 
tables=TRUE 
cookies=FALSE 
backgroundsounds=FALSE 
vbscript=FALSE 
javascript=FALSE

您学会了吗 ?

C-8 Permission Checker如何使用呢?
 

Permission Checker的应用
 

ASP内建的一个ActiveX Server component,叫做「Permission Checker Component」(允许检查元件),可让设计者检查使用者是否有权存取某个档案,以便决定显示不同的网页内容给不同的使用者。

您也可以使用Permission Checker Component来检查某个档案是否存在。

Permission Checker范例
 

请看个例子就知道「Permission Checker」如何使用了!

於用户端使用浏览器,浏览asppchk.asp执行的结果会出现以下的画面,True表示使用者有权存取哪个档案,False则表示使用者无权存取哪个档案:


 

asppchk.asp的ASP程式码如下:

<% Set Check = Server.CreateObject("MSWC.PermissionChecker")%>
Physical Path  = <%= Check.HasAccess(Server.MapPath
("asppchk.asp")) 
%>(<% = Server.MapPath("asppchk.asp")%>)<br>
Virtual Path = <%= Check.HasAccess("/iis5samp/asppchk.asp")%>
(/iis5samp/asppchk.asp)<br> 
Physical Path = <%= Check.HasAccess("c:\winnt\notepad.exe")%>
(c:\winnt\notepad.exe)

请看以下的解说!

Permission Checker语法
 

Permission Checker的语法,首先定义如下:

Set Check = Server.CreateObject("MSWC.PermissionChecker")

Check:设定呼叫Server.CreateObject产生的物件名称。

接着就可以使用Permission Checker提供的HasAccess方法(methods),检查使用者是否有权存取某个档案,如下:

Check.HasAccess(Server.MapPath("档案"))

档案路径可为虚拟或绝对的URL位址。

HasAccess方法的结果,若为True表示使用者有权存取这个档案,False则表示使用者无权存取这个档案。

若使用Anonymous(匿名)身份验证方式,因所有使用者都使用相同的身份进入,Permissions Checker component无法针对每一个使用者检查是否有权存取某个档案。

若网路仅仅使用於企业内部,建议您不使用Anonymous(匿名)的方式,以便让Permissions Checker component针对每一个使用者做检查。

C-9 如何用Tools呢?
 

Tools元件
 

ASP内建的一个ActiveX Server component,叫做「Tools」(工具元件),可提供判断档案是否存在、取得 -32768 ~ 32767乱数等功能。Tools可使用的方法如下:

FileExists(filename)方法:判断档案filename是否存在。

Random方法:取得 -32768 ~ 32767乱数。

Tools范例
 

看个例子就知道「Tools」如何使用了!

於用户端使用浏览器,浏览asptools.asp执行的结果会出现以下的画面:


 

asptools.asp的ASP程式码如下:

Tools.FileExists<P>
<% 
Set Tools = Server.CreateObject("MSWC.Tools")
Response.Write "Tools.FileExists('book13.gif') = " &
Tools.FileExists("book13.gif")& "<BR>"
If Tools.FileExists("book13.gif")then 
	Response.Write "<
	a href=bookls13.htm><img src=book13.gif></a>"
End If  
%> 
<HR> 
Tools.Random<BR>
<% = "<BR> -32768 ~ 32767乱数 : Tools.Random = "
& Tools.Random %>
<% =  "<BR>0 ~ 99乱数 :(Abs( Tools.Random ))Mod 100 = "
&(Abs( Tools.Random ))Mod 100 %>

FileExists(filename)判断档案filename是否存在,Random取得 -32768 ~ 32767乱数。

C-10 如何自制ActiveX伺服器元件呢?
 

扩充Active Server Pages的功能
 

除了IIS「内建」的ActiveX Server Components,您可以制作自己的ActiveX Server components,来达成符合自己特殊的需求,以增加扩充Active Server Pages的功能。

ActiveX Server component,可使用Visual Basic、Java、Visual C++、COBOL等程式语言来发展。本章介绍如何使用Visual Basic 6.0版本,来设计制作自己的ActiveX Server components。

执行自制的ActiveX伺服器元件
 

笔者制作了一个可以读写INI档案的ActiveX伺服器元件,名称为「aspini.dll」。

若要执行笔者自己制作的ActiveX伺服器元件,首先必须先於您的Windows NT上登记注册,於DOS下执行「regsvr32」,执行 开始/程式集/命令提示字元 ,於本书范例的路径下,输入『regsvr32 aspini.dll』以登记注册ActiveX伺服器元件aspini.dll,若成功将显示如下画面:


 

第一个范例
 

接着,即可执行第一个范例aspcomp.asp,这个范例将数字123,呼叫ActiveX伺服器元件aspini.dll,乘以10後传回结果1230,并显示於用户端的浏览器上。

aspcomp.asp程式码,其中「INIFile」为project名称,「RW」为class名称,「x10」为此ActiveX伺服器元件的方法,显示於用户端的浏览器上,如下:

<%  Set a = Server.CreateObject("INIFile.RW") %>
 结果: <% = a.x10(123) %>

於用户端使用浏览器,浏览aspcomp.asp执行的结果如下,显示1230:


 

读取INI档案的内容
 

第一个范例好像没有什麽用途。但是这个范例您可能用得上,就是读取INI档案的内容,譬如有一个aspini.ini内容如下:

[User]
Name=jack
Email=jack@abc.com.tw

读取INI档案内容的语法,如下:

Set a = Server.CreateObject("INIFile.RW")
读取值 = a.ReadValue(Request.Form("ini档案的路径档名"
,"中括弧的段落名称", "栏名")

其中「ReadValue」为此ActiveX伺服器元件的方法。"中括弧的段落名称",譬如"User";"栏名",譬如"Name" ,则"读取值"为" jack"。

如何透过笔者制作的ActiveX伺服器元件「aspini.dll」,来读取INI档案的内容呢?请看看以下的例子吧!

於用户端使用浏览器,浏览aspcomp.htm执行的结果如下:


 

填好aspini.ini的路径档案名称後,按下 写完了 按钮:


 

aspcomp.htm相关表单的程式码如下,於用户端使用浏览器填好aspini.ini的路径档案名称後,按下 写完了 按钮,将呼叫执行伺服器的aspcomp1.asp档案,如下:

读取INI值<P>
<form action="aspcomp1.asp" method="post"> 
INI档案: <INPUT TYPE=TEXT NAME="INIFile"  VALUE="c:\asp\aspini.ini">
<br><input type=submit VALUE="写完了"> </form>

所呼叫执行的aspcomp1.asp程式码如下,其中由Request.Form("INIFile")得知INI档案的路径档案名称。「INIFile」为project名称,其中「RW」为class名称。其中「ReadValue」为此ActiveX伺服器元件的方法,将读到的INI内容显示於用户端的浏览器上,程式码如下:

<% Set a = Server.CreateObject("INIFile.RW")
Name1 = a.ReadValue(Request.Form("INIFile"),"User", "Name")
EMail1 = a.ReadValue(Request.Form("INIFile"),"User", "EMail")
%> 
读取INI值结果...<p>
姓名: <% = Name1 %> <BR>
EMail: <% = EMail1 %> <BR>

写入INI档案的内容
 

如何写入INI档案的内容呢 ? 写入INI档案内容的语法,如下:

Set a = Server.CreateObject("INIFile.RW")
b=a.WriteValue("ini档案的路迳档名" ,"中括弧的段落名称",
"栏名","写入值")

其中「WriteValue」为此ActiveX伺服器元件的方法,"中括弧的段落名称",譬如"User";"栏名",譬如"Name";"写入值",譬如"eric"。

如何透过笔者自己制作的ActiveX伺服器元件「aspini.dll」,来写入这个INI档案的内容呢 ? 请看看以下的例子吧!

於用户端使用浏览器,浏览aspcomp.htm执行的结果如下:


 

填好要写入的值後,按下 写完了 按钮,将写入INI档案并读取之,显示如下:


 

修改後的aspini.ini内容,如下:

[User]
Name=eric
Email=eric@ms1.hinet.net

aspcomp.htm相关表单的程式码如下,於用户端使用浏览器填好後,按下 写完了 按钮,将呼叫执行伺服器的aspcomp2.asp档案,如下:

写入INI值<P> <form action="aspcomp2.asp" method="post"> 姓名: <
INPUT TYPE=TEXT NAME="Name"  VALUE="大名"><br>
EMail: <INPUT TYPE=TEXT NAME="EMail"  VALUE="xxx@xxxxx"><br> 
INI档案: <INPUT TYPE=TEXT NAME="INIFile"  VALUE="c:\asp\aspini.ini">
<br><input type=submit VALUE="写完了">
</form>

所呼叫执行的aspcomp2.asp程式码如下,其中由Request.Form("INIFile")得知INI档案的路径档案名称,由Request.Form("Name")得知修改後的Name值,由Request.Form("Email")得知修改後的Email值。「INIFile」为project名称,其中「RW」为class名称。其中使用此ActiveX伺服器元件的方法「WriteValue」写入INI档案内容,再使用此ActiveX伺服器元件的方法「ReadValue」读取INI档案内容,将读到的INI内容显示於用户端的浏览器上,程式码如下:

<% 
Set a = Server.CreateObject("INIFile.RW")

b=a.WriteValue(Request.Form("INIFile"),"User", "Name",
Request.Form("Name"))

b=a.WriteValue(Request.Form("INIFile"),"User", "EMail",
Request.Form("Email"))

Name1 = a.ReadValue(Request.Form("INIFile"),"User", "Name")

EMail1 = a.ReadValue(Request.Form("INIFile"),"User", "EMail")

%> 读写INI值结果...<p>

姓名: <% = Name1 %> <BR>

EMail: <% = EMail1 %> <BR>

您学会了吗 ?

制作ActiveX伺服器元件
 

本节介绍如何使用Visual Basic 6.0版本,来设计制作自己的ActiveX伺服器元件。

以笔者所制作的ActiveX伺服器元件「aspini.dll」为例,原始码为asprwini.vbp,您可使用Visual Basic 6.0版本开启之,并加以参考对照。

以下的步骤将教您制作出这个ActiveX伺服器元件:

步骤一 命名project名称
 

执行Visual Basic 6.0後,选择建立「ActiveX DLL」新专案如下:


 

第一个步骤就是命名此project名称,此project名称将於定义此ActiveX伺服器元件「Set a = Server.CreateObject("project名称.class名称")」时使用。要执行Visual Basic 6.0版本,请选择 专案 选单的 属性 ,选择 一般 标签页,并於 专案名称 栏位输入此专案的名称『INIFile』,如下:


 

步骤二 加入Class
 

一个Class包括ActiveX伺服器元件的方法(methods)、和属性(properties),此步骤加入一个Class,以便以後定义一些方法。

若要加入一个Class,请选择 专案 选单的 新增物件类别模组 ,於Name填入Class的名称『RW』,如下:


 

此Class的名称将於定义此ActiveX伺服器元件「Set a = Server.CreateObject("project名称.class名称")」时用到 。

步骤叁 加入Class的方法
 

此步骤加入一个Class的方法,以便呼叫使用。

若要加入一个Class,请加入以下程式码到名称为RW的Class,「x10」为方法,将输入值data乘以10後输出,如下:

Public Function x10(data)
    x10 = data * 10 
End Function

画面如下:


 

步骤四 加入ActiveX伺服器元件的进入点
 

ActiveX伺服器元件需要一个进入点,呼叫时将由此进入点开始执行,当使用「Set a = Server.CreateObject("project名称.class名称")」以得到物件的instance时,即将执行此ActiveX伺服器元件的进入点「Sub Main」的程式。

若要加入一个ActiveX伺服器元件的进入点,请选择 专案 选单的 属性 ,於启动物件的画面,选择「Sub Main」後按 确定 键,如下:


 

步骤五 储存project并产生DLL档
 

接着,选择 档案 选单的 储存专案 来储存专案,接着,产生DLL档。请选择 档案 选单的 制成INIFile.dll ,产生DLL档名为「aspini.dll」。

步骤六 登记注册DLL档
 

若要执行自己制作的ActiveX伺服器元件,首先必须先於您的Windows NT上登记注册,於DOS下执行「regsvr32」,执行 开始 /程式集 / 命令提示字元 ,於「aspini.dll」的路径下,输入『regsvr32 aspini.dll』以登记注册ActiveX伺服器元件aspini.dll。或者使用 元件服务 ,来使用Transaction Server管理此元件。

此时已大功告成,您即可使用上一节范例的方法呼叫这个自己所制作的ActiveX伺服器元件。

制作读写INI档案的ActiveX伺服器元件
 

除了使用简易的乘法外,您可以於自己制作的ActiveX伺服器元件,呼叫Windows的API使用,譬如读写INI档案的Windows API为GetPrivateProfileString和WritePrivateProfileString。

读取INI档案内容的方法,如下:

Declare Function GetPrivateProfileString Lib "kernel32"
  Alias "GetPrivateProfileStringA"(ByVal lpApplicationName
  As String, ByVal lpKeyName As Any, ByVal lpDefault As
  String, ByVal lpReturnedString As String, ByVal nSize As
  Long, ByVal lpFileName As String)As Long 

Result% = GetPrivateProfileString(SectionName, KeyName,
"Error", RetValue$, 100, FileName)

写入INI档案内容的方法,如下:

Declare Function WritePrivateProfileString Lib "kernel32"
  Alias "WritePrivateProfileStringA"(ByVal lpApplicationName
  As String, ByVal lpKeyName As Any, ByVal lpString As Any,
  ByVal lpFileName As String)As Long 
Result% = WritePrivateProfileString(SectionName$, KeyName$,
Value$, FileName$)

如何於自己制作的ActiveX伺服器元件,呼叫GetPrivateProfileString和WritePrivateProfileString之Windows API呢 ?

本节范例,能够读写INI档案的ActiveX伺服器元件,制作方法与上面步骤相同,请於步骤四中加入Class的两个方法,一个是ReadValue方法读取INI档案内容,如下:

Public Function ReadValue(FileName$, SectionName$, KeyName$) 
    Dim RetValue$, Result%
    RetValue$ = String$(100, 0)
    Result% = GetPrivateProfileString(SectionName, KeyName,
    "Error", RetValue$, 100, FileName)
ReadValue = Left$(RetValue$, Result%) 
End Function

另一个是ReadValue方法读入INI档案内容,如下:

Public Function WriteValue(FileName$, SectionName$,
KeyName$, Value$)

Dim Result%
Result% = WritePrivateProfileString(SectionName$, KeyName$,
Value$, FileName$) 

End Function

您须於Module1宣告所用到的GetPrivateProfileString和WritePrivateProfileString,如下:

Declare Function GetPrivateProfileString Lib "kernel32" Alias
"GetPrivateProfileStringA"(ByVal lpApplicationName As
String, ByVal lpKeyName As Any, ByVal lpDefault As String,
ByVal lpReturnedString As String, ByVal nSize As Long,
ByVal lpFileName As String)As Long 

Declare Function WritePrivateProfileString Lib "kernel32"
Alias "WritePrivateProfileStringA"(ByVal lpApplicationName
As String, ByVal lpKeyName As Any, ByVal lpString As Any,
ByVal lpFileName As String)As Long

有趣吗 ?