关于Asp代码与页面的分离

上一篇 / 下一篇  2008-06-10 14:02:46 / 个人分类:ASP

L9fN%pc0为了避免ASP程TML代码混写造成维护困难的情况,本文介绍了一种方法,利用模板来分离程序和页面,使程序设计更加轻松。51Testing软件测试网]Wg^ TP

k0xz JS'i+g4D$jt K0在使用ASP制作一个站点的时候,常常会出现一个ASP文件中,程序代码和HTML代码混合的情况。这样子做有许多缺点51Testing软件测试网 x1`'\ Fv.|'u m

? Z^ \ss0Z(W;I051Testing软件测试网R6}Uz/E,kpL(i

5h/@Qk&LZ m01.且不说编程时就要对页面布局进行设计和编排,造成代码混乱难懂,不规范;51Testing软件测试网{J?]&L&fO LLu

51Testing软件测试网:vc(@~"hn

2.当需要改变页面外观时,你不仅要改变HTML部份,也需要改变ASP代码,不易维护。

3e*q8mN5Vu}0

Cb*J}x\/a w#~051Testing软件测试网^,A&u}!DFCa

:U2X n4k4Wt0那么,要如何才能避免这些麻烦呢?

w`.{ f8tKG(K0

Ht6b6\kAM4k0答案就是使用模板文件,将ASP代码和HTML页面分开,一切问题就都解决了。使用模板有以下好处:51Testing软件测试网]*Fi#{-R

51Testing软件测试网^w}1x/nPD'Q1O

1.在很短的时间内可以替换整个站点的外观;

aA9{ M5LAl{051Testing软件测试网[ahF0J%ZHd

2.使程序员可以抽象编程,而无须接触HTML代码;

"WMf,qq,yb4[)OM0
51Testing软件测试网s-uZADY

51Testing软件测试网$Ia-FYdF&b@

~M#`S,s"[ T03.可以重复利用以前的模板。

0g `T@%UA*\2J0

9B!O[n#P8u;{051Testing软件测试网&IQ8q2vuo R

)UV i\/trG%j0使用过PHP的程序就会知道,PHP有个模板程序(FastTemplate),现在的问题是如何在ASP中实现类似的功能。51Testing软件测试网-l;]*Tm{_

w L&`ZX051Testing软件测试网`6c1_te!H"f,W K

&MwZ5Y,C'f1W3G }051Testing软件测试网fA(PICZ'B

Microsoft的ASP带有两种脚本:VBscrīpt和Jscrīpt。它们都带有一个正则表达式对象(RegExp),利用字符串对象和RegExp对象,就可以轻松的实现模板功能。沐枫以此编写了一个Template.Jscrīpt.INC文件,此文件的内容附在文章后面。有能力的读者可以根据自己的需要进行改进。51Testing软件测试网9]t,T.{| |

*D U3I Ch?.Lzi051Testing软件测试网`Z D[Zs J

E*mm~ k8T8?F0IP0

:X k.U:S\6T_0下面介绍一下使用方法。由于此文件是使用Jscrīpt编写的(当然要转成VBscrīpt也很容易),因此,缺省脚本语言要设为Jscrīpt,即ASP程序第一行应为:%@Language=Jscrīpt%,然后再包含模板程序文件:!#includefile=Template.Jscrīpt.INC。51Testing软件测试网ol1L#nt-| |;L o|

n+rC6^ U$x7a051Testing软件测试网F_)|_ a,pp

$_M#_l5Y?3ug f%Y/A0

3md)C'|8Sdl h0先介绍一下Template类的使用:51Testing软件测试网 z5Td.KY e

51Testing软件测试网4h5v7[Y0^

1.建立Template对象:Template(Path)51Testing软件测试网p g Bi3f&Nh

MU*K2Q c7w0c2j5q+C i0

1nBT W3uI.Y051Testing软件测试网5vs({+X"Q

参数:Path(字符串类型)HTML模板文件的存放路径。51Testing软件测试网KfZ/E#X!O*U2I}

51Testing软件测试网3hG&c9u#V)a

使用new操作符建立Template对象。

n^_~M"N y A9Y-?0

NMy Ju4MMbv S0例子:51Testing软件测试网s2|+\*}8Ay%T Ey;L

.iavJ*tz_3~0vartpl=newTemplate(c:\template);

n:a+fJV \#|-t0

QG5NW*_3j/ZuMqQ0在程序中可以用tpl.TplPath来取得模板路径,也可以通过tpl.TplPath来改变模板路径。51Testing软件测试网 T+]z Vg djHx$e

JPP3v&vmu)@+J3uB$yH0

