首页  ·  知识 ·  编程语言
ASP编程入门进阶(九)
佚名  5D多媒体  ASP  编辑:dezai  图片来源:网络
Browser Linkin 、Browser Capabilities组件 该组件最主要的作用是:提取识别客户端浏览器的版本信息。 其原理是这样的:当客

Browser & Linkin

、Browser Capabilities组件

该组件最主要的作用是:提取识别客户端浏览器的版本信息。

其原理是这样的:当客户端浏览器向服务器发送页面请求时,同时会自动发送一个User Agent HTTP标题,而该标题是一个声明浏览器及其版本的 ASCII 字符串。而Browser Capabilities组件就将User Agent映射到在文件Browscap.ini中所注明的浏览器 , 并通过BrowserType对象的属性来识别客户浏览器。

若该对象在 browscap.ini 文件中找不到与该标题匹配的项,那么将使用默认的浏览器属性。若该对象既未找到匹配项且 browscap.ini 文件中也未指定默认的浏览器设置,则它将每个属性都设为字符串 "UNKNOWN"。

在默认情况下,browscap.ini文件被存放在 WINDOWS\SYSTEM\INERSRV( 如果是95/98+PWS4) 或 NT\SYSTEM32\INERSRV( 如果是 NT) 目录中,你可以自己编辑这个文本文件,以添加自己的属性或者根据最新发布的浏览器版本的更新文件来修改该文件。

可以得出结论,Browser Capabilities组件也就是提取某个文件中的内容,然后比较得出显示。具体该如何应用呢?

1,btinfo.asp

<%set bc=server.CreateObject("mswc.browsertype")%> 
浏览器名称是browser:<%=bc.browser%>

浏览器版本是version:<%=bc.version%>

浏览器主版本是majorver:<%=bc.majorver%>

浏览器辅版本是minorver:<%=bc.minorver%>

浏览器的运行平台是platform:<%=bc.platform%>

很显然“<%set bc=server.CreateObject("mswc.browsertype")%> ”就是进行的浏览器组件的建立
以下诸如“bc.browser”之类即为显示浏览器的具体某个特性了。

2,btif.asp

<%set bc=server.CreateObject("mswc.browsertype")%> 
<%if bc.frames=true then%>
浏览器支持多窗口(frames)显示
<%else%>
浏览器不支持多窗口(frames)显示
<%end if%>


<%if bc.backgroundsounds=true then%>
浏览器可以播放背景音乐(backgroundsounds)
<%else%>
浏览器不能播放背景音乐(backgroundsounds)
<%end if%>


<%if bc.tables=true then%>
浏览器支持表格(tables)显示
<%else%>
浏览器不支持表格(tables)显示
<%end if%>


<%if bc.beta=true then%>
你的浏览器是一测试版(beta)
<%else%>
你的浏览器是一正式版
<%end if%>


<%if bc.activexcotrols=true then %>
浏览器支持active控制
<%else%>
浏览器不支持active控制
<%end if%>


<%if bc.cookies=true then%>
浏览器支持cookie功能
<%else%>
浏览器不支持cookie功能
<%end if%>


<%if bc.vbscript=true then%>
浏览器支持vbscript
<%else%>
浏览器不支持vbscript
<%end if%>


<%if bc.jscript=true then%>
浏览器支持jscript
<%else%>
浏览器不支持jscript
<%end if%>

该代码则是检测当前浏览器对各类网页技术的支持情况,那下面就可以根据某特定情况做相应变动

3,fram.asp

<%set bc=server.CreateObject("mswc.browsertype")
if bc.frames then
%>




<%else%>
你的浏览器不支持框架
<%end if%>

很简单的意思:如果当前浏览器支持框架则进行frameset的显示,否则提示“你的浏览器不支持框架”

当然,需要提醒你的:不要过分依赖该组件,因为其只是提取browscap.ini里的值,而该值随时可以被客户修改,或者记录过时,不能真实反映到浏览器的情况,慎用之。

二、Content Linking组件

曾经用DW做网页都有这样一个烦恼:新做了页面,其它所有相关的页都要重新再做一次超级链接。一次也就罢了,多了多了不禁觉得无用功做了不少。试想如果能有一个专门的文件来负责页面的连接那该多好。

Content Linking 组件也就应运而生了。它非但可以使你在这些页面中建立一个目录表,而且还可以在它们中间建立动态连接,并自动生成和更新目录表及先前和后续的 Web 页的导航链接。

使用该组件,首先需要编写一个目录文件,也就是网页网址的顺序列表文件,它是一个文本文件,可以自由命名。其次,编写一个ASP文件,根据目录文件提供的信息自动生成带超链的目录页。如果需要在每一页上假如“向前或向后翻页”的超链,就再编写一个能自动生成翻页超链的包含文件,可使用inc为扩展名,例如"Nlink.inc"。以后,在组内每一页中包含它。

1,link.txt

redirect.asp?url=http://www.cnbruce.com/    cnbruce.com
redirect.asp?url=http://www.blueidea.com/    blueidea.com
redirect.asp?url=http://www.it365cn.com/    it365cn.com

