浅析ASP内置组件
, D. k9 V, t4 H% q2 b& G# l; c; @ Q2 p# ^' e& r2 C8 {4 a9 _: b
本文的内容是使用ASP的ActiveX Server Components(组件)。
" g! q, v) B, l1 S# T2 @7 o
$ n- a# B3 `0 D7 e* H: i+ U 一、 Browser Capabilities Component(浏览器能力组件):
) Y$ Z# R" N2 E$ p) V& k" v Q6 R, }) r! k c( e4 k- \1 m) I
我们知道,不同的浏览器也许支持不同的功能,如有些浏览器支持框架,有些不支持。利用这个组件,可以检查浏览器的能力,使你的网页争对不同的浏览器显示不同的页面(如对不支持Frame的浏览器显示不含Frame的网页)。 该组件的使用很简单,需注意的是,要正确使用该组件,必须保证Browscap.ini文件是最新的(其实每一个浏览器及其特性都列在这个文件中,自己打开看看就明白了),否则结果可能相去甚远,如Win98第二版所带的IE5.0,在下例中显示为Netscape。这个文件一般位于Web服务器的“\Winnt\System32\InetSrv”下,最新的版本可去
http://www.asptracker.com/或
http://www.cyscape.com/browscap下载。
. l9 k. i7 j% j4 Y- y) d7 \
1 L* P9 h, ?# l7 @, o" P+ M 例:wuf22.asp
6 T, ]1 e7 C& Y7 p4 A! e4 a6 [7 l3 S- c
. N7 X" N7 k( V4 K' v<html>5 L; ?; O2 {+ C$ ~: b7 a
<BODY>
6 J' R) d$ R$ V* ^% u" q2 F‘注意:组件的使用与对象类似,但是组件在使用前必须先创建,而使用内置对象前不必创建。
3 m" h* M- W* g! s/ d; `$ ?<%Set BrowsCap=Server.CreateObject("MSWC.BrowserType")%>2 T# I# `: F4 v- e
请稍候......
# U% ~3 m. I( m, i<P>
$ o8 R; k, t d! f" O<TABLE BORDER=1 CELLPADDING=10>4 o! ]; a6 l, j
<TR><TD>浏览器类型</TD><TD><%=BrowsCap.Browser%></TD></TR> y7 C4 u, w0 F2 t" O6 [
<TR><TD>浏览器版本</TD><TD><%=BrowsCap.version%></TD></TR>5 D: b) o8 @ o) ]
<TR><TD>是否支持表格</TD><TD><%=BrowsCap.tables%></TD></TR>2 E, q0 k3 b, K0 t! W! v
<TR><TD>是否支持ActiveX控件</TD><TD><%=BrowsCap.activexcontrols%></TD></TR>, G% B& i1 z0 y3 ?9 ]
<TR><TD>是否支持JavaApplets</TD><TD><%=BrowsCap.javaapplets%></TD></TR>* o9 z' L3 K5 ?1 i) Z; |
<TR><TD>是否支持JavaScript</TD><TD><%=BrowsCap.javascript%></TD></TR>. I7 X1 {7 s( y; S
<TR><TD>是否支持Cookies</TD><TD><%=BrowsCap.Cookies%></TD></TR>
$ B8 x* a4 u% ]1 }<TR><TD>是否支持Frames</TD><TD><%=BrowsCap.Frames%></TD></TR>
2 }+ ~9 @2 w+ T T7 K' R5 Q$ w& i<TR><TD>操作系统</TD><TD><%=BrowsCap.Platform%></TD></TR> \. o) Y: M% t: o4 R2 L- @
<TR><TD>是否支持VBScript</TD><TD><%=BrowsCap.vbscript%></TD></TR>
8 w* u, a, y8 J$ W7 B! o ?' q/ t% c</TABLE>" u( H: ]) S9 Z4 @
<%Set BrowsCap = Nothing%># n7 q9 c, b q' w' r% d
</BODY>7 k- q9 g" f" q( ]$ P0 g
</HTML> |
8 H' R& o; L) o7 A1 s
注意:在本例中我们也接触了Server对象的CreateObject方法,Server.CreateObject用于创建已经注册到服务器上的ActiveX组件(说明:还有其他方法可以创建组件)。不过别忘了用“Set 对象 = Nothing”来及时释放资源,这应该成为一个习惯。
; \, P2 U$ @! @" w二、File Access组件
; P) T+ h8 k$ ]8 |8 F2 |' K& A& i# P" w) P& C2 t
File Access组件由FileSystemObject对象和TextStream对象组成,使用FileSystemObject对象,可以建立、检索、删除目录及文件,而TextStream对象则提供读写文件的功能。
& @5 v* m) A" ?) q2 R1 `! u# I
8 q* o+ s5 z0 ?9 o; }- N9 S 实例wuf23.asp。强调:只有通过实践才能加深理解,实践和比较程序运行结果是快速掌握编程技巧的最好方法。
% A' M& b5 N$ j3 w6 o5 q
' B* J0 z) T( l<%@ Language=VBScript %>3 a {$ s ~# L3 V& \
<% Option Explicit' w. m# d0 @/ q& ^ G. H
' 注意绝对路径: C:\Inetpub\home\asp\wuf23.asp 主页路径: C:\Inetpub\home( m! u4 V7 x1 e4 f9 h3 Y3 w
Dim Path, File, FSO, CTF, Str, StrHTML, StrNoHTML' z5 q& O) d; G# c$ v4 b
& d" D" C4 ^4 ^' a% a3 e5 `
'使用 CreateObject 方法创建 FileSystemObject 对象 FSO
9 e' U6 }& Y, ~* r' o; T3 t. o0 LSet FSO = Server.CreateObject("Scripting.FileSystemObject") + d/ y. b7 Q$ M3 z, `5 z% E" h
2 O: Q1 D- T4 j' a2 l7 C% y
Path = Server.MapPath("test") '返回test的物理目录(绝对路径)
' r& C& y! Q' f' W'就本例而言, 下面这句与上面这句返回的Path完全一样
$ p8 a& d! d) l2 ['Path = Server.MapPath("\asp\test\") n5 @3 f4 |5 G/ u1 [
Response.Write Path & "<Br>"
5 J* m# L X/ S, H8 L8 f) D9 Z. g0 F; v9 T& C% L
If FSO.FolderExists(Path) = false then '判断该文件夹是否存在1 @ ^1 A- h1 ~# r* y$ E9 D
FSO.CreateFolder(Path) '新建文件夹1 M/ |) w2 z; X
End If 0 w, ~& H/ p" M4 D: a* U6 Y, G, ^4 H
W# l1 E* O% Z% G; _6 l( c; g3 MFile = Path & "\asptest.txt"
) H/ z, A/ [( O) Y' 写文件操作/ Z9 r+ W# u/ ^+ ]) ~0 O6 ~% @
If FSO.FileExists(File) = True Then '判断该文件是否存在$ s: W' H8 R7 ]4 g% p2 }
'建立 TextStream 对象 CTF
8 U/ z9 H W* QSet CTF = FSO.OpenTextFile(File, 8, False, 0) '打开文件, 详见说明$ w S) W* k: x" D2 Z$ z
Else
4 S6 u _5 C+ X% `0 v2 s' S; \Set CTF = FSO.CreateTextFile(File,False, False) '新建文件
8 Z$ u) [1 V* i( zEnd If
+ F( o' I7 {& JCTF.Write "<P>第一个字符串; " '写字符串
; e7 R( c3 A0 z7 s4 D! w& M4 ?4 pCTF.WriteLine "第二个字符串; " '写字符串, 并加上一个换行符: y* Z, m5 T! u+ ~8 n) Q
CTF.Write "第三个字符串; " }5 b2 ]4 w% k9 [
CTF.Close '注意要关闭文件 & o$ |5 u: x* T3 O9 H
' w8 m P7 Q, A" f4 _, `
' 读文件操作
+ b" x" @( X3 F, {Set CTF = FSO.OpenTextFile(File, 1,,0)
1 m8 o M" k% r% u( |Do While CTF.AtEndOfStream <> True '判别是否文件结尾(循环语句)
+ n) X$ M. P) m8 X4 LStr = CTF.ReadLine '(每次)读取一行! ~0 t# E, P. p. a$ ?" B
StrNoHTML = StrNoHTML & Str & "<BR>" & VbCrLf ! h: m4 b! x T- e/ F c& T6 R
StrHTML = StrHTML & Server.HTMLEncode(Str) & "<BR>" & VbCrLf9 b6 s! u- q G0 e! Z/ c
Loop$ m6 c+ h# J! I |' x: P( m. f! R( s
Response.Write StrNoHTML
" o9 S8 G. J+ ZResponse.Write StrHTML
, ]5 J9 W% _) _. E9 Q, w
- `6 k; {0 ]- CCTF.Close
7 f8 \ u! Z2 uSet CTF = Nothing '释放对象1 s0 v8 K5 u8 Z6 n; j" D
Set FSO = Nothing
7 k$ u& S# V4 t1 ^%> |
" l# J& s$ X# b CTF = FSO.OpenTextFile(File, 8, False, 0),括号内第一个参数为文件名;第二个参数为8,表示在原文件后追加内容,若为1表示只读,为2则会重写原文件;第三个参数false表示,若指定文件不存在,也不新建文件,若为True,表示指定文件不存在,则新建该文件;第四个参数0表示以ASCII文件格式打开,若为-2,则表示以原来的格式打开。
. c3 T3 ~, {/ p/ q% X
9 [# L3 W8 \; E$ v _8 S# H6 I( q# N/ E) [6 i CTF = FSO.CreateTextFile(File,False, False),第二个参数false表示不覆盖已有文件,若为True,则表示覆盖(OverWrite)已有文件;第三个参数为False表示文件格式为ASCII,为True表示文件格式为Unicode。
* q' _* U! b* M4 Y$ j
1 j5 P! Z# i0 a2 Y Server对象的MapPath方法将指定的虚拟路径转换为真实的文件路径。MapPath将“/”和“\”字符视为相同。
$ ^- n& X7 o. ]# w
. c1 F& ]) j. Z1 y3 }& V8 j& x2 W Server对象的HTMLEncode方法允许你对特定的字符串进行HTML编码,或者说使浏览器中可以正确显示特定的字符。上例中,若未编码,则“<P>”显示不出来,而是被浏览器作为HTML标记,你可以对比一下运行结果。
* l. O, [ u9 K9 b3 S* l# B) Y" W }+ V8 [; g2 b6 R0 U
实际上,File Access组件对文件、文件夹和驱动器的操作还是比较强大的,也提供了较多的方法,如果需要用到这方面的知识,别忘了使用它。
1 H# {" Y) t9 ?5 l
* `$ P% `- T* [4 D) [1 G 另外,到现在为止,写一个网页计数器已经是小菜一碟了吧,难怪那么多的网页提供免费计数器。怎么样?自己写一个图形计数器试试看,想怎么作弊就怎么作弊,完全自己说了算,爽呆!(小秘密:我的主页上有实例wuf24.asp)
2 u( ^1 O4 g. [& ~% o" C三、 AD Rotator(广告翻转组件)
' c( z9 m% W( Y& P
$ y: y) t% q: v& }/ D- L 现在上网,恐怕最讨厌的是别人主页上的广告条,最喜欢的是自己主页上的广告条,广告条如同垃圾邮件一样,比比皆是,防不胜防。你也可以自己动手制造这样的垃圾,ASP的AD Rotator组件就可使每次打开或者重新加载网页时,随机的显示广告。这个例子包括三部分:
* o/ W" ]# k) V9 p" M& F5 {# \( r$ K/ ~3 |- C" E
例程wuf25.asp
9 v# m" j1 I X
, g; B9 [; g o4 ~+ q& M
<%@ Language=VBScript %>: S1 j6 U4 m: W9 o: k
<% Option Explicit
# \4 {' v$ e! O E. v) MDim adr
* k+ [" X( l7 O! H0 T'创建 AD Rotator 对象4 i) D( k K, M6 T4 |+ r. j3 F
Set adr = Server.CreateObject("MSWC.AdRotator")6 m' K5 H, Z% y7 o5 o$ x. K. M
adr.Border = 2 '指定图形文件的边框大小
3 X7 O' i# H) eadr.Clickable = True '指示显示的图片是否是一个超链接; P5 ^! d$ R+ I2 J" ]
adr.TargetFrame = "_blank" '设置超链接是否要指定Frame名称,如: _TOP _NEW _PARENT
8 B% {; ]% a: z'获取将要显示的图片及超链接设置 - 在文件 AdrSet.txt 中设置5 P! T0 e4 R8 P# E
Response.Write adr.GetAdvertisement("AdrSet.txt")
4 a6 }+ [ X7 N4 s0 w%>
+ L. v; j, v! a7 j$ ~8 p O- nAdrSet.txt内容(后面为注释,不是这个文件的内容):
( k/ z5 [3 o8 P* ~! T0 RREDIRECT wuf26.asp 点击广告后,转由wuf26.asp来处理
; s) |6 u' W! H" `1 P( | X* GWIDTH 468 广告图片宽度. \& ]6 U0 I E
HEIGHT 60 广告图片高度
5 m2 @: I+ w f% u! o9 M0 R* 分隔符
# a) D/ X h# w5 V( w6 ^5 R+ V1 A t( W 广告图片所在位置,也可为本地图形文件
) m8 f( }7 [* x0 {& whttp://www.163.com/ 指向链接,若没有超链接,写入一个“-”
% D' P, o" q0 e9 \* E3 C7 m网易 文字说明
7 N# Y: N' H c/ c20 显示该广告的相对权重,即显示频率$ Q9 @* W! H/ W, S& ~/ N5 n$ B( q

: D; m' U7 d0 D3 D+ _( ]http://www.sina.com.cn/
) z4 v2 s, `' Q6 @3 i新浪网/ j: h9 k0 U6 ? l# N6 ^7 ]* Q
30
2 G/ x6 V8 m, \, q. E% ~7 L O( D# N* O 也可以使用本地图片,如../images/flag.gif
' N. z4 V% K# F4 u9 E/ xhttp://www.canon.com.cn/
1 C) h$ T% d- E/ T佳能
6 ]+ x! w* ^0 N0 y) t& {50 |
2 V* u. `* I5 b& s
本例中一共有三个图片(图片大小468X60)及链接,每个链接的描述占四行,实际使用时,你可如法炮制,增加更多的图片。
4 Y1 h& N8 \7 s8 y' [, n- J& x8 j l \: A. N7 a) c4 V, V1 @
<% ‘wuf26.asp
6 K9 O# x1 d' n6 dURL = Request.QueryString("url")
3 S5 D3 a, @4 x, vResponse.Redirect(URL)
7 R# _7 M/ c# z4 I* [%> |
7 e$ {4 ^9 C$ i9 y& D wuf26.asp是一个最简单的处理程序,你可根据实际需要在这里加入更多的代码。
' m8 {, v/ |( b7 \+ C) A
运行一下,原来这个组件的使用也很简单,你要做的就是得到自己的AdrSet.txt文件。利用这个组件,你甚至可以设计一个现在已非常时髦的广告交换主页。
8 A7 E( m% Z8 U! E, ~3 i% a四、 Content Linking组件
; p6 Y. @! J3 x0 k# n% }( {9 J( E% k# d3 n
显然这个组件与链接有关系,如果想马上知道这个组件的具体用途,恐怕还操之过急,不妨先引用一个经典的例子:假设在网上阅读一本书,你对以下这些链接一定不会陌生:第1章、第2章、…、上一章、下一章(或前一页、后一页)等等。我们现在要做的就是如何在这些链接之间方便快速地设置跳转。
8 t$ ^6 V' w) r: [2 y
! k/ R/ z+ @% W/ b: L 首先建一个链接列表文本文件,如urllist.txt
( A u# B8 c+ c" f7 o( |" T, j
: J: _# _) Z" E; R# _5 Awuf23.asp :文件操作(File Access组件)
# o# Q Y! v3 h
wuf28.asp :Content Linking组件使用示例
+ Q; D$ @5 o5 o/ E1 q& j, awuf22.asp :浏览器能力组件
8 t* w$ A( ], D! {6 }
" C; v8 z( X7 r" u: a' @ 链接url地址和描述之间用 Tab 键分隔。下面wuf27.asp用来列出urllist.txt中的所有链接。
( l* O2 O+ E5 k) N9 {- `
; C2 k. Y( w. r! a
<% @LANGUAGE = VBScript %>
$ I2 v$ n0 F/ }7 {8 M6 f- n<% Option Explicit %>
' S, c: U& E/ b- ]/ z1 u1 h<html><head><title>Content Linking组件使用</title></head>
. L& J- g7 I( n7 {% c<body> 6 q7 e( b0 u7 z, e. z6 I
<h2>目录列表: 注意核心链接是第2章, 你一定要点击它</h2>: F+ t9 } l* M, a9 V
<ul> A, c) ?' f4 |
<%
2 Y, q2 @: |1 p( ADim NextLink, Count# f( B/ f$ {1 `8 Z
'建立 Content Linking 组件
0 u* Z% `5 u z, b+ vSet NextLink = Server.CreateObject("MSWC.NextLink")
6 z6 f& J- F8 ], ^9 q. f" A2 c' P6 ]/ _5 j6 N% `! W: s
'获取文件 urllist.txt 中链接数目
3 G- a+ _) M6 VCount = NextLink.GetListCount("urllist.txt")
/ |& z8 Q, ?& Q1 t
$ n( I! b* `$ ~+ C0 wDim url, Dscr, I
# T" x; t' o2 ^" X m" HFor I = 1 To Count
4 w, v" [2 Z# g; a: w, u8 E- nurl = NextLink.GetNthURL ("urllist.txt", I) '取得超链接# S6 I: [; U: A' z7 e# u; o
Dscr = NextLink.GetNthDescription ("urllist.txt", I) '取得文字描述8 [; r9 T( M/ O
Response.Write "<li><a href = """ & url & """>" & Dscr & "</a>" & vbcrlf
( N _" j/ w1 q9 [! T7 ~Next4 N+ }# E8 Z' ]* o: w
%> # m! X' j! C( a4 u* P: k
</ul></body></html> |
% j0 K2 L4 S! H8 s0 q 然后,以wuf28.asp为例说明如何自动实现上一章和下一章跳转。
8 R ] b) _% a+ w/ T
" Z0 w$ @$ J6 D( J, j; b3 H% k<% @LANGUAGE = VBScript %>
0 y' _! B( \5 P* z: \<% Option Explicit %>9 c. n6 A6 H' d7 `1 E' Y
<html><head><title>这个链接要注意</title></head>. ^2 @5 E6 n/ j7 y* K
<body> ( y. W5 u5 |8 F; C& Y
# t) y! H3 W c% d; N0 F- V% i8 D
<p>这里是第 2 章的正文............</p>9 J' G/ o6 `: \! i
8 y7 }/ |$ o" Y; ]4 h( Y# k
<% '每个文件都包含下面这句, 就实现了自动链接%># o; Z9 `* @8 D0 r/ P. b$ J3 N+ s3 c
<!--#include file="wuf29.asp"-->1 s3 W- D& A: k5 t% L; k
</body></html> |
" V/ C: u* n, ~9 ^+ B7 L
这里最后一句加上去就可以实现自动跳转,核心在wuf29.asp中。
+ b3 ^" H. Q6 k( E" W+ O. ]4 m" t. f
<%
+ {9 n% l2 J$ HDim NextLink, rank2 I6 j _ _+ b6 K
Set NextLink = Server.CreateObject ("MSWC.NextLink")
; p: M4 {: i/ \, x0 w0 e$ P'当前的链接在 urllist.txt 中位于第几个
' G' h( Z; U* orank = NextLink.GetListIndex ("urllist.txt")+ X1 R% Y% B2 Y1 q: d9 ^
Response.Write "<hr>": @ L G0 M: r' i+ s6 E* e
) x$ s9 `* B9 F* x+ e8 [ C6 v+ n4 r. }If (rank > 1) Then 'rank = 1 不存在前一页
; |* N- P4 _0 z* }9 [Response.Write "|<a href=""" & NextLink.GetPreviousURL("urllist.txt") & """>上一章</a>|"
/ S) p& r' B1 MEnd If 9 a( ` e% T0 R5 a6 P. x% r( v
- K( w/ Z5 b2 r) R8 l* C: cIf (rank < NextLink.GetListCount("urllist.txt")) Then 'rank在最后, 则没有下一页. V( d8 M: t' s- }: a6 }$ K
Response.Write "|<a href=""" & NextLink.GetNextURL("urllist.txt") & """>下一章</a>|"
3 @9 q- M% {( lEnd If, w$ e* Z$ v' V5 N* f" D
%> |
4 P* D1 O8 Q% b8 k 运行这个例子后,你马上能真正理解这个组件的作用,简而言之,就是不需要在每页都写一个“上一章”、“下一章”,完全通过wuf29.asp一下搞定,是不是很方便?!不然你要是手工修改链接的话,不是太麻烦了几点吗?
. a% p# H" }- q. y9 K: j, F+ L/ o% |9 k
( ^( [& K' ~9 X& e e 现在你应该明白了,网上大量的免费计数器、免费留言板、免费聊天室、广告交换网等等……,其原理都不过如此,大可不必崇拜
5 }+ I+ |" u& n a x5 F- Mzmbbs=1;