懂asp(active server pages)的人很多,但能用asp自如地调用activex控件的人却不多;如果不调用activex控件,则可以说微软当初设计asp的初衷根本没有达到。众所周知,activex技术是微软在internet上除了ie外的另一个新举措,可以说该技术渗透在它的整个internet策略中。activex是一个功能强大的部件,可以用vb、c或c++等语言进行编写,因为是编译性执行,故速度比较快。 在asp(active server pages)中内建了多个功能强大的activex server控件,包括ad rotator(动态广告生成控件)、browsertype capabilities(浏览器相容控件)、database access(数据库存取控件)、content linking(文件链接控件)和file access component(文件存取控件)等。当然,asp除了可以调用内嵌的activex控件外,还可以调用其他用户编写的标准的activex控件。
在使用控件前先要进行定义,如:<% set对象变量名称=server.createobject("adodb.connection") %>,或直接用html的<object>和</object>标记进行定义,效果一样。
例:<object runat=server
id=对象变量名称
progid="adodb.connection">
</object>
定义好后,我们就可以开始调用它的方法来配合相关工作的进行。
一.内嵌各种activex控件的方法和属性
1.database access(数据库存取控件)
这是一个非常重要的部分,因为50%以上的工作几乎都要涉及到数据库,使用该控件可以说是必不可少的。在asp中使用ado(active data objects)来存取数据库资料,如果是远程的数据源,则可采用rdo(remote data objects)。ado包括以下七个对象类。
command:定义一些特别的命令语法,让你可以执行相应的程式。
connection:提供对ole db信息源的链接。
error:用来描述存取数据库时发生的错误。
field:以行作为读取信息单元。
parameter:使用command时需传入的参数。
property:记录ado对象的动态特性。
recordset:用来保存读取回来的数据库信息。
下面以一个最普通的例子来说明读取数据库信息、然后发布该信息的步骤。首先在odbc driver里建立一个名字为test的system dsn,链接到你的任意一个数据库上;然后用写字板创建一个后缀名为.asp的文本,内容如下。
<html><body>
<%
set dc=createobject("adodb.connection")
;定义一个dc为connection的对象
dc.open "test"
;open是connection的一个方法,如果你链接的是access或foxpro数据库,则可采用上面的方法,如果是其他类似于sql、oracle等需要用户名和密码才允许访问的数据库,则可通过dc.open"test","uid","password"来打开数据库源。
sql="select * from job"
set result=dc.execute(sql)
;execute是connection的另一个方法,用于执行sql语句。这里定义result为recordset对象,用于接收sql语句执行后的返回结果。如果不需要保存返回结果,则可直接调用“dc.execute sql"。
do while not result.eof
response.write result("name")
;假设name是数据库的一个属性。
result.movenext
;除了movenext外,还有movefirst、movelast等方法,与vb类似。
loop
result.close
%>
</body></html>
从上面的例子中,我们可以清楚地看到,链接ole db信息源最常用的类是connection类,其方法包括open、execute、close、begintrans、committrans和rollbacktrans。如果你很熟悉sql script中的回滚操作,那么对begintrans一定不会感到陌生,最后三个方法是用于对一些事件进行回滚的操作,其语法如下(要补充的一点是,如果你能在数据库里完成回滚的操作,那么最好在数据库里进行,因为这样效率会更高,对系统的影响也就会更少)。
begintrans
语法:[level=]connection 对象.begintrans
其中level是一long类型的变数,用来存储begintrans方法所传回的level值。
committrans
语法:connection 对象.committrans
存储当前的所有动作和结果。
rollbacktrans
语法:connection 对象.rollbacktrans
取消所有从begintrans开始的工作并重新进行初始化。
这里只对最常用的connection类进行了详细的介绍,如果希望进一步了解database access其他类库,可访问http://www.microsoft.com/ado/站点。
2.ad rotator(动态广告生成控件)
广告在网络上的效果越来越为人们所认识,“网盟”(webunion)就是一个很好的范例。一个好的广告发布程序并不容易编写,因为你要考虑包括图片出现的频度、图片的名字、链接的地址、显示的尺寸、还有速度、效率和维护等诸多的问题。当然,如果你们是一个象webunion这样的大型站点,则这是必须的;但如果你们只是一个小站点,只是希望简单地动态显示一些图片(包括链接)和方便维护,那么ad rotator动态广告生成控件绝对是你的首选。
为了使你有一个直观的认识,我们将先介绍建立动态广告的步骤,然后再细述其方法。产生动态广告,要涉及到三个文件:主文件main.asp、文本文件info.txt、副文件redi.asp。
main.asp为要显示广告的页面,内容为:
<% set ad=server.createobject("mswc.adrotator")%>
<%= ad.getadvertisement("info.txt")%>
第一行是创建ad rotator类的对象,第二行用于取得广告资料。
info.txt是广告的资料,内容为:
redirect redi.asp
width 400
height 60
border 1
*
1.jpg
http://www.gznet.com
广州视窗
20
2.gif
http://zyr.yeah.net
网络新地带
30
第一行表示当用户点击图片时,系统自动调用redi.asp程序,下面依次为广告的宽度、高度和边宽,再下面为图片的名字、链接的地址、广告说明(在html中的标记为alt=...)和显示的频度。
redi.asp是当用户点击图片时,系统需调用的文件,它只做一个redirect的工作。内容为:
<%response.redirect(request.querystring("url"))%>
整个编写和维护工作都非常简单。如果你希望增加、减少或修改某些广告图片和链接地址,只需修改info.txt文本文件即可。ad rotator类有三个属性,border(指定广告图片的边宽)、clickable(指定该广告图片是否提供链接功能)、targetframe(指定点击超链接后的浏览页面)和一个方法getadvertisement(读取广告信息)。如果你采用了信息档案文本(txt),就不需要考虑ad所提供的属性了,如前面的例子。
3.file access component(filesystemobject,文件存取控件)
该控件主要用于读取unicode或ascii码的文件,包含的方法如下:
·createtextfile
建立一个textstream的对象,并指向实际操作的文本或希望建立的文件名及目录,如:
set file=createobject("scripting.filesystemobject")
set f1=file.createtextfile("c:\test.txt",true)
;true表示允许覆盖,false表示不允许覆盖,这里缺省了一个参数unicode,缺省和false表示建立的文件是ascii格式,true表示文件为unicode格式。
f1.writeline("你好!")
f1.close
textstream对象具有以下方法(即上文中的f1)。
close:关闭对象
read:读取已打开的文件资料,带参数指明希望读取的字节数,如:f1.read(characters)。
readall:读取已打开文件的全部信息(返回字符串)。
readline:读取已打开文件的一行信息(返回字符串)。
skip:跳过已打开的文件信息,带参数指明希望跳过的字节数,如:f1.skip(characters)。
skipline:跳过已打开文件的一行信息。
write:把资料写入到已打开的文件中,如:f1.write(string)。
writeline:把信息写入到已打开的文件中并换行。
writeblankline:把空行写入到已打开的文件中,带参数指明希望写入的空行数,如:f1.writeblankline(lines)。
·opentextfile
打开一个已存在的文件,并建立一个textstream对象。
语法:[object].opentextfile(filename[,iomode[,create[,format]]])
参数说明:
object:自定义的filesystemobject对象名称。
filename:希望打开的文件名称。
iomode:可选参数为forreading(读取)或forappending(编辑)。
create:指定如果文件不存在,是否自行建立,true表示建立,false表示不建立。
format:可选参数为tristatetrue(以unicode方式打开)、tristatefalse(以ascii方式打开)、tristateusedefault(用文件缺省形式打开)和缺省时以ascii方式打开。
4.content linking(文件链接控件)
该控件用于管理一些超链接信息,例如:我们经常会在html文本中有一些友情链接,指向其他站点,如果我们在多个页面上有这些信息,修改时就需要做多次修改。使用了该控件后,所有这些链接信息都可放在同一个文本文件中,修改时只需对该文本文件进行修改。其方法如下:
getlistcount:计算url列的总数。
语法:getlistcount(文件名)
getnexturl:读取下一个url链接地址。
语法:getnexturl(文件名)
getpreviousdescription:读取前一个url链接的描述。
语法:getpreviousdescription(文件名)
getlistindex:获取当前资料的索引号码。
语法:getlistindex(文件名)
getnthdescription:获取当前索引号码的超链接的描述。
语法:getnthdescription(文件名,索引号码)
getpreviousurl:读取上一个url链接地址。
语法:getpreviousurl(文件名)
getnextdescription:读取下一个url链接的描述。
语法:getnextdescription(文件名)
getnthurl::获取当前索引号码的超链接地址。
语法:getnthurl(文件名,索引号码)
调用该控件,可用下列代码:
...
<% set link=server.createobject("mswc.nextlink")%>
<%count=link.getlistcount("link.txt")%>
<%i=1%>
<%do while (i<=count)%>
<a href="<%=link.getnthurl("link.txt",i)%>">
<%= link.getnthdescription("link.txt,i)%>
<%i=i+1%>
<%loop%>
...
link.txt的文件格式如下:
www.gznet.com广州视窗
zyr.yeah.net网络新地带
5.browsertype capabilities(浏览器相容控件)
通过asp的server内嵌对象可以获取如ip地址等客户端的信息,但如要获取如客户端浏览器是否支持activex控件、背景音乐等客户端浏览器的详细资料则只能求助于browsertype控件。该控件通过把客户端的请求报头与browscap.ini文件进行比较,得出客户端浏览器的详细资料,通过读取该控件的属性可以获取相应的资料。
属性:
activexcontrols:是否支持activex controls。
backgroundsounds:是否支持背景音乐。
beta:beta的版本。
browser:浏览器名称。
cookies:是否支持cookies。
frames:是否支持frame。
javascript:是否支持javascript。
platform:客户端平台。
tables:是否支持table。
vbscripts:是否支持vbscript。
versions:版本名称。
二.如何调用用户编写的activex控件
调用一些free或用户编写的activex控件是asp一个非常重要的高级应用,下面将用一个例子具体描述其调用步骤。因特网上最常见的就是下载功能了,而上载功能却不是每个站点都能提供。上载就是通过浏览器把客户端的文件传到服务器上,该例子就是一个实现上载功能的应用。为了简单起见,这里利用一个free的ftp activex控件(当然也可以自己编写)来实现该功能。该控件名称为aspinet.ftp,可从http://www.genusa.com/asp/站点处下载。该例子含两个文件,一个用于完成客户端选取文件的功能(select.html)、一个用于完成接受信息流的功能(receive.asp)。
1.安装该控件
1) 解压
2) 把dll文件移到系统的相应目录下(如:\winnt\system32 for nt),并修改系统注册表;如果不是很熟悉系统注册表的修改,可执行以下命令,系统会自动完成所有工作(你的系统需要有wininet.dll文件)。
regsvr32 aspinet.dll
3) 运行markinet.exe,使注册表中所修改的信息生效。
2.select.html
<html>
<body>
<form method=post action="receive.asp">
客户端的文件名:<input type="file" name="cfilename" >
<br>
上载到服务器后的文件名:<input type="text" name="sfilename" >
;你可通过网页输入希望上载到服务器上的文件名称
<br>
<input type="submit" name="submit" value="确定“>
</form>
</body>
</html>
3.receive.asp
<%
cfilename=request("cfilename")
;读取客户端的文件名及路径
sfilename=request("sfilename")
;读取希望上载到服务器上的文件名
ftp_transfer_type_ascii = 1
ftp_transfer_type_binary = 2
set ftpconn=server.createobject("aspinet.ftp")
;创建ftp activex控件对象
if ftpconn.ftpputfile("ftp服务器地址“,"anonymous", "user@hostname.net",sfilename,cfilename,ftp_transfer_type_binary) then
;参数说明:依次为ftp服务器地址、使用者名字、密码、server端文件名及路径(相对于ftp根目录而言,该例子使用缺省目录,即ftp根目录)、客户端的文件名及路径、传送类型(ascii/binary)
response.write "<p>ftp upload success...<br>"
else
response.write "<p>ftp upload failed...<br>"
end if
%>
如果你已经熟练地掌握了asp各内嵌对象,包括activex控件的使用方法,则一般的应用对于你来说已不是难事。但要提高开发效率,则必须充分利用微软提供的asp开发工具interdev配合开发。