该目录文件的网址就是连接网址,文本就是连接文本了,需要注意的是中间采用Tab键进行分隔。

2,link.asp

<%Set objNextLink = Server.CreateObject("MSWC.Nextlink")%>
<%
intCount = objNextLink.GetListCount("link.txt")
For i = 1 To intCount
%>
">
<%=objNextLink.GetNthDescription("link.txt", i) %>



<%Next%>

Set objNextLink = Server.CreateObject("MSWC.Nextlink")”建立Nextlink组件的连接
objNextLink.GetListCount("link.txt")”提取link.txt文件中的列表数目
objNextLink.GetNthURL("link.txt",i)”提取link.txt文件中第i行文本的连接网址
objNextLink.GetNthDescription("link.txt",i)”提取link.txt文件中第i行文本的连接文本

3,redirect.asp
也就是转向文件了。

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

呵呵,是不是觉得还没用到“上一页”、“下一页”的功能。再来~!

4,link1.txt

1.asp    ASP编程入门进阶(一)
2.asp    ASP编程入门进阶(二)
3.asp    ASP编程入门进阶(三)
4.asp    ASP编程入门进阶(四)

主要功能是设置文本和连接

5,link1.inc

<%Set Nextlink=Server.CreateObject("MSWC.NextLink")
Response.write "当前文章索引号为" & NextLink.GetListIndex("link1.txt") & "
"
Response.write "上一章的标题:" & NextLink.GetPreviousDescription("link1.txt") & "
"
Response.write "下一章的标题:" & NextLink.GetNextDescription("link1.txt") & "
"
count = NextLink.GetListCount("link1.txt")
Response.write ""&"第一章"&" "
Response.write ""&"上一章"&" "
Response.write ""&"下一章"&" "
Response.write ""&"最后一章"&"
"
%>


 


GetListCount(目标文件名) 显示组件中包含的连接的文件数目。
GetListIndex(目标文件名) 显示当前页在这些连接文件中的前后位置索引值。
GetNextDescription(目标文件名) 显示连接文件中下一个的描述。
GetNextURL(目标文件名) 显示连接文件中的下一个文件的URL地址。
GetNthDescription(目标文件名, N) 显示连接文件中第N个网页的描述。
GetNthURL(目标文件名, N) 显示连接文件中第N个网页的文件URL地址。
GetPreviousDescription(目标文件名) 显示连接文件中前一个文件的描述。
GetPreviousURL(目标文件名) 显示连接文件中前一个文件的URL地址。

6,1.asp,2.asp,3.asp,4.asp



以下是具体内容

这就是一个很简单的分页程序了。当然接着的后面会有些更详细更复杂的分页,慢慢来吧,呵呵。


组件Counters

该组件用于创建一个或多个计数器,这些计数器用于跟踪某一网页或某一网站访问次数的信息。你只能创建一个计数器组件,但该组件可以有多于一个的计数器。

一旦创建了计数器,它将一直持续下去直到被删除为止。

计数器不会在一个事件比如访问一页时自动增加。你必须使用Set和Increment方法人工的设置或增长计数器。

计数器不受作用域限制。一旦创建了一个计数器,那么站点上的任何页都可以检索和控制它的值。

一、Counters.Set & Counters.Get
Counters.Set主要用来设置记数初始值,Counters.Get则是用来提取记数的值。

1,counts_set.asp

<%
Set Counters=server.createobject("MSWC.Counters")
Counters.Set "cnbruce",10
Counters.set "it365cn",20
Counters.set "blueidea",30
%>
共有<%= Counters.Get("cnbruce") %>次访问 cnbruce.com 网站

共有<%= Counters.Get("it365cn") %>次访问 it365cn.com 网站

共有<%= Counters.Get("blueidea") %>次访问 blueidea.com 网站

用法很简单,首先“Counters=server.createobject("MSWC.Counters")”表示建立了一Counters组件的连接;Counters.Set "cnbruce",10表示记数了名为“cnbruce”的初始值10;Counters.Get("cnbruce")就表示提取名为“cnbruce”的记数值了。

二、Counters.Increment
该方法的功能是:记数每次加一。在上例中你刷新页面,记数是不会添加的,所以现在换用Increment方法。

2,counts_inc.asp

<%
Set Counters=server.createobject("MSWC.Counters")
%>
共有<%= Counters.Increment("cnbruce") %>次访问 cnbruce.com 网站

共有<%= Counters.Increment("it365cn") %>次访问 it365cn.com 网站

共有<%= Counters.Increment("blueidea") %>次访问 blueidea.com 网站

基本代码相似,主要就是Counters.Increment的功能累加1。

根据累加可以做个简单的投票系统了。

3,vote.asp

<%
set Counters=server.createobject("MSWC.Counters")
vote = Request.QueryString("site")
Counters.Increment(vote)
%>
Vote for your Favorite Site:

cnbruce
it365cn
blueidea



Current Vote Tally:

Cnbruce: <% =Counters.Get("cnbruce") %>

It365cn: <% = Counters.Get("it365cn") %>

