查看完整版本: 关于Asp代码与页面的分离

snowfox373 2007-12-9 21:33

关于Asp代码与页面的分离

  在使用ASP制作一个站点的时候,常常会出现一个ASP文件中,程序代码和HTML代码混合的情况。这样子做有许多缺点:
R)~;QY H #[jZ+B;X K8|.@.@s&Zd
  1.编程时就要对页面布局进行设计和编排,造成代码混乱难懂,不规范;
7g;r.?(Rv1_ ~ f h#l
)xT;I7Mu7V,b Ts   2.当需要改变页面外观时,你不仅要改变HTML部份,也需要改变ASP代码,不易维护。
vcBV*u)a"|!r^!K o{5q%[1PD
  那么,要如何才能避免这些麻烦呢?w^EB)w&Bm2F WT

%?k _GI+FR   答案就是使用模板文件,将ASP代码和HTML页面分开,一切问题就都解决了。使用模板有以下好处: L3Fh r} o8Z

)qlNNk5m`   1.在很短的时间内可以替换整个站点的外观;
K(KyrH5P,w;kWj #K s&`SF!@3w.s+[I-[
  2.使程序员可以抽象编程,而无须接触HTML代码;
6s}K.aXF#g*}
)vA GR-t2@!M   3.可以重复利用以前的模板。
-`6m3h} ?r 'D-D,|.['e%r+ofsJ
  使用过PHP的程序就会知道,PHP有个模板程序(FastTemplate),现在的问题是如何在ASP中实现类似的功能。
n cm8{d P
W(|4Q:w Exb   Microsoft的ASP带有两种脚本:VBScript和JScript。它们都带有一个正则表达式对象(RegExp),利用字符串对象和RegExp对象,就可以轻松的实现模板功能。沐枫以此编写了一个Template.JScript.INC文件,此文件的内容附在文章后面。有能力的读者可以根据自己的需要进行改进。1hKa4Npj9^ yt
2DJ_fkM
  下面介绍一下使用方法。由于此文件是使用JScript编写的(当然要转成VBScript也很容易),因此,缺省脚本语言要设为JScript,即ASP程序第一行应为:%@Language=JScript%,然后再包含模板程序文件:!#includefile=Template.JScript.INC。w2YKPzT8E

/wTd2`/`8IfG[   先介绍一下Template类的使用:
b%o hZX5_E
[c UE;tx[:e0?;T1]   1.建立Template对象:Template(Path)
-TJun iE-j C n\#r9U w'GJ
  参数:Path(字符串类型)HTML模板文件的存放路径。;W:c-q%U3?I
b ovl4Y'r
  使用new操作符建立Template对象。cD{7\pK)G7U[n:D

'nO'Dr9npUZ   例子:[code] vartpl=newTemplate(c:\template);[/code]  在程序中可以用tpl.TplPath来取得模板路径,也可以通过tpl.TplPath来改变模板路径。 p;M7}?.S@{R
/l\:}`}Q] rj3Ya
  如:[code]tpl.TplPath=d:\template;[/code]  2.装载模板文件:Template.Load(Name,File)]R-uq'X#P.D [&I:r:R4G

h/gqSJl   参数:Name(字符串类型)是一个模板变量名。%G,bnY4i

r*S#Q~)YMH   File(字符串类型)模板文件名。此文件存放在HTML模板路径下。
K&wwVa6Y7StD^
[!XX Ng#A   读取文件File到模板变量Name中。
u1b4q6oq3r2FZ
?7k@ ^;V.Uxt+P   例子:[code]tpl.Load(Main,TEST.HTM);[/code]  此时,模板变量Main就包含了文件TEST.HTM的内容。
RyK ]t;Sd+KED
/g _di.m;?E   你可以用tpl.Main来访问模板变量Main。
y^z+_T m#{/x2uQ ld .?6]"n#t'agT/^
  例子:[code]%=tpl.Main%[/code]  将显示刚才读进来的TEST.HTM文件内容。-ocQp,D
sO2e2b8d4V4e
  3.模板分拆:Template.Split(Name)k$e(v2a&k(h&@?

%P-WEti+M   参数:Name(字符串类型)是一个模板变量名。
mgbw R%I
S TOb)N)_&j   将Name中的子模板分解。wf.F8PQC
m9Ez'h5T"`h.h
  例子:[code]  先假设上例中的TEST.HTM内容为:
Ja5b g(s c   - FF"Q S;@
  这是主模板。接下来是:!#TPLDEFSUBSUB子模板,还有 D&d*MV"V{#K F
  !#TPLDEFTHIRDTHIRD模板。!#TPLENDTHIRD +`E ZpxPr4h
  !#TPLENDSUB F}6`FR5^?T
  -[/code] 那么:[code]  tpl.Split(Main);[/code]  执行以后,就会生成新的模板变量SUB,和THIRD,它们的内容就是!#TPLDEFSUB和!#TPLENDSUB之间语句。+d!}@'m-ARJ\
1|U2|+D*V
  而且Main模板变量的内容也会发生改变:1n9Vp*}rWDo