l9l5[D)Wwl"~:j0

A&t D9g/b/E/U.p051Testing软件测试网,gPtC4S)W3N;RBb

如:51Testing软件测试网&v g!rg.uyB+?s

$|B"wuF{c},t051Testing软件测试网#AGaK;k;K

pl)}({ l9DnHPhW4W*]0

`/UQH+W!v H~7yI0tpl.TplPath=d:\template;

O/a;VZq0

6Y/\/c p;J9[02.装载模板文件:Template.Load(Name,File)

,Z%x,z? mP9PiFy0

51Testing软件测试网)NEkWqe/l0Aoc G

4c]2fv Rh051Testing软件测试网*~%}0nn%\L GA)W

_~%zsV}0参数:Name(字符串类型)是一个模板变量名。51Testing软件测试网 Su#s B?A,C6b

v&Hb'QNf h0File(字符串类型)模板文件名。此文件存放在HTML模板路径下。51Testing软件测试网 W5w2d:g)V$g rar8E

/W]%U;WB7I~&t0读取文件File到模板变量Name中。51Testing软件测试网 |OL3C)iT

mw{DFOC0

]Q)OE.Z@n x j0

;kWjd+m0

b.b3c"]6MOy0例子:51Testing软件测试网4h6\)f/ILWe4r

51Testing软件测试网G N Y+T.~d

v6CxO+p` S0

[8tP X|6}1D4};S!P*lu0tpl.Load(Main,TEST.HTM);

Wi+d7\pk0

"Tg p*F*q o051Testing软件测试网I-ZW+u3} p2|kR,Q,f

?S$^9s)AxC T_-z0此时,模板变量Main就包含了文件TEST.HTM的内容。

2n Yy.H c ^i4Y051Testing软件测试网d&hH0V1s t{

你可以用tpl.Main来访问模板变量Main。51Testing软件测试网#rt)kp"R,~$wL

o UOP9W9p0FA051Testing软件测试网_IS(xtd(L}+|

51Testing软件测试网[8]"W+G7f-nD a6y

51Testing软件测试网F#dz-h1[#J9bB9l

例子:51Testing软件测试网\h}S4@m-Q_Vq

L+w"RgPS)Q0%=tpl.Main%51Testing软件测试网?D:?u |6R JM c

51Testing软件测试网ax9hp _Z @

将显示刚才读进来的TEST.HTM文件内容。51Testing软件测试网.LMUGx

{-m'zD*aIZ V03.模板分拆:Template.Split(Name)

3e0I4_9`G anu0
51Testing软件测试网X%d8}Cgif6[*h;~

51Testing软件测试网r~YPkIt1Gb

C#kU3H"A E q0参数:Name(字符串类型)是一个模板变量名。51Testing软件测试网5RN4G`9k FgQ

51Testing软件测试网3S hyTV\Vb7y

将Name中的子模板分解。

2R3P0Sb?1iW0

51Testing软件测试网-x&c*|Y"~+tT@-?

51Testing软件测试网E ko9i{9?&{3\!_

51Testing软件测试网J/f%~[%c dRM5V

51Testing软件测试网j,k YSM

例子:

l2QfMu0

51Testing软件测试网 ~%vO-E3M7a

51Testing软件测试网 v&pcHga

51Testing软件测试网NSbxj~ S9UR2J

`/fUs5tZ0先假设上例中的TEST.HTM内容为:

!L/m x"Vmu?zM \051Testing软件测试网,}S ja2t&q"T7Q

这是主模板。接下来是:!#TPLDEFSUBSUB子模板,还有

;^!JZC&PY#f*o/^Boy$b0

DJ(ba.z`t&x051Testing软件测试网3J:CJS8T }x

51Testing软件测试网CUX"`Z

X3^)E3kX`dQJ0!#TPLDEFTHIRDTHIRD模板。!#TPLENDTHIRD51Testing软件测试网*xRW#ZS~#T

u p$RpO!T4]O1U0!#TPLENDSUB

ElYd%e5R/P0
51Testing软件测试网(q2O8`+Ki\'z

51Testing软件测试网`G6l,Qx#X`}@

51Testing软件测试网#U0g0l|f4_ _6_

那么:

b@9sV4IV1}N8E0

^X3{)R#o0

l#bdK [8Z0H;~M I)?y051Testing软件测试网W!e}/N C+~ i,K

tpl.Split(Main);51Testing软件测试网}8~|SL