Blueidea: <% = Counters.Get("blueidea") %>

功能是选择某单选按钮后提交,其对应的记数值则Counters.Increment

三、Counters.Remove
该对象则是起的记数清空的作用了。

4,remove.asp

<%
set Counters=server.createobject("MSWC.Counters")
vote = Request.QueryString("site")
clear = Request.QueryString("clear")
Counters.Increment(vote)
If Not clear="" Then
Counters.Remove("cnbruce")
Counters.Remove("it365cn")
Counters.Remove("blueidea")
End If
%>
Vote for your Favorite Site:

cnbruce
it356cn
blueidea



Current Vote Tally:

Cnbruce: <% =Counters.Get("cnbruce") %>

It365cn: <% = Counters.Get("it365cn") %>

Blueidea: <% = Counters.Get("blueidea") %>



通过今天的接触可以总结出,一个简单的记数系统已经有两种方法:使用Application对象、使用Counters组件。但更多的还有采用FSO,或者是需要数据库的就是后话慢慢谈了。


在我们使用ASP组件时候还要注意一些东西:

当我们使用服务器组件创建对象时,一般有两种方法。比较常用的方法是用SERVER对象的CreateObject() 方法,象这样:
SET NextLink = Server.CreateObject("MSWC.NextLink")

这种方法很好用,但是还有一种方法更节省系统资源。因为当你用Server.CreateObject()方法创建对象时,对象立即被加载,同时系统为这个对象分配好内存和其它资源。

第二种创建对象的方法是利用HTML的标记,语法是这样的:

利用标记创建对象时,你要创建的对象不被马上加载,而是等到这个对象的方法或属性第一次被引用时才加载。这样,我们就会节省一些资源。虽然不是很多,但是当你的系统每天要承受近百万次的点击时,这对节省服务器资源就很有帮助了。(Pine译注)

如其所言:我们的Counters则可以放于global.asa中

 

FSO组件之驱动器操作

 

操作完驱动器,接着就是来操作文件夹了。其中包括:提取文件夹信息、创建文件夹、删除文件夹、复制文件夹、移动文件夹等。下面就具体来看。

  一、fso.GetFolder
  一看就明白,是提取文件夹了。那具体是提取哪个文件夹呢?后面肯定要跟一个文件夹的路径。提取出来了再来显示该文件夹相关信息呢?是不是有要具体提取下去。所以,看程序:
  1,getfldr.asp


<%
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldr = fso.GetFolder("c:\Program Files")
Response.Write "父文件夹名字是:" & fldr & "
"

If fldr.IsRootFolder = True Then
Response.Write "该文件夹是一根文件夹" & "
"
Else
Response.Write "该文件夹不是根文件夹" & "
"
End If

Response.Write "驱动器名字是:" & fldr.Drive & "
"
%>

  首先建立FSO组件的连接是必不可少的啦,然后Set fldr = fso.GetFolder("c:\Program Files")设定fldr对象被赋值,以作下面程序的引用。

  fldr.IsRootFolder即为判断该文件夹是否为一根文件夹,值为布尔值(true or false);fldr.Drive则显示该文件夹所在的驱动器号了。

  二、fso.CreateFolder
  下面比较让人激动的是通过ASP建立文件夹了,你可以在你的权力范围内任意位置建立任意文件夹。
  2,creatfldr.asp


<%
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder ("c:\cnbruce")
Response.Write "文件夹名为" & fso.GetBaseName("c:\cnbruce")
%>

  执行程序,应该发现C盘多出了cnbruce文件夹,fso.GetBaseName则是提取文件夹名。

  三、fso.DeleteFolder
  通过ASP可以建立了文件夹,则同样可以删除文件夹。

  3,delfldr.asp


<%
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFolder("c:\cnbruce")
Response.Write "文件夹已删除"
%>

  发现刚建立的cnbruce文件夹确实已被删除。
 
  那下面就采用一个通用程序来灵活应变下。

  4,mainflr.asp


<%
Sub CreateAFolder(file)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder(file)
response.write "已经建立了"&file
End Sub

Sub DeleteAFolder(file)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFolder(file)
response.write "已经删除了"&file
End Sub
%>
<%
subname=request.form("submit")
create=request.form("create")
del=request.form("del")
if subname<>"" then
if create<>"" then
call CreateAFolder(""&create&"")
end if
if del<>"" then
call DeleteAFolder(""&del&"")
end if
end if
%>











  需要注意的是:删除并不会提示“确认要放入回收站”这项。这点你需要谨慎处理,特别是对你的系统文件夹。

  四、fso.MoveFolder
  主要作用是进行文件夹的移动,相当于剪切粘贴动作。

  5,movefldr.asp


<%
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder ("c:\cnbruce")
fso.MoveFolder "c:\cnbruce", "C:\Program Files\"
%>
查看cnbruce文件夹有没有移动过来

  格式:fso.MoveFolder "被移动的文件夹","移动到的文件夹"

  本程序先是在C盘下建立了cnbruce文件夹,然后将其移动到C:\Program Files\文件夹下面。

  不过同样需要注意的是你的系统文件夹不能乱移动。

  五、fso.CopyFolder
  主要作用:将文件夹从某位置复制到另一位置。
  6,copyfldr.asp