"m RY~+N8j8c z W
  tpl.Main的内容为:这是主模板。接下来是{SUB}
}q HyJ&EQ;sQ j:h+I$T!K8Qf|w_I
  tpl.SUB的内容为:SUB子模板,还有{THIRD}0ey|0u7v W\

;c.bVas5O-O   tpl.THIRD的内容为:THIRD模板。
DK'n(cr TF yp/Ct.ORtg
  TPLDEF和TPLEND定义的语句块充许多重嵌套。
,q zt gh
vD X8\*Q w2Rs   4.模板处理:Template.Parse(Name)
JN:U,k1KB"?|
?&O&x0j+~Xz*B,s6l   参数:Name(字符串类型)是一个模板变量。
FgS5h^I%~x AxC S {~dgP~\
  将模板中用花括号括起来的字串用同名的模板变量的内容替换。
8~VT?G7e ;g-J(OY9Y~ hq
  例子:续上例[code]  %=tpl.Parse(Main)%[/code]  显示:这是主模板。接下来是SUB子模板,还有{THIRD}
_$k? i#G#P4n
R_Q s+hL;F   由例子可知,Parse只替换Main模板中的{SUB}变量,而不能嵌套替换下去。这是为了增加程序灵活性而故意设计的。那么该怎么样完整显示Main模板呢?? ho'G OI

Tl%k~:CZb ]XH   例子:[code]  tpl.SUB=tpl.Parse(SUB);//先处理SUB变量,再处理Main变量。 ]#uO v@&w!@;]%v;Y
  Response.write(tpl.Parse(Main));[/code]

snowfox373 2007-12-9 21:38

  5.自定义模板变量。 SyDS;G.a
g|1T['i
  自定义模板变量很简单,可以直接用赋值语句来定义和修改任何变量:"QOit;a fn

l]{ iX.Gi   例子:[code]  tpl.Hahaha=这是自定义变量;
"C'? ALs*z l/o&d&KT*?   tpl.THIRD=改变原模板中的THIRD变量;[/code]  需要注意的是,由于JScrip是区分大小写的,因此一定要注意大小写的拼写。一般来说,HTML模板中定义的模板变量都用大写。$Z0V1f'T0M$D

Y#|n K!v\U   另外,模板中使用的TplPath,Load,Parse,Split变量是内部使用的,不要挪做它用,否则程序将可能发生异常。1a FTB-EN
\2e$a \S:`YM
  下面举个完整的例子:%x'F"t] W
!C H u"wC*F
  第一步:先建立Html模板文件。
2@:HD YZ1WK
CubM.GA   这里先说明HTML模板文件的组成。首先,它和普通的HTML文件几乎没有区别,只不过多了几个标记。Q!_|x;@(Zr#C
3wL2@2Cc/w9r\
  模板的标记有两种。让我们先看一个例子: E"iRv"Q
v{.P`3j
  TEST.HTM[code]-
)G ~5f X&U `4s;o !文件名:TEST.HTM O'NY*PY5J]
HTML
M3P6s$Q9V TITLE范例/TITLE
^V)tD Z%~ n:? HEADER 7f#k&ld/y
/HEADER H3R!O5D7[u~EN
BODY Lo6aM*F,`
这是一个表格范例。 a#h S'M4Ua%d ` [
TABLE `fv-U x O5_$lU
!#TPLDEFMAXX10!#TPLENDMAXX QuPW rE
!...注意,此处使用了一个技巧即定义了MAXX模板变量并赋值为10。
7e!?7Q"LH(w5@V.F TR ;b'kIb;k8Eb
TDX/TDTDX的平方/TD
/]&a R2LCD /TR
2A7@6Tm i0_U-Y$t !#TPLDEFROW ?q{Bv0v7gR8g2n
TR L"R)y B@"x W,{i
TD{X}/TDTD{XX}/TD iw HJ:p
/TR
]if s5Yzo !#TPLENDROW 9?z.F2BfQ~}*P/d
/TABLE .}8mKXM\ R0F
以上共有{COUNT}行数据。 Gj.se2R }l&JC
/BODY .j6?JW$b7HF cd
/HTML
&GH2Q1?'P){U -[/code]  从上面可以看出,象{X},{XX},{COUNT}之类的记号是定义模板变量。它们将会在ASP程序中被替代。
yV9gs(hlj *sR!X[hi:nS
  而!#TPLDEFROW...!#TPLENDROW是定义一个语句块ROW。在ASP程序中就可以将ROW块重复多次。
!?8Hd'Jb-B y 8VZN?C1e+V'{3n,BL&~
  第二步:设计ASP程序。9rhTp6n7t!~4V~

/iHxNI:N   TEST.ASP[code]-
L4Ue\'a %@Language=JScript% oH Luw%n
!#includefile=Template.JScript.INC
:]Y F-c2yRG(A % v;ip[!Z&E"?4i
vartpl=newTemplate(c:\Inetpub\wwwroot); 9xjU}3L@ sQ
varstr=;
!jT BaK vari;
b*k*HN D z-E._A tpl.Load(Main,TEST.HTM); :MNA*^ N
tpl.Split(Main); -Qo;x8r|&cI I7fF
tpl.COUNT=0;
1?P{1|ei j5I9[h for(i=1;i=tpl.MAXX;i++)//tpl.MAXX在模板中定义为10。
C'R:z6]/D*OK,U { |zc(_wz$B!y
tpl.X=i; 6A.` c:mU#IDL'h
tpl.XX=i*i;
o0d1eD `,A({ t#dN str+=tpl.Parse(ROW); e o8E-|D \b
tpl.COUNT++; d7PY7h[.u
}
u!x7U9BJQoV tpl.ROW=str; !?wrom)n1}
tpl.MAXX=;//清空此模板变量,以避免被显示出来。
,y'S#M7r S*Au % wS f4|h1n
%=tpl.Parse(Main)%
$R#Gl-j#|?L -[/code]  上面的程序将显示一个1到10的平方表。
-S:A(M-~8E
ng{"[ w(IQK/R w   通常在使用模板的情况下,都只要在最后一行加上显示页面的语句。因此整个程序显得十分清晰。此时,只要对模板文件进行编辑,就可以改变整个页面的外观。
.y)NgFDA%tK O%Q2{`;J+KGW ob
  至于模板文件,它可以是任何文件,如HTML文件、ASP文件,甚至是程序本身!,而且在一个程序中可以装载多个模板配合使用,这样,不仅具有极大灵活性,而且模板文件与ASP程序的相关性可减到最低程度。HMV!W&s(QUC

lt+ONQ b   好好利用模板,将会使你的工作更加轻松。 i;?'vw2L
G`/A;~&MAe
  附:Template源程序[code]!文件名:Template.JScript.INC
K B$}Cv)pg % X z]-J8M e0Lw
/*********************************************************/ 7m^(i%i6e d
/*TemplateClass*/
`+~}/Tka /*Author:*/ O2d3H lftWt ~e
/*Date:6-09*/ _/^ci1XtfA_
/*********************************************************/
n O[${g/o? k //TemplateMethodDefine l%Bng+Y.E w1b9L
functionTemplate_Parse(name)
`,xN2g u ~ {
awz*TF[ if(this[name]==null) _O:Hg!Gv2eM
return; +a9J/RNMu
varreg=newRegExp({(\w*)},ig); H0vg&zq.k\"J
varstr=newString(this[name]);
(k5_7jL1MC vararr=str.match(reg);
Ce2ph7v ys_ vari;
u!A&a'q:].b if(arr!=null) -u{(MX[/oZ
for(i=0;iarr.length;i++) u\1v4`DP
{
+\Kx%H7yOcx[ key=arr.slice(1,-1);
Tm3w7uq"Zj| reg=newRegExp(arr,ig);
CF }N;Ol$?*A if(this[key]!=null) ;xwG_#Mt){
str=str.replace(reg,this[key]);
!s!{&if%N } Qviz s+J
returnstr;
i/v2e@c }
m|{0C$Z3Pu yeEd G functionTemplate_Split(name)
#k0hs.S&W7vkb { "y#?vqx4f6Uz
varlen=0; L7O2_~^Y ] b*pe@7p{
vararr; pn+TB\ }6o
if(this[name]==null) S4S,?+ND^b
return; v'L*sD4FT\6L
varTemplate_Exp=newRegExp(!#TPLDEF+(\w*)*((.|\n)*)!#TPLEND+\1*,i); 9Vj;jI:Sg.dH
while(this[name].search(Template_Exp)!=-1)
7Hy l;AU&s ~H { }&K'^tz1l5M'}km I
arr=this[name].match(Template_Exp); m+PRq XYYt Z
this[arr[1}=arr[2];
!G M:wH'Gh,Y this[name]=this[name].replace(Template_Exp,{+arr[1]+});
Ezm*S G1D`%TlYi this.Split(arr[1]);
2Zq;I6]G7l } %b2?5mWZ!U!t,T
} 2`5Nu7L6wA k8BX!G"{ B;Q
functionTemplate_Load(name,filename)
8[B&Yp |T0B { 1V ?7q rKz2mf0Z4G
varfso=newActiveXObject(Scripting.FileSystemObject); Dj2Cu:x4mJ$O)QI-`ns
varfile=fso.BuildPath(this.TplPath,filename);
O)s4P ne u4Q if(fso.FileExists(file))
;yIN1BTe {
{0_m'y`/w v(O3O varf=fso.OpenTextFile(file,1); 9~Z[:M\)L
this[name]=f.ReadAll();
r hBODUR{@ }
6r'r'y$IE$b&NZ } 5FK+PD2?d
//TemplateConstructor
A+{Go\ Xmv1r functionTemplate(path) 4d i,M+g%v"o3GunAL
{
urF7d6b-X;z7l3o //Property
5J4dh)t$Ut this.TplPath=path; !NEx_+a$Tt
//Method ;HL2k1?%fk1@z
this.Parse=Template_Parse;
d;^,EF"|q this.Split=Template_Split;
U Fw:W3f'f,k,AQC this.Load=Template_Load;
Ovdd1Qc ^]1| }
3s1w8|{Nu#@ ]F6i %[/code]
页: [1]
查看完整版本: 关于Asp代码与页面的分离