51Testing软件测试网)L3q Q+Ck u/C

VR'h(q3\051Testing软件测试网:xy*cd]*y;O,p-q

51Testing软件测试网_6F2[^*z/\

执行以后,就会生成新的模板变量SUB,和THIRD,它们的内容就是!#TPLDEFSUB和!#TPLENDSUB之间语句。51Testing软件测试网/T [#O%}7NMI`

'? wRL;?p$i0而且Main模板变量的内容也会发生改变:

4t j WVf+N0
51Testing软件测试网K Q q@ \sZ!q

vv'U0tN3p!e |[0

S0q+Sf3CH k!F+P,q0tpl.Main的内容为:这是主模板。接下来是{SUB}

,u iN RP!SE cX0
51Testing软件测试网"D#e:P$O6|)@5c n/pT

51Testing软件测试网%v-F9{ }CV!_

niFf AB0tpl.SUB的内容为:SUB子模板,还有{THIRD}

{A8ve6w*Zwk#a9[0
51Testing软件测试网:F;Z+r[2o9xJuh

}]/di*SAK*j7dL${051Testing软件测试网 wu?@[&]s*|

tpl.THIRD的内容为:THIRD模板。51Testing软件测试网%y3@v"I7~PDR

-@-_f+@w!D0X6h%Yw%va.V;W051Testing软件测试网h1@Z5WfA3J

51Testing软件测试网0Ppm_'D}

51Testing软件测试网&gFd#E_8^I

TPLDEF和TPLEND定义的语句块充许多重嵌套。51Testing软件测试网 o L_3s6eid

51Testing软件测试网H#v0S'@5qEw wu ~

J!P,J'GQ051Testing软件测试网H*vf&K-c_0N*q

4.模板处理:Template.Parse(Name)

;REK dh2x.K051Testing软件测试网7W(e/mL"Vr$H

参数:Name(字符串类型)是一个模板变量。

J z.b?%y1rnf0

51Testing软件测试网 C-K7flq-C$j

4xS9M[)O0

~f*`'x nx051Testing软件测试网,_'wG5p)dz$A2E

将模板中用花括号括起来的字串用同名的模板变量的内容替换。51Testing软件测试网sX8]!C;rI}

UJgj a9n0例子:续上例

C;{I? L U{LM051Testing软件测试网 W6x[N8]_)S%F6s(g

%=tpl.Parse(Main)%51Testing软件测试网+]B Zwp@'U5Xn

4J-g!z$ws(LGmB`"W0显示:这是主模板。接下来是SUB子模板,还有{THIRD}51Testing软件测试网3\,UG$@z/Ij#F

51Testing软件测试网(w_;W*Y~

由例子可知,Parse只替换Main模板中的{SUB}变量,而不能嵌套替换下去。这是为了增加程序灵活性而故意设计的。那么该怎么样完整显示Main模板呢?51Testing软件测试网N#kZp2VW:l(Mpj

51Testing软件测试网9J+] s*G"S:K

例子:51Testing软件测试网1~-\8lJ)['B/b

51Testing软件测试网4WQ3e$yYz(@v#Bc

6jw/a.E/s%`'ke}z0

w~0x QA ` \)U0

y2a2~n S8Og:ld[3^0tpl.SUB=tpl.Parse(SUB);//先处理SUB变量,再处理Main变量。

EWiyg&faX;W0

.r.O0uqp/w&e051Testing软件测试网7V,y'f8n@ `8FSU

;r6Z^qq0Response.write(tpl.Parse(Main));51Testing软件测试网Pc@ {j bG9d

51Testing软件测试网0F3G }-K n/YpU

5.自定义模板变量。

;_$`1XM8ZZ.x051Testing软件测试网'wFM,qq

自定义模板变量很简单,可以直接用赋值语句来定义和修改任何变量:51Testing软件测试网u0~m+a*x

51Testing软件测试网POW;aHMo7}(P8h4L

Sz-F&}"qZ D0

7y\/s`.@*T*Q0例子:51Testing软件测试网7I!CC0Qv"Mt+R+^

LQbL3OM0

(]3U;El;UI%Z051Testing软件测试网"Ny.Nx"R

tpl.Hahaha=这是自定义变量;

8jh\b T e051Testing软件测试网 Uv V%]BU

tpl.THIRD=改变原模板中的THIRD变量;51Testing软件测试网'_l-XE?

51Testing软件测试网4V`*x3RpW

51Testing软件测试网p+yxN'iS

4i Gp(n&FHyGa]"m0需要注意的是,由于JScrip是区分大小写的,因此一定要注意大小写的拼写。一般来说,HTML模板中定义的模板变量都用大写。

+B.}.B-A gH(Zo/m0

51Testing软件测试网R p S-N Uz3M AA

51Testing软件测试网u\7]`0BK2xp l

51Testing软件测试网^mW] Y e1{

(FE,MUZ9X$rL.s ?.iw`0另外,模板中使用的TplPath,Load,Parse,Split变量是内部使用的,不要挪做它用,否则程序将可能发生异常。51Testing软件测试网3K+Dt _.l'C

51Testing软件测试网 c8ru9d[H"^z

下面举个完整的例子:

i}(h&~1NM0

5{,])PjOB2hR0第一步:先建立Html模板文件。

*j [y,mR0

uf&W LSn0这里先说明HTML模板文件的组成。首先,它和普通的HTML文件几乎没有区别,只不过多了几个标记。51Testing软件测试网.te \8Mb1v

51Testing软件测试网_!H } ^A-ig k

~2T ^m cR2y:z8P051Testing软件测试网r!A } ?]u:m7D#X

模板的标记有两种。让我们先看一个例子:

Q)d0~%{-e~ y,yCc0

.PI7Q m!o)u q'd {`0TEST.HTM51Testing软件测试网%iswr`(YYG1] L

51Testing软件测试网y` }4?_7i;W(L

51Testing软件测试网!_KkZa` k P

b`t8DN.{y,MG-nA+p}0

p$@8t` L e3X0

以下为引用的内容:
*C[+~Io:eA$H O0-51Testing软件测试网0c!Bg@@:I['i_f
!文件名:TEST.HTM
Jc$OEv`gEhJ _O0HTML
'Vu+Vtr0TITLE范例/TITLE
arKR+OtC0HEADER51Testing软件测试网G4XCP` R6]#{
/HEADER51Testing软件测试网 UWV%@2U(Tc&ky
BODY51Testing软件测试网!q,R4f7o*ciU^q U6m_
这是一个表格范例。51Testing软件测试网 I{ u/oz0i)S
TABLE51Testing软件测试网$W1}b%S8wD I
!#TPLDEFMAXX10!#TPLENDMAXX51Testing软件测试网 ^ k i&G^SsP
!...注意,此处使用了一个技巧即定义了MAXX模板变量并赋值为10。
-c{OF*}oA0TR51Testing软件测试网(_u!qnl3O`l"k5G
TDX/TDTDX的平方/TD51Testing软件测试网O CC|G e
/TR51Testing软件测试网 ~'VPovxpC
!#TPLDEFROW51Testing软件测试网5F']4rW Z CGJ1E,T+TW
TR
]O0A:aG0xv0TD{X}/TDTD{XX}/TD51Testing软件测试网W!S P Nm"e
/TR
N,Wwl#Xd0U0!#TPLENDROW51Testing软件测试网Zg6Jli ^
/TABLE51Testing软件测试网Wclqc1C
以上共有{COUNT}行数据。51Testing软件测试网~9X3uc:a}'w,w
/BODY51Testing软件测试网id&e ^-Ad8cbk3[
/HTML
Zo ^+O `1@0-

m#T1q2Z5L2m5l"G!P051Testing软件测试网 j Xm,Z^pAA

从上面可以看出,象{X},{XX},{COUNT}之类的记号是定义模板变量。它们将会在ASP程序中被替代。51Testing软件测试网 d@+W7b9w z svZ

51Testing软件测试网Q2}J n^Vo[

而!#TPLDEFROW...!#TPLENDROW是定义一个语句块ROW。在ASP程序中就可以将ROW块重复多次。

,H:DiF-du0

51Testing软件测试网8i s9JRvL%E'A

51Testing软件测试网-^Z M:I@o

sg~ H*V!gD!A0

"v&Gu`:H0第二步:设计ASP程序。51Testing软件测试网6m`'Hlw7_A"v1Mk

B$L B3w;m,N0TEST.ASP

`7^|0{C Z@j`Ot0

H1G4|9P gA051Testing软件测试网-M(X1l\#dqp

51Testing软件测试网 bN_(yx

以下为引用的内容:
"E^|6Cq^0-51Testing软件测试网4m)Gg;Puy:M,b+J"I
%@Language=Jscrīpt%
k-ChB`9k!x,|0!#includefile=Template.Jscrīpt.INC
;u'@ u)l!?_$X a+k0%
,r.EQ3kA+at0vartpl=newTemplate(c:\Inetpub\wwwroot);51Testing软件测试网&Nv xx/B
varstr=;
V%RwUb1yQH8o0vari;51Testing软件测试网!j"t'X c+x#~)m U~
tpl.Load(Main,TEST.HTM);51Testing软件测试网q UQQ0M5wZ
tpl.Split(Main);51Testing软件测试网/_g$p(T1]:b9s
tpl.COUNT=0;51Testing软件测试网H8U+N4^&D[ G ES'A
for(i=1;i=tpl.MAXX;i++)//tpl.MAXX在模板中定义为10。
Xe;iDM/F;k!G0{
a1}T-YhecwV#w.s0tpl.X=i;
K|u Seo g z0tpl.XX=i*i;
u;lvT8onb1Z\b0str+=tpl.Parse(ROW);51Testing软件测试网?Em-H"HMp
tpl.COUNT++;51Testing软件测试网iKc a*c~#wG4y
}
-R`/i)FmAvv&q o0tpl.ROW=str;51Testing软件测试网V)t sZ Tdy*a
tpl.MAXX=;//清空此模板变量,以避免被显示出来。
*y0Xd.~ B;x0%
8C wbaa:W3L:m3QL0%=tpl.Parse(Main)%51Testing软件测试网AifjIB!y"Kp+_:X3A
-
51Testing软件测试网a0Cj I/^3Y

51Testing软件测试网n[-]({ r3H

51Testing软件测试网3D3_4A@a^j

51Testing软件测试网tVR}2b![j

51Testing软件测试网d%C4fn5S9}"r

上面的程序将显示一个1到10的平方表。51Testing软件测试网o4L#w)r+b

51Testing软件测试网i-k]iXtr&y

通常在使用模板的情况下,都只要在最后一行加上显示页面的语句。因此整个程序显得十分清晰。此时,只要对模板文件进行编辑,就可以改变整个页面的外观。51Testing软件测试网x?w!z2iA8S,p&o

%B E`Xk*x0

hN)r8qW@;t5vH5y051Testing软件测试网!oX5N,yBu

至于模板文件,它可以是任何文件,如HTML文件、ASP文件,甚至是程序本身!,而且在一个程序中可以装载多个模板配合使用,这样,不仅具有极大灵活性,而且模板文件与ASP程序的相关性可减到最低程度。51Testing软件测试网 DyR5W0\

51Testing软件测试网;O}$Bqo:~%Q%hX%L

好好利用模板,将会使你的工作更加轻松。51Testing软件测试网0M8i){7TI4a

51Testing软件测试网q5y,y ?\wkFu

2CA:nru,la0

^oLX i3GRe-O051Testing软件测试网PVh5x7m3Nz

附:Template源程序51Testing软件测试网9QAC?p&U-N\

Qi\2eH}AK0

以下为引用的内容:
$U Fi7v#P8[`v0!文件名:Template.Jscrīpt.INC51Testing软件测试网O5N{H:b5Id$K4K
%
$O5nuW%f#ZsY0/*********************************************************/51Testing软件测试网 O$~ QY P^/g,p5^0V
/*TemplateClass*/
~ Z3A d8Ax0/*Author:*/
2Mu{,fM;fV*S0/*Date:6-09*/
&A$Q BD/B1Oyi0/*********************************************************/51Testing软件测试网#[!~ u3R8HzV7W
//TemplateMethodDefine51Testing软件测试网2nZ bW%J'^Pc,V1~
functionTemplate_Parse(name)
#Fd)hHlu0{51Testing软件测试网@5Hzz#?S
if(this[name]==null)51Testing软件测试网TaW9L m.W
return;
-~rc]'?J {;Vf0varreg=newRegExp({(\w*)},ig);
0_A*X"J+x$UWIs0varstr=newString(this[name]);51Testing软件测试网_ _,b8\W
vararr=str.match(reg);
~XK#l Y!h.\+@Gf0vari;51Testing软件测试网4X/G6y(p6Y m%\3X `Z
if(arr!=null)51Testing软件测试网0ZVR;?5w2Y&G+h"Jx
for(i=0;iarr.length;i++)51Testing软件测试网&u$Vc$`?|
{
m*?4X"U/F0key=arr.slice(1,-1);51Testing软件测试网3B0QcA_j_ JGpA'~
reg=newRegExp(arr,ig);
$O6oO&t-^9Sh0if(this[key]!=null)51Testing软件测试网&i o WJfU
str=str.replace(reg,this[key]);51Testing软件测试网P5^ iq4b,D6u9c
}
e%rC1n4u/O:f'[9N'K2o0returnstr;
-F#K-b {*T]0}51Testing软件测试网&O6X vLK1|+TK,B|
functionTemplate_Split(name)
+nU#p#vv0t1`0{
smeX!I7b|)Z0varlen=0;51Testing软件测试网,lA%`^*e+qW)h
vararr;51Testing软件测试网C _vx/`R0py
if(this[name]==null)51Testing软件测试网/WV1h&HJ,n~|
return;
h*IrjH0varTemplate_Exp=newRegExp(!#TPLDEF+(\w*)*((.|\n)*)!#TPLEND+\1*,i);
P+z;~&~y5}$["o8y0while(this[name].search(Template_Exp)!=-1)51Testing软件测试网0u,H(x7q }g VvY L
{51Testing软件测试网8cH:Om7@_,W
arr=this[name].match(Template_Exp);
#J"uM?O!Y&B7A:s_"pB3n0this[arr[1}=arr[2];
EIz0DA3L7j4f0this[name]=this[name].replace(Template_Exp,{+arr[1]+});
4p;kW9Z8Y%H0this.Split(arr[1]);51Testing软件测试网,w/~*P u8j+Oe
}51Testing软件测试网4vbh Cn
}51Testing软件测试网1{Z3_3s/D!ZsV
functionTemplate_Load(name,filename)
$}5FhS9q0{
b9^\!X t|*T'~h0varfso=newActiveXObject(scrīpting.FileSystemObject);
$Bo!V gf0varfile=fso.BuildPath(this.TplPath,filename);51Testing软件测试网(k]Cz$R
if(fso.FileExists(file))
$_*I3@@EQ5DMN2P0{51Testing软件测试网qdOxXUe1z"Z)l
varf=fso.OpenTextFile(file,1);51Testing软件测试网;y S'jZJ9y6B
this[name]=f.ReadAll();51Testing软件测试网Gq aZ1HX'cZ
}51Testing软件测试网-l7x#o#q V%WJ$Y%d'K0i
}
6He7~(Rm!c `1o0//TemplateConstructor
:YtTdi}0functionTemplate(path)
J~U$t/e!V4De5H0{
5^5n:NKn7C0//Property51Testing软件测试网"A7g u!ys i)bg
this.TplPath=path;51Testing软件测试网)]2fm:|g@,Zm S
//Method51Testing软件测试网 R)S-\&~z b M
this.Parse=Template_Parse;
3r:jr[L.BwY0this.Split=Template_Split;51Testing软件测试网2{1{I6c WA9I5n,M
this.Load=Template_Load;51Testing软件测试网QJ Iy4~ ?-V
}51Testing软件测试网#h%Am my2ptf)GA/J
%
51Testing软件测试网}:nB O$Zk*u8^


TAG: ASP

 

评分:0

我来说两句

Open Toolbar