<%
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFolder "c:\Program Files\cnbruce", "c:\"
%>
查看cnbruce文件夹有没有复制过来

  该程序是建立在上一movefldr.asp的执行结果基础之上来完成复制到C盘根目录下的。(话比较长-_-!)

  当然,其拷贝也是将该文件夹包括里面所以子文件夹和文件统统拷贝。

  到最后再试着将c:\Program Files\cnbruce和c:\cnbruce两个文件夹进行删除掉吧。

  不过,继续提醒你:不要写错了,比如写成c:\Program Files,那你就惨了:这叫玩命,学ASP玩出心跳出来了。

  对文件夹的操作差不多了,是不是感到用处比较大?有训言:好东西是把双刃剑。正义和邪恶就只一线间,注意正规合理利用该组件。不过还有你放心的是,现在网站空间服务商对这权力已经限定得死死的了,你再怎么闹翻也不会冒泡的:)

  然后接下来就是更微妙的:FSO对文件的操作。

  FSO,正如UFO般令人激动、令人神往,当然更多的亦是让人欢喜让人忧。君不见某空间服务商广告:100MB空间只要60RMB/年,支持数据库,支持什么什么……一问不支持FSO,立马泄气。那FSO究竟是什么东西,它的力量又是如何巨大,其操作的原理又是怎的怎的呢?这次来个彻底的理解。

  首先,FSO是FileSystemObject的简称。当然也就是我们的俗称FSO组件了,该组件可以用来处理驱动器、文件夹以及文件。

  它可以检测并显示出系统驱动器的信息分配情况;还能够创建、改变、移动和删除文件夹,并能探测一些给定的文件夹是否存在,若存在,还能提取出该文件夹的信息,如名称、被创建或最后一次修改的日期,等等。FSO还使得对文件的处理变得很容易。

  一、fso.GetDrive

  正如其它组件的建立一样,FSO的引用也必须建立连接。


Set fso=Server.CreateObject("Scripting.FileSystemObject")

  注意CreateObject的内部再也不是MSWC了,而是Scripting。
  那下面就可以通过fso来处理驱动器了。比如fso.GetDriveName提取驱动器名,fso.GetDrive同样提取标准驱动器名。比如:

  1,fso.asp


<%Set fso=Server.CreateObject("Scripting.FileSystemObject")%>
<%=fso.GetDriveName("d:")%>

<%=fso.GetDrive("d:")%>

  你会发现GetDriveName("d:")就是“d:”,而GetDrive("d:")则为标准的“D:”,所以我们一般这样写fso.GetDrive(fso.GetDriveName(drvPath))来提取某个具体的驱动盘。

  二、drv.GetInfo
  上面已经把某个特定的驱动器提取了,那接着是不是提取该驱动盘的具体信息。

  2,drv.asp


<%
Set fso=Server.CreateObject("Scripting.FileSystemObject")
Set drv=fso.GetDrive(fso.GetDriveName("d:"))
%>
该盘的空间大小:<%=drv.TotalSize%>

该盘的剩余空间大小:<%=drv.FreeSpace%>

  以上只是提取的D盘驱动器的信息,来个通用的函数,继续分别测试自己的驱动吧。

  3,drvinfo.asp


<%
Function ShowDriveInfo(drvPath)
Dim fso, drv, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set drv = fso.GetDrive(fso.GetDriveName(drvPath))
s = "驱动盘" & drv & "的卷标是:"
s = s & drv.VolumeName & "
"
s = s & "总计空间:" & drv.TotalSize & "
"
s = s & "剩余空间:" & drv.FreeSpace & "
"
s = s & "文件类型:" & drv.DriveType & "
"
s = s & "文件系统:" & drv.FileSystem
Response.Write s
End Function
%>
<%
on error resume next
whatpath=request.form("path")
if whatpath<>"" then
ShowDriveInfo(whatpath)
end if%>




  其中的drv.TotalSize和drv.FreeSpace返回的是字节数,我们可以用FormatNumber()函数处理下。比如FormatNumber(Drive.TotalSize/1024,0)得到一眼就知磁盘多少G的值。

  还有一个文件类型:drv.DriveType最多的时候是显示数值“2”,其实“2”就表示的“硬盘驱动器”,“1”表示“软盘驱动器”,“4”表示“光盘驱动器”……

  下面就用一个程序遍历显示自己机器上所有驱动器的信息。

  4,showall.asp


<%
Function tran(Driver)
Select Case Driver
Case 0: tran="设备无法识别"
Case 1: tran="软盘驱动器"
Case 2: tran="硬盘驱动器"
Case 3: tran="网络硬盘驱动器"
Case 4: tran="光盘驱动器"
Case 5: tran="RAM虚拟磁盘"
End Select
End Function
set fso=Server.CreateObject("Scripting.FileSystemObject")
%>













