关于Asp代码与页面的分离

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

S6DGSo/C1Vg7O:oz`7R0为了避免ASP程TML代码混写造成维护困难的情况,本文介绍了一种方法,利用模板来分离程序和页面,使程序设计更加轻松。51Testing软件测试网 Uzm M.Y0eEl

51Testing软件测试网2l*ZZ5d(h*jS#o2gE

在使用ASP制作一个站点的时候,常常会出现一个ASP文件中,程序代码和HTML代码混合的情况。这样子做有许多缺点51Testing软件测试网[#aoW%h

1y6k`g k3lQ.y051Testing软件测试网_LxT%zaG"m

?&LNr-of k5T01.且不说编程时就要对页面布局进行设计和编排,造成代码混乱难懂,不规范;

d@W5^0^ ~Wo0

&NO$GQ1ZA,C7I02.当需要改变页面外观时,你不仅要改变HTML部份,也需要改变ASP代码,不易维护。51Testing软件测试网{#gE3H`&]/^&n

51Testing软件测试网m wyW9T.@$e+u

51Testing软件测试网t\.zYQ

&jf!e.t;Ja;~d0那么,要如何才能避免这些麻烦呢?

0eOeTW/g+q051Testing软件测试网W3aX-Ax&Ea1W5}

答案就是使用模板文件,将ASP代码和HTML页面分开,一切问题就都解决了。使用模板有以下好处:51Testing软件测试网;T%eQ O0wA,r(F

51Testing软件测试网a~M0hcUE.K

1.在很短的时间内可以替换整个站点的外观;51Testing软件测试网 R Hr0Egxv7D7p p _/\

51Testing软件测试网l$hS/}{\{

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

A2A ru9p0f0
51Testing软件测试网o]O9m7w$][9Fz

#JO^-R|)D'n(\XfPY051Testing软件测试网mP;vk6Fj:a

3.可以重复利用以前的模板。

%Zl T7P+} W:yz*L0
51Testing软件测试网$W \5J+k9`q:t,W

;Mlhm,A*}8V0T$K0x4y0

o#F`1Q&yY b q{"g_0使用过PHP的程序就会知道,PHP有个模板程序(FastTemplate),现在的问题是如何在ASP中实现类似的功能。51Testing软件测试网m:Y!s3o2CTVc8D-b

51Testing软件测试网(t-t8xn1B#|@

v)G5Szb:}j-w051Testing软件测试网 Z2y)Dq(RFu

51Testing软件测试网 F#\:S*Z([f(b(B)\

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

nPP2q(Ga8YR%~ E0

&@eco']b0

GGE+~X;R0

d(Fr;E{0

/SJJ h9k0t'pM0下面介绍一下使用方法。由于此文件是使用Jscrīpt编写的(当然要转成VBscrīpt也很容易),因此,缺省脚本语言要设为Jscrīpt,即ASP程序第一行应为:%@Language=Jscrīpt%,然后再包含模板程序文件:!#includefile=Template.Jscrīpt.INC。51Testing软件测试网b)J-O#h%]5M(]FM

0drRK2[*mo*Y.R0

bR}lz$a+t.P051Testing软件测试网v,s4c F3M2[0A8o

7qr~vX|0先介绍一下Template类的使用:

7Q-ZS#X,oVOa051Testing软件测试网7h;Uxpv`:L#n

1.建立Template对象:Template(Path)51Testing软件测试网vt$b&{(iS,g.@)d$` ^

dvUY4aU#|051Testing软件测试网-La^#fB^

F5kEvJ"tV2M`0参数:Path(字符串类型)HTML模板文件的存放路径。

FGO9{)Qc|051Testing软件测试网r/N(X$srcV6oO.X

使用new操作符建立Template对象。51Testing软件测试网t/e3{d*Q P

-a E!v#?nG0例子:51Testing软件测试网 V-CE{9tm|3Qf8a

51Testing软件测试网%v_3^5x%J5UgP;f

vartpl=newTemplate(c:\template);

'@8~F/R)rce7H0

z^ ]vX9m'h8y0在程序中可以用tpl.TplPath来取得模板路径,也可以通过tpl.TplPath来改变模板路径。51Testing软件测试网] ?nMS

9B&rh6z#F9`zEW4D051Testing软件测试网#I6s)BF7dxIM

51Testing软件测试网5rz\i.~qd

+r7q^\us-|kW0如:51Testing软件测试网5\ wmAuqG j&{Mx

51Testing软件测试网.]7UU b(xf

K~ gRoBn0

0ju'hJ(u%u;I1n!qk0

|{8g{7]!?z,M @0tpl.TplPath=d:\template;51Testing软件测试网q&DF] K5[$K;Y

51Testing软件测试网}(^%_;p%}8x;G

2.装载模板文件:Template.Load(Name,File)51Testing软件测试网R%V[UO"@T%J

;iG0{C*`e J+U0

,Ee)Vn&?cO.l1X-m|051Testing软件测试网){:d[~/w l/|F

51Testing软件测试网*l/EK)O!wP\3uL

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

u g7e#`\ d"t@051Testing软件测试网N"YI*[%ay"D9?m+e

File(字符串类型)模板文件名。此文件存放在HTML模板路径下。

vk$l1tj,L8ah O0

6Uq @/D"iwq%[0读取文件File到模板变量Name中。

;A&W+@e$~0

q@6[#r"d&b0

B5MH+v7S(o?(J*Gz0

#lu,yxv051Testing软件测试网*oBfj@0pPR._{

例子:

g"NY w'f`0

(G#m7xoE*V ~0

8wK-E/\Oq+?MZ051Testing软件测试网\dM1j,X cw!J

tpl.Load(Main,TEST.HTM);51Testing软件测试网rN3F p6Iq _~#_^ }P

;Yho$i qn0

,hr&vHx{4X.uU'u6R051Testing软件测试网&X XG8F~"NV

此时,模板变量Main就包含了文件TEST.HTM的内容。

-h e[7k:i6P6m0

Nz'z'Y x,k-j%P6E0你可以用tpl.Main来访问模板变量Main。

${%XWvZ~ T!@0

r v6Z_k#U_.y0

b F iC)X{d"h4H O051Testing软件测试网c] aqk7Fi

0_n\ZEw1m0例子:51Testing软件测试网wO(T H} R

lI'`#MA;r${0%=tpl.Main%

}'L$~b4d BG0

WW"F^C9s(f2~i*b0将显示刚才读进来的TEST.HTM文件内容。51Testing软件测试网q^&HbL.HL

d"l;ez"m'wk'V03.模板分拆:Template.Split(Name)51Testing软件测试网4PH-KLtjK%M3V

51Testing软件测试网8Y6V A1vrT%[

51Testing软件测试网b)S7~W:q%x

9x5l3n\"uW0参数:Name(字符串类型)是一个模板变量名。51Testing软件测试网&~g x4['b

51Testing软件测试网%xsye S3CDU

将Name中的子模板分解。51Testing软件测试网)Tw.zC T8l&l

(Ug X)HApj_ ]051Testing软件测试网(` Y o1f[v

51Testing软件测试网G:nW_%_7b1gPHN

51Testing软件测试网+Z kyE?3h^

例子:51Testing软件测试网 Pn#R0A@l

m/ju3BCY051Testing软件测试网%X.Q]$cN5EIjk/h5B Y

51Testing软件测试网4A^|i5k,Cn[

51Testing软件测试网4U E9A}N,F~7Fe

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

e,mZ_,e5S D9v4]0

(QUX D|)eb0这是主模板。接下来是:!#TPLDEFSUBSUB子模板,还有51Testing软件测试网k*tAq9WO3b']

}#F'W+v3t051Testing软件测试网T4[-q0n tn6Y

51Testing软件测试网:E;kB@HZ

51Testing软件测试网:}8u:Zcn:\S `/f MD5Q*a

!#TPLDEFTHIRDTHIRD模板。!#TPLENDTHIRD51Testing软件测试网6qn F+UzAr%U o.Dt

&p#Cxd!O)lN0!#TPLENDSUB51Testing软件测试网Z&N z)K rI0V:Ur

a dJ7s-e)p/CG-?/P[0

og)i&N3cx051Testing软件测试网7Om0G#i y|~N

那么:51Testing软件测试网9{$~#Z)~ E0`-] V

6xO%nv1a]A051Testing软件测试网y3ypk$X7F

51Testing软件测试网KrN3v5VK"Jj

tpl.Split(Main);

/{\6pe%pjp;dy0

51Testing软件测试网P3zR.C0L[c

51Testing软件测试网/p+x`-h9IJF.K

p)Rw0vm051Testing软件测试网$@K*RE`:x3I g0L

执行以后,就会生成新的模板变量SUB,和THIRD,它们的内容就是!#TPLDEFSUB和!#TPLENDSUB之间语句。

4C,F*t"p)]+}{051Testing软件测试网\]"l tL

而且Main模板变量的内容也会发生改变:51Testing软件测试网 JX)[+p{|4am l;n

LqX'l!dU/[051Testing软件测试网PY'x?NO

D8lE7M`^\%p0tpl.Main的内容为:这是主模板。接下来是{SUB}

k8qF3\Z"mZ0
51Testing软件测试网4PM4iK(G ^j#w

51Testing软件测试网&dmE-sTO

51Testing软件测试网BZpCu|W

tpl.SUB的内容为:SUB子模板,还有{THIRD}51Testing软件测试网fYY.[j+iBa

51Testing软件测试网"~:IMFS$a8C

S"?z\HA051Testing软件测试网.o,i L Alt

tpl.THIRD的内容为:THIRD模板。

5\'S-lJ.tsLB3R4L&o0

8C8j'~R:gm051Testing软件测试网$Q i2_,x8? Md

j.}/z7Ma0

^2g Kx*TT0TPLDEF和TPLEND定义的语句块充许多重嵌套。51Testing软件测试网:K;[qT&N%C5dRh

51Testing软件测试网$~ ZU A4r&A M`9_N

+o"m5a3py(B#[z0

OZ+m"G;SRu~H04.模板处理:Template.Parse(Name)

6Y4iKgg)Y0

WP:uS6qL"hH&GBG0参数:Name(字符串类型)是一个模板变量。

#U%qh fn0

`1QsEs/p%D9U^0

m*I6?AU'h051Testing软件测试网*\w R0p3w8B2w

51Testing软件测试网Pv-QQ%U3P

将模板中用花括号括起来的字串用同名的模板变量的内容替换。

\ `OfW`$XF4m0

g5X {b!\ yUv;\0例子:续上例51Testing软件测试网9ptr a_%hW:}:EE3y

51Testing软件测试网1z)sl C&J'Q T8q b;K

%=tpl.Parse(Main)%51Testing软件测试网1N3^7R9e3m[:h{

51Testing软件测试网K}Kc7Qee.p!A

显示:这是主模板。接下来是SUB子模板,还有{THIRD}

)Y+Vn*K)V;^+\0

:eN0ZD"s.fKE0由例子可知,Parse只替换Main模板中的{SUB}变量,而不能嵌套替换下去。这是为了增加程序灵活性而故意设计的。那么该怎么样完整显示Main模板呢?

;cn(r [Nw)?n^7A0

i-w0Pu'DD7_&t%V0例子:51Testing软件测试网-I-n0SP~6Yr

9xk!@;T%i/V7j!l0

{y4l*o%O8KYw"Y"N051Testing软件测试网t7Xs DV]l

kFR%aNj ^%T0tpl.SUB=tpl.Parse(SUB);//先处理SUB变量,再处理Main变量。

0lK\/t8\z6x0
51Testing软件测试网 { |a@(p B'lL o {

51Testing软件测试网Hb5m&k-m ~

j oBk H)N,Yc0Response.write(tpl.Parse(Main));

S-\'V j7jY-| F.]0

,YP?5A3lg-M3x8Sj G05.自定义模板变量。51Testing软件测试网#GN3m@U!v q1a

'ER\.Hr J*UT.P0自定义模板变量很简单,可以直接用赋值语句来定义和修改任何变量:

Z7c2a4Hs(g4V~F0
51Testing软件测试网 `$G)RsnW f2_

B&vLA {%i0

_z w+?{0例子:51Testing软件测试网-`#{,?#q/a3a(f

51Testing软件测试网bU!H6~}g,]O

-Mse(YRO,t051Testing软件测试网\+I@` DAe

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

2?7OA4q`w051Testing软件测试网!vb W;X&]r7Y`-[r

tpl.THIRD=改变原模板中的THIRD变量;51Testing软件测试网1U;LCozzU

51Testing软件测试网|s$Q_P9C7W1Y

"B Isf9RfF]%E051Testing软件测试网;Z.\9I@*s0G

需要注意的是,由于JScrip是区分大小写的,因此一定要注意大小写的拼写。一般来说,HTML模板中定义的模板变量都用大写。51Testing软件测试网L+T%@ e3_w?#`)FB

51Testing软件测试网KpY^d)wDM N7M Z }`

Cc@#^J0

v| pZDx7w051Testing软件测试网'`E3J { t7C1[K

另外,模板中使用的TplPath,Load,Parse,Split变量是内部使用的,不要挪做它用,否则程序将可能发生异常。

eED2h9km051Testing软件测试网(y[O!LUEO S

下面举个完整的例子:

;ac${P2l0tT051Testing软件测试网&X1g&RM*d(CL3}'J

第一步:先建立Html模板文件。51Testing软件测试网"[ |h F h h+A

51Testing软件测试网.e.gzk"N!om?

这里先说明HTML模板文件的组成。首先,它和普通的HTML文件几乎没有区别,只不过多了几个标记。51Testing软件测试网 xzm!^ n(VW8]

d8Jo&wee$ZI051Testing软件测试网:[/r,ArX

51Testing软件测试网+P-LjDN)b_5P/~

模板的标记有两种。让我们先看一个例子:51Testing软件测试网Us'L9`y}My r

51Testing软件测试网!q1n.e$hqf`t

TEST.HTM

l?q%APa$i8}0

51Testing软件测试网#Y9N a RU2OK

51Testing软件测试网E4C)hw7Mmy+M|

51Testing软件测试网5` ^,x[qg

51Testing软件测试网4[8H$R*H+P Y

以下为引用的内容:51Testing软件测试网%@AQh0H
-51Testing软件测试网@K;uTu!|Y
!文件名:TEST.HTM
b&Q.T K)x z!T9F2`mB0HTML51Testing软件测试网4@_z#t:Oy-ogr3[A
TITLE范例/TITLE
TJ1i%])iB0HEADER51Testing软件测试网 wsWE3xo Z
/HEADER51Testing软件测试网 X8W"Z7s4VF1I%@j6b
BODY51Testing软件测试网 \9bv _:M]!u
这是一个表格范例。51Testing软件测试网#JY3nGQV
TABLE
\"[.Wq.cF0!#TPLDEFMAXX10!#TPLENDMAXX
] Ij~'P}sWX0!...注意,此处使用了一个技巧即定义了MAXX模板变量并赋值为10。51Testing软件测试网}q:Ps7Ux2T!N;@
TR51Testing软件测试网DTeR e^&E"O
TDX/TDTDX的平方/TD
9L R'v&X(t n\0/TR51Testing软件测试网~!E^2lI
!#TPLDEFROW
UK*]Zl9w(C&i G5G2c0No7C0TR
o"{9Y!~3c8i7\0TD{X}/TDTD{XX}/TD51Testing软件测试网&@m"Et J@ vf.@
/TR
g+e;w}$kY8ir7M0!#TPLENDROW51Testing软件测试网h,WE(U3f?j b
/TABLE51Testing软件测试网Pp8X\ y;uc
以上共有{COUNT}行数据。51Testing软件测试网oqW6C`*AZ~
/BODY
#RdE.d%hz/f%Z0/HTML
)vL6e t/V3N8d0-

:Ru~6DJ]6B0

?2Io'wf/wE0从上面可以看出,象{X},{XX},{COUNT}之类的记号是定义模板变量。它们将会在ASP程序中被替代。51Testing软件测试网R.d]/~AyNL,m X9P

U+Y})x?)Y'r6A0而!#TPLDEFROW...!#TPLENDROW是定义一个语句块ROW。在ASP程序中就可以将ROW块重复多次。51Testing软件测试网 Uq3m6QI%H

51Testing软件测试网:M$W#G@,[k'?

:[%r&Q8ns3v0|Wg051Testing软件测试网l&U+] Pjg n

51Testing软件测试网Nk%@EJ9tn0z$M2BB

第二步:设计ASP程序。

(V-Ls U }[w,fN051Testing软件测试网,H]%{z.b.k5n

TEST.ASP51Testing软件测试网%[bu1k,w7z

*R"~j%j%BP051Testing软件测试网Bo8E U}(Io8m T

51Testing软件测试网P1KS:a7v @ s`x&T ]

以下为引用的内容:51Testing软件测试网|$`#L2V)qR$b0{c
-51Testing软件测试网@l0rb1?d [
%@Language=Jscrīpt%
&a{zN2^l+?9q4X0!#includefile=Template.Jscrīpt.INC
(` {0W6f I ^F%il0%
4TX(F/])OJ0vartpl=newTemplate(c:\Inetpub\wwwroot);51Testing软件测试网-V b:w h0v2Z-W;X:t8G
varstr=;
-y#e)SF n0U4N0vari;
]-a;q,@.\Iq*hz ~0tpl.Load(Main,TEST.HTM);51Testing软件测试网 _&qI6I?k3|4v O
tpl.Split(Main);51Testing软件测试网jn'bir'p `P
tpl.COUNT=0;
HkeRL;m0for(i=1;i=tpl.MAXX;i++)//tpl.MAXX在模板中定义为10。51Testing软件测试网j$]c-br.~
{
{6i!ue9tKtN0tpl.X=i;51Testing软件测试网2B4t*]V'PY j
tpl.XX=i*i;51Testing软件测试网"\u.T{`9o ]!v
str+=tpl.Parse(ROW);51Testing软件测试网d&[ P+j x[&w$vJ5qd
tpl.COUNT++;
+w7N ~)h;R1|*K4a0}
l+q%|(@D.z;M L6K1M0tpl.ROW=str;
Y7G6?0cl Qi3KRU!{0tpl.MAXX=;//清空此模板变量,以避免被显示出来。
+Oa1@3h {&jqZ2I0%
e'g zgsw Y0%=tpl.Parse(Main)%
|3qkYK3\;e+w1d*x0-
51Testing软件测试网~td*qFZ*A)v

51Testing软件测试网}1B ]9Zt? B

51Testing软件测试网1e1} C-H#d&}

9[,j.]0n2p4}051Testing软件测试网,OM$y@0hB6V|#^U

上面的程序将显示一个1到10的平方表。51Testing软件测试网+B'L fx4O|4WB@

51Testing软件测试网\5T'e9sDQ,k

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

51Testing软件测试网D2c F Ch6\n

A@CoR9Bi0

,`Yb;Te~0至于模板文件,它可以是任何文件,如HTML文件、ASP文件,甚至是程序本身!,而且在一个程序中可以装载多个模板配合使用,这样,不仅具有极大灵活性,而且模板文件与ASP程序的相关性可减到最低程度。51Testing软件测试网'bi5^&Jzx.b)D

51Testing软件测试网x-@,a it

好好利用模板,将会使你的工作更加轻松。

,pn2QEg*M+PM0

Q4l#F-{^/IZ0

8f^r^C e051Testing软件测试网 TH*v/S2c%Mki$^

51Testing软件测试网|7ym _ N?$pmu~

附:Template源程序51Testing软件测试网%bcP\ [5H/?6H

51Testing软件测试网6{ R#l4[lu5m

以下为引用的内容:
4B ceXJ-L{lB/[-\0!文件名:Template.Jscrīpt.INC
_.z,R!w.J;F(W#n6N0%
!n x!S8i b"s+b0/*********************************************************/51Testing软件测试网;kf MDQ#LW
/*TemplateClass*/
Q6A%W-~v0/*Author:*/
j@Nk s`0/*Date:6-09*/51Testing软件测试网i;Dr)m\1soKIXC
/*********************************************************/51Testing软件测试网$MW8u)S$c g6X*q
//TemplateMethodDefine51Testing软件测试网6G9g H&LJ0u&tR6h
functionTemplate_Parse(name)51Testing软件测试网O9m8{+r7t,r
{51Testing软件测试网C6CEh7h(B9tu?
if(this[name]==null)51Testing软件测试网$kH4I m-Bx?&FL!X)H
return;
~SYUt9RpI4C0varreg=newRegExp({(\w*)},ig);
~~j.x!\5nL(zx0varstr=newString(this[name]);
v MF%o?,` O0vararr=str.match(reg);
4wT h'])m"l]?Ws0vari;
8S0|(m \~.E0if(arr!=null)
J(vES4_+gtK6~0for(i=0;iarr.length;i++)51Testing软件测试网xp-uI7~XU4GW
{51Testing软件测试网Z~"go(jvi
key=arr.slice(1,-1);
F"e%lA tK*i1xNj0reg=newRegExp(arr,ig);51Testing软件测试网5Z1tB };B|)S
if(this[key]!=null)
Cn.g z([9mty,?0str=str.replace(reg,this[key]);
!eBQ.\z"L0}
o!lQ a"UoR0returnstr;
v;gP8O4r0}51Testing软件测试网5d ?6qi&`!p2O,T-j
functionTemplate_Split(name)51Testing软件测试网*k zE h!B.H.r
{51Testing软件测试网^o.PMJ1~z'QSk.k
varlen=0;51Testing软件测试网$h"U X ~?o"j
vararr;51Testing软件测试网o g#X;j'Z,D-@
if(this[name]==null)51Testing软件测试网 d#`6Gnbj b*}
return;51Testing软件测试网6\HA5q&a6i!V _`
varTemplate_Exp=newRegExp(!#TPLDEF+(\w*)*((.|\n)*)!#TPLEND+\1*,i);51Testing软件测试网O)gec[
while(this[name].search(Template_Exp)!=-1)51Testing软件测试网 \vpT#g
{51Testing软件测试网)a"YO Yg8o
arr=this[name].match(Template_Exp);
_9yK9M'P:Oq0this[arr[1}=arr[2];51Testing软件测试网v[@ ktv8hX
this[name]=this[name].replace(Template_Exp,{+arr[1]+});51Testing软件测试网 v0Z&f9Gs ci
this.Split(arr[1]);51Testing软件测试网:KT5B,Xi*N%c+O#m
}
xQ W w y0}51Testing软件测试网Ccx!MM!i bz.hh
functionTemplate_Load(name,filename)51Testing软件测试网[~1|"n)` Zl
{
(@Y Zt k*~0varfso=newActiveXObject(scrīpting.FileSystemObject);
jL6IY4Jv+K)S/L0varfile=fso.BuildPath(this.TplPath,filename);
"u3Zx9SCH0if(fso.FileExists(file))51Testing软件测试网~S`o1pZl`n
{
1I[uWZW:Pg3U ~c0varf=fso.OpenTextFile(file,1);51Testing软件测试网g,[)xoyV x(wm8i
this[name]=f.ReadAll();51Testing软件测试网 {Y:y tQ?:q/@U
}
'U-a4B E!S/T,I0}51Testing软件测试网` ?J'` Z#qD{
//TemplateConstructor
!|:k~&m5f|0functionTemplate(path)51Testing软件测试网#K"YP!y#h5l{m'i8Y
{51Testing软件测试网4KLHv%` mb&G`
//Property
EN:[v6zt!}'h"u0this.TplPath=path;51Testing软件测试网XX%G O4fa8A|
//Method
:B4j S1I+~0this.Parse=Template_Parse;
/twl7xN{*}`2o'L2b0this.Split=Template_Split;51Testing软件测试网jF~XN abwX
this.Load=Template_Load;51Testing软件测试网ry8iBk2Z.C
}51Testing软件测试网.C7}0uB3P9]"n
%
51Testing软件测试网~ Yr3l;r)i,lI"q


TAG: ASP

 

评分:0

我来说两句

日历

« 2024-03-18  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 33852
  • 日志数: 65
  • 图片数: 4
  • 建立时间: 2006-12-06
  • 更新时间: 2008-09-10

RSS订阅

Open Toolbar