<%
on error resume next
For each drv in fso.Drives
Response.Write ""
Response.Write ""
Response.write ""
Response.write ""
Response.write ""
Response.write ""
Response.write ""
Response.write ""
Response.write ""
Response.write ""
Response.Write ""
Next
set fs=nothing
%>
盘符类型卷标总计大小可用空间文件系统序列号是否可用路径
" & drv.DriveLetter & "" & tran(drv.DriveType) & "" & drv.VolumeName & "" & FormatNumber(drv.TotalSize / 1024, 0)& "" & FormatNumber(drv.Availablespace / 1024, 0) & "" & drv.FileSystem & "" & drv.SerialNumber & "" & drv.IsReady & "" & drv.Path & "

  

  FSO中除了可以对驱动器、文件夹的操作以外,功能最强大的就是对文件的操作了。它可以用来记数、内容管理、搜索还可生成动态HTML页面等等。

  一、fso.OpenTextFile
  无需多说,fso.OpenTextFile就是打开某个文件了,一般情况之下是打开的txt文本文件。所以首先我们先建立一个txt文件,然后通过FSO来读取其中的内容。

  1,info.txt


name:cnbruce
sex:male

  建立了该文件,下面再做个ASP页面,当然最好两个文件是在同一目录下。

  2,opentxt.asp


<%
whichfile=server.mappath("info.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set txt = fso.OpenTextFile(whichfile,1)
rline = txt.ReadLine
rline = rline & "
" & txt.ReadLine
Response.Write rline
txt.Close
%>

  需要注意:无论是通过FSO打开驱动器、打开文件夹、打开文件,以及以后要接触到的打开数据库,都只能是打开绝对物理路径地址。但一般情况是上传到空间服务商那,不能很直接地了解到自己文件的所在位置,所以强烈推荐使用server.mappath方法:平台移植性强,适用性强。

  CreateObject("Scripting.FileSystemObject")建立了FSO组件的连接,fso.OpenTextFile(whichfile,1)打开了info.txt该文件。参数“1”表示“ForReading:以只读方式打开文件。不能写这个文件。”,其他还有参数“2”表示“ForWriting:以写方式打开文件”,参数“8”表示“ForAppending:打开文件并从文件末尾开始写”。

  打开了该文件,接下来是不是要显示文件中的内容?那就通过txt.ReadLine方法读取文本中的一整行,如果需要继续读取下一行,则继续使用txt.ReadLine方法。当然初此还有其它的读取方法,比如txt.Read(7)读取指定数量的字符,txt.ReadAll返回文本中的全部内容。

  二、fso.CreateTextFile
  如fso.CreateFolder建立文件夹般,fso.CreateTextFile则是建立文件了。

  3,creattxt.asp


<%
whichfile=server.mappath("info.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.CreateTextFile(whichfile,True)
MyFile.WriteLine("My Name Is CN-Bruce")
MyFile.WriteLine("My Sex Is Male")
MyFile.Close
%>
查看内容

  本次建立的文件是上一info.txt文件,fso.CreateTextFile(whichfile,True)其中的参数true即表示能覆盖已有文件。建立后需要向里面添加数据就采用“MyFile.WriteLine”了。

  那现在就可以建立一个简单的文本记数器了,还记得以前的记数?:1,通过application、session、global.asa进行记数;2,通过Counter组件进行记数。但两者都有通病,就是不能保存,如果服务器重新启动后,是不是所有记数全部清空了呢:)那现在就可以使用文本来记录数据了,即使重启,下次提取的也还是该文件。

  试验:文本计数器

  首先建立一记数的文本文件counter.txt,设定初始值为“1”

  4,counter.txt


1

  接着是记数的ASP文件,功能是显示文本的记数,本做加1的记数,然后还要将新的记数写入文本文件。

  5,txtcount.asp


<%
whichfile=server.mappath("counter.txt")
'打开文件并将其值读取,最后关闭连接释放资源
set fso=createobject("Scripting.FileSystemObject")
set openfile=fso.opentextfile(whichfile,1)
visitors=openfile.readline
openfile.close
'页面显示记数内容并做加1运算
response.write "您是本页的第"&visitors&"位访客"
visitors=visitors+1
'将新的数值添加写入到文本,最后关闭所有连接释放资源
set creatfile=fso.createtextfile(whichfile)
creatfile.writeLine(visitors)
creatfile.close
set fso=nothing
%>

  那根据这个可以继续地扩展内容:比如让记数用数字图片显示。当然前提就是你需要0-9的10张记数图片,并将此图片放于img文件夹中。
  下为一增强的txtcount.asp内容代码。


<%
whichfile=server.mappath("counter.txt")

set fso=createobject("Scripting.FileSystemObject")
set openfile=fso.opentextfile(whichfile,1)
visitors=openfile.readline
openfile.close
CountLen=len(visitors)
response.write "您是本页的第"

for i=1 to 6-countLen '表示最大值999999
response.write ""
next
for i=1 to countlen
response.write ""
next
response.write "位访客"

visitors=visitors+1
set creatfile=fso.createtextfile(whichfile)
creatfile.writeLine(visitors)
creatfile.close
set fso=nothing
%>

  本程序中采用的是mid函数,该函数的作用是返回某字符串中从第几位字符开始的几个字符。格式即为:Mid(string,start,length)



效果页参看

一,fso.GetFile
  提取文件相应的 File 对象

  1,getfile.asp


<%
whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close
Set f2 = fso.GetFile(whichfile)

s = "文件名称:" & f2.name & "
"
s = s & "文件短路径名:" & f2.shortPath & "
"
s = s & "文件物理地址:" & f2.Path & "
"
s = s & "文件属性:" & f2.Attributes & "
"
s = s & "文件大小: " & f2.size & "
"
s = s & "文件类型: " & f2.type & "
"
s = s & "文件创建时间: " & f2.DateCreated & "
"
s = s & "最近访问时间: " & f2.DateLastAccessed & "
"
s = s & "最近修改时间: " & f2.DateLastModified
response.write(s)
%>

  其效果正如右键某文件,看到的具体属性信息。
  其中Attributes返回的数值“32”表示:(Archive)上次备份后已更改的文件。可读写。

  其它值附录如下:

 
Normal 0 普通文件。 没有设置任何属性。
ReadOnly 1 只读文件。 可读写。
Hidden 2 隐藏文件。 可读写。
System 4 系统文件。 可读写。
Directory 16 文件夹或目录。 只读。
Archive 32 上次备份后已更改的文件。 可读写。
Alias 1024 链接或快捷方式。 只读。
Compressed 2048 压缩文件。 只读。

  二,file.move
  作用将指定的文件或文件夹从某位置移动到另一位置。其实该方法仍然属于fso.GetFile后的一个应用。

  2,movefile.asp


<%
whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close
Set f2 = fso.GetFile(whichfile)
f2.Move "C:\"
%>
查看下有没有


  简单的剪切粘贴的功能实现。

  三,File.Copy
  同样属于fso.GetFile后的一个应用。就只是单纯地拷贝文件到某位置。

  3,copyfile.asp


<%
whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close
Set f2 = fso.GetFile(whichfile)
f2.Copy "D:\"
%>
查看下有没有

  和本ASP页面同在目录下的cnbruce.txt文件依然存在。

  四,file.Delete
  很显然,就是直接删除文件了。

  4,delfile.asp


<%
whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close
Set f2 = fso.GetFile(whichfile)
f2.move "d:\"
Set f3 = fso.GetFile("d:\cnbruce.txt")
f3.delete
%>
查看下是没有该文件的

  当然FSO还没有结束,比如上传文件,ASP转HTML等都需要用到FSO。更精彩的依然是在后面。

ASP技巧累加(2)

  严格控制Session。

  可以将不需要Session的内容(比如帮助画面,访问者区域,等等)移动到关闭Session的独立ASP应用程序中。在基础页面上,可以给ASP一个指示,让它不需要使用Session。将下面的代码直接加入到ASP页面的头部:


<%@EnableSessionState=False%>

  在Web服务器上缓存经常使用的数据。

  典型的情况是:ASP页面从后台存储中取回数据,然后以超文本标记语言(HTML)的形式形成结果。不管数据库的速度如何,从内存中取回数据要比从后台存储设备中快得多。从本地硬盘读取数据通常也非常快。所以,提高性能可以通过缓存服务器上的数据来实现,无论是将数据缓存在内存中,或者本地硬盘中。

  缓存是经典的“空间换时间”的折中方式。如果缓存得恰当,就可以看到显著的性能提升。为了让缓存有效,必须保证缓存数据是经常要重用的,而且也是计算起来繁琐的。装满陈旧数据的缓存是对内存的浪费。

  不经常改变的数据是缓存的较好对象,因为不需要随时考虑这些数据更新后的同步操作。组合框、参考表格、DHTML代码、扩展标记语言串、菜单以及站点配置变量(包括数据源名字,Internet协议地址IP以及Web路径)都是很好的缓存对象。注意:要缓存数据表达式而不是数据本身。如果一个ASP页面经常变化并且很费力去缓存(比如整个产品目录),就要考虑预产生HTML,而不是每次发生请求时再描述它。

  在Application或Session对象中缓存经常使用的数据。

  ASP中的Application和Session对象是在内存中缓存数据的便利容器。你可以将数据赋值给Application和Session对象,这些数据在HTTP调用期间将一直保持在内存中。Session中的数据是为每一个用户服务的,Application中的数据是所有用户共享的。

  何时需要在Application和Session中装入数据?通常,当应用程序启动或者会话开始时,数据就被装入了。为了在这时装入数据,在Application OnStart()或者Session OnStart()中分别添加适当的代码。这些函数位于文件Global.asa中,如果原来不存在,就添加上。也可以在数据首次需要的时候调入,在ASP页面中添加代码,检查数据是否存在,如果没有发现,就调入它。这里有一个例子,它代表了被称为“lazy evalution”的经典性能处理技术:直到需要,再去计算。


  拷贝经常使用的数据到脚本变量中。

  在ASP中存取COM对象时,应该拷贝经常使用的对象数据到脚本变量中,这样就减少了对COM对象的方法调用。这些调用要比存取脚本变量相对来说费时费力。当存取Collection和Dictionary对象时,使用这项技巧也减少了昂贵的查找操作。

  通常,如果要不止一次地存取对象数据,就应将数据放入脚本变量中,对象数据主要也就是Request变量(表单和查询字符串变量)。比如,站点要传递一个叫做UserID的查询字符串变量,假设它将在一个特殊页面被引用12次,那么不需要调用Request("UserID")12次,只要在ASP页面的头部分配给UserID一个变量,然后在页面中使用它,这样做就节省了11次COM方法的调用。

  在任何可能时使用Server.Transfer,而不要用Response.Redirect。

  Response.Redirect告诉浏览器请求另一个不同的页面,这常常用于引导用户到登录页面或者出错处理页面。由于重定向强迫了一个新页面请求,结果是浏览器必须要与Web服务器循环2次,并且Web服务器必须处理一个额外的请求。Server.Transfer执行在同一服务器上的页面传输,这将避免额外的浏览器-Web服务器的数据循环,形成良好的系统性能,对于用户也有较好的响应时间。当然Server.Transfer只支持相对路径(即站内使用)。

ADO组件之显示数据记录

学习ASP的万里长征就快到终点了:等把ASP的ADO组件搞定。当然这也是最重要的一步,几乎前面所有的学习都是为了这个最终的目的。OK,下面就来详细系统地来一一掌握,步步为营,各个击破。

  一,拥有数据库

  可以这么说:静态页面和动态页面最大的区别就是采用了数据库。有关一个WEB程序采用数据库和不采用的优越性比较,就不去细细分析了,主要精力还是放在如何使用数据库,如何熟练运用数据库,如何更灵活地运用数据库等等……其中运用操作数据库主要是对数据库内容进行:显示、插入、修改、更新、查询和删除。

  这些方法当然也不是一口就能吃出来的,要慢慢感受咀嚼、理解消化。当然首先很重要的便是先拥有数据库了。否则,一切都是空谈,巧媳妇难以无米之炊嘛。

  一般而言,我们所说的数据库其实就是一个数据库文件,该文件是由一些数据库管理系统(DBMS)建立生成的。目前一般的DBMS也就是常用常听说的ACCESS,SQLSERVER,MYSQL,ORACLE。当然一般个人站点,小型企业采用ACCESS完全足够;稍微大些的就采用同样是Microsoft公司的SQL SERVER或者是MYSQL,值得注意的是MYSQL一般是和另外一种网络编程语言PHP完美结合的。当然更大型的就采用ORACLE了。呵呵,曾经在学习PB时还运用到SYBASE数据库,UNIX系统的Informix数据库……DBMS简直是多如牛毛-_-!

  话说过来,目前我们就直接使用ACCESS了:1,使用简单;2,入门掌握容易;3,实在没有比这个更适合初学的了。

  一切还得从实际操作开始。

  1,打开ACCESS数据库,选择新建数据库,将其命名为cnbruce.mdb,并保存到一专门文件夹database中


[img]images/ado/1.gif[/img]

  2,在新建的数据库容器中双击“使用设计器创建表”,弹出的表1窗口中字段名称输入“cn_id”,数据类型选择“自动编号”,并选择上方工具栏中的钥匙按钮,将该字段设为主键。

  继续输入字段“cn_title”,数据类型选择“文本”;NEXT输入字段“cn_content”,数据类型选择“备注”;
  PS:备注和一般类型文本最大的区别就是备注允许插入的字段值相对要多些,这在插入一些较长文章的时候尤其重要。

  仍然输入字段“cn_author”,数据类型选择“文本”;并且切换到下面“常规”中的“允许空字符串”选择“是”。
  PS:这表面允许cn_author字段的值可以是空的,这在当提交表单,某些信息不填写但要正确插入数据库时,显得很重要。

  最后输入字段“cn_time”,数据类型选择“日期/时间”,继续切换到“常规”中的“默认值”输入“now()”函数

  末了,将“表1”另存为“cnartile”


[img]images/ado/2.gif[/img]

  3,双击打开cnartile表,填写第一行:“cn_title”输入“test”,“cn_content”输入“this is a test”,“cn_author”输入“cnbruce”,时间已经自动添加。完成!关闭表,关闭数据库。


[img]images/ado/3.gif[/img]

  二,建立数据库连接

  OK,数据库已经建立完毕,并且已经填写了一行信息内容。那么现在需要的就是同过ASP将该行信息显示出来。

  要想显示,首先还是需要ASP与该数据库文件建立连接,具体怎么建立?往下看。

  1,conn.asp:主要起的是连接并打开某数据库文件的功能。该文件建议单独存在,并且位置是和存放数据库的文件夹database处与同一物理层次。


<%
db_path = "database/cnbruce.mdb"
Set conn= Server.CreateObject("ADODB.Connection")
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path)
conn.Open connstr
%>

  db_path = "database/cnbruce.mdb",不用说,就是将数据库的相对路径赋到一个变量上,以方便下面继续调用。

  Set conn= Server.CreateObject("ADODB.Connection",和其它建立组件一样,建立了一个ADO连接,并用一对象conn来接受。

  connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path),很显然就是连接字符串了,其包括打开数据库的驱动方法OLEDB,和打开和哪个数据库的连接(即数据库的路径)。

  需要再次提醒的是:无论是FSO对文件、文件夹的操作还是ADO对数据库的操作,对被操作文件的取得都是获得的绝对的物理地址,一般情况之下,采用Server.MapPath方法相对较好。

  conn.Open connstr最后对象conn通过连接字符串connstr打开了数据库的连接。

  三,显示数据库内容

  建立了数据库,建立了和数据库的连接,下面水到渠成地就是将数据库中的内容通过ASP显示出来。

  2,showit.asp


<%
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from cnarticle"
rs.Open sql,conn,1,1
%>

<%
if rs.EOF and rs.BOF then
response.write ("暂时还没有文章")
else
Do Until rs.EOF
response.write("文章标题是:"& rs("cn_title"))
response.write("
文章作者是:"& rs("cn_author"))
response.write("
文章加入时间是:"& rs("cn_time"))
response.write("
文章内容是:"& rs("cn_content"))
response.write("


")
rs.MoveNext
Loop
end if
%>

<%
rs.close
Set rs = Nothing
conn.close
set conn=Nothing
%>

  简单调试本页,不出任何意外,相信一定能将数据库中的信息显示出来了。(PS:我的数据库中输写了两行)


[img]images/ado/4.gif[/img]

  下面就来具体一个一个解释来理解没行的含义:
  1, 没有任何争议,主要是调用conn.asp的所起的功效,这在解释conn.asp文件的时候已经明白。

  2,Set rs = Server.CreateObject ("ADODB.Recordset" ADO组件除了Connection连接以外,还有Recordset绑定记录集(相信用过DW做ASP的人现在开始有些重回故里的感觉了)当然 rs 可以形象地想象成数据库表中的某一行。

  3,sql = "Select * from cnarticle" 标准的SQL结构化查询语言。很简单:建立了数据库连接,也绑定了记录集,那具体需要哪些信息呢?也就是要筛选一些记录集合了,不过当前采用的是无任何条件,即可以提取所有。

  4,rs.Open sql,conn,1,1 真正地打开通向数据库中记录集的大门,具体有关后面的参数可以从如下网址中获得。

  5,if rs.EOF and rs.BOF then 该语句里面涉及到了rs.EOF 和 rs.BOF 以及两者的逻辑运算 and 。rs.EOF 表示到达数据库表中的最后一行,rs.BOF 表示到达数据库表中的第一行。整个语句可以理解为,如果当前数据库中的最后一行就是数据库表中第一行,那么可以肯定:当前数据库表中没有任何数据。

  6,
  Do Until rs.EOF
  ...
  rs.MoveNext
  Loop

  主要就是一个DO LOOP 循环语句了,其中循环的结束条件为:直到rs.EOF,即值得数据库表的最后一行。那么在这些条件满足的许可之内,就是来显示具体的信息了。

  每次循环只能显示数据库表中的一行,如果要继续读取下行,那么 rs.MoveNext 功能真是如此。

  7,rs("cn_title"等等 主要就是具体显示记录集中的哪个特定字段的信息值了。很是简单。

  8,最后不要忘了释放资源空间关闭记录集连接,关闭数据库连接。

  四,一些特殊条件

  1,有没有注意到,数据库表信息的显示一般是按照时间的先后排列的,也就经常提到的按时间的升序排列。需要注意:按时间升序,并不一定每个数据库表中都要有一个时间/日期类型的字段,只要存在一个自动编号的字段就可以了。因为该字段是永不重复,并且是依次增大的。因此,按时间升序其实就是按自动编号中号码数值的增加来进行排序的。

  当然,问题的关键来了,那就是要按照时间的降序排列,即始终从最新的内容开始显示。那具体需要哪些手术呢?
  很简单,将连接字符串稍做修改。

  由 sql = "Select * from cnarticle" 添加修改为sql = "Select * from cnarticle order by cn_id desc"
其中 order by cn_id 即通过cn_id字段,desc 即降序了。

  2,有是时候,只需要提取最前或者最新的几条信息,那这个又具体如何操作呢?同样还是连接字符串的修改。由 sql = "Select * from cnarticle order by cn_id desc" 添加修改为sql = "Select top 3 * from cnarticle order by cn_id desc" ,其中 top 3 就表示提取最新的三条信息内容了。

  That's All. 现在一个文章系统、新闻系统或者留言本显示部分的精华内容你已不费吹灰之力搞定。

  留下你的是:文章的格式可能显示不对劲,比如回车、空格都不显示了,那么你就还要学会处理接受的数据库表的值(在ASP的几个练习中提到的);文章不能老是打开数据库输入信息啊,那么你就要继续学会如何用ASP插入数据到库表;再有就是文章多了,一个页面看是不是很麻烦?那么你还要学会分页技术……


  

本文作者:佚名 来源:5D多媒体
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读