假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...
通过MVC模式将Web视图和逻辑代码分离
上一篇 / 下一篇 2008-05-19 22:35:04 / 个人分类:web
查看( 97 ) /
评论( 1 )
本文为原创,如需转载,请注明作者和出处,谢谢!
"ZSu1e;z1j[f0
1O YAs8X&F"VV0 MVC模式(Model-View-Controller)常被用在Web程序中。如Struts框架就是一个基于MVC模式的Web框架。所谓MVC模式,就是将视图(也就是客户端代码,包括html、javascript等)和模型(和数据库及业务逻辑相关的Java代码)分开。并通过控制器将两者联系起来。这样做的好处可以使客户端开发人员和服务端开发人员的工作尽量分开,以使他们之间的干扰降到最低。
F7?7zgD[0 虽然象Struts这样的框架可以很好地Model和View分离。但是对于客户端的代码,仍然存在着一定的视图和逻辑混合的现象。如下面的代码所示:
g:?6S$n%A-nh0ITPUB个人空间4M|'_s:~!c$Kp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&~9m+y+B6LL)R-F0<html>ITPUB个人空间)J&s-R~ C^lI6G
<head>
F {xb/TY0 <title></title>
&|$pEE_Ll'bUo0 <meta. http-equiv="Content-Type" c>
u4]4]4D-}N~j1vtv0 <script. type="text/javascript" >
{o(}!R4z-K*g0 function fun1(obj) { }ITPUB个人空间*f1|"C?z;Hr8Q
function fun2() { }
az:erJO&V@c0 </script>
Xnvo`6D0 </head>
(Y d.H8k2N/E8ek1c0jJ0 <body>
@ SQ8q$r9H^.j[0 <input type="button" value="按钮1 " />ITPUB个人空间C9l L^&|e%D
<input type="button" value="按钮2 " />
_A4q\@H0
:t#Y{j x0 </body>ITPUB个人空间1W;Rw~8|'@C5B3fq(I
</html>ITPUB个人空间$t0Gjw7T!|K)D:[
ITPUB个人空间-E]{u,V/I#A
从上面的代码可以看出,html代码和javascript代码都混在了同一个html文件中。在一般情况下,客户端的界面是由美工设计的,而对于javascript代码,美工一般是不参与实现的。这些代码一般也应属于业务逻辑代码的一部分,虽然它们都在客户端运行,但可能也会处理一定的业务逻辑,如验证数据的正确性。尤其在AJAX应用中,在客户端还会通过http协议从服务端获取数据。这样就和业务逻辑绑定得更紧了。因此,如果将用于描述界面的html和用于处理业务逻辑的javascript(渲染界面的javascript除外)混在一起,非常不利于团队中负责这两方面的人员进行协调。
-w iNb?0ITPUB个人空间 e6}1o2bQyn
最好的可能就是将这些javascript代码从html代码中分离。也许有很多人马上就会想到,将这些javascript放到.js文件中,然后使用<script>标签引用一下就ok了。代码如下:
D:~!i;}1W\0ITPUB个人空间+T'knm q+z]-d4HmB
fun.js文件ITPUB个人空间%r.u q4U7@nD-H
!{M}g'L0function fun1(obj) { ... }ITPUB个人空间7aH ^A X x
V@?+Buz%\0function fun2() {... }ITPUB个人空间)w*^-l\ZJ Il
I%P*_F1V X3Z\3~0
y2b_~*Cd6yg7xq0N0index.html文件ITPUB个人空间-O Z'p K9`9C-{7A!_d%]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4rBh rv$k0<html>
Yh'[{yL0 <head>
;K,S^L\ H1Q.aE0 <title></title>ITPUB个人空间3y+EZ!f8fB
<meta. http-equiv="Content-Type" c>
`6l+zW^4U9e[0<script. type="text/javascript" src="fun.js">ITPUB个人空间R zd.^z ex
</script>ITPUB个人空间*dYVKZ)L)V Ze(S
</head>ITPUB个人空间`$Z^7b Z$E@g
<body>ITPUB个人空间~c1E wd
<input type="button" value="按钮1 " />ITPUB个人空间Js#D0R n+njAHs%f
<input type="button" value="按钮2 " />ITPUB个人空间H!^Z n@F0S*E
ITPUB个人空间0~E,ecS\+E
</body>
1kB(u|5{-_ Sz+d0</html>
0NTt`j5{hfU0ITPUB个人空间ChET K)Q#u'A
虽然上面的代码从某种程度上达到了视图和逻辑分离的效果。但仍然有着一定的联系。我们可以看到,两个<input>标签的onclick事件不还是引用着fun1和fun2函数吗!其实美工人员是不关心这两个函数到底是做什么的,甚至并不需要知道它们的存在。那么是否有更高的方法呢?答案当然是肯定的,就是通过动态的方式指定onclick事件,而这一切美工人员是完全没有感觉的。
:|4k[#B"nL!IR0
9j*H$n'Y5FE&^0 我们在文章的开头提到了MVC模式。其实在客户端也存在着一个MVC体系结构。我们可以将视图(V)看成是描述界面的html、css和javascript代码,而模型(M)可以看成是处理业务逻辑的javascript代码,而控制器(C)就是将这两类代码连接起来的代码(一般也是javascript代码)。
Oj5a(ZWZ#I@$a0
:fC[5B9Ah6oF3y0 在本文中给出了一个小例子来演示一下如何通过动态的方法将V和M分离。这个例子是通过<div>实现的10个小方块,点击其中的某一个,会将相应的数字追加到下方的文本框架中,并且加入了一些用javascript实现的效果,如以一定间隔随机更新方块和数字的颜色,直接在文本框中输入数字后,相应的文本框和数字的颜色也会随机发生变化。界面效果如图1所示。ITPUB个人空间,x6w&`|+}8r
ITPUB个人空间!\z:B1p&{ S}
ITPUB个人空间t&l}JJ ~

IgDH_"z001_mvc_web.jpg
$}ePl i.kf2S;W0ITPUB个人空间W%Q_:Vo{m&I
图1ITPUB个人空间u xE D2l3V
RxAZD0 下面先来实现View。先看看如下的代码:ITPUB个人空间L$c2?gA)MuK
SH$Nfz$mP3U'ws0numberKeys.htmlITPUB个人空间T9S1_O%W"s*oM
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">ITPUB个人空间FCbB.L%p
<html>ITPUB个人空间3v-o Z8F0Ay$f
<head>
NI fSlJ0 <title></title>ITPUB个人空间5c#S\;DN!h wWM3w,Um
<meta. http-equiv="Content-Type" c>
SiV]3`+m1}Bg0 <link rel="stylesheet" type="text/css" href="my.css"/>ITPUB个人空间0v(T9}3aO"~?;E
<script. type="text/javascript" src="addevents.js">ITPUB个人空间m3J;nP O/zj6e
</script>
\/[S2nMs|0O0
Ix6~;[6C5K [0 </head>ITPUB个人空间%A]s4A9~
<body>
e&a3Q)I,p5^0 <input id ="changeColor" type="button" value="开始变换颜色" />
LvA s[`1zc0 <br/><br/>
#X)F:k/I2mgH0
V7^{(C}0 <div id ="nubmerKeys" class="numberKeys" >
X `R8ofaX?0ITPUB个人空间 `\X3}h%WBn
</div>
Axj7]B$P0 <br/><br/>ITPUB个人空间;H LE's)r2V
<br/><br/>
"ZSu1e;z1j[f0
1O YAs8X&F"VV0 MVC模式(Model-View-Controller)常被用在Web程序中。如Struts框架就是一个基于MVC模式的Web框架。所谓MVC模式,就是将视图(也就是客户端代码,包括html、javascript等)和模型(和数据库及业务逻辑相关的Java代码)分开。并通过控制器将两者联系起来。这样做的好处可以使客户端开发人员和服务端开发人员的工作尽量分开,以使他们之间的干扰降到最低。
F7?7zgD[0 虽然象Struts这样的框架可以很好地Model和View分离。但是对于客户端的代码,仍然存在着一定的视图和逻辑混合的现象。如下面的代码所示:
g:?6S$n%A-nh0ITPUB个人空间4M|'_s:~!c$Kp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&~9m+y+B6LL)R-F0<html>ITPUB个人空间)J&s-R~ C^lI6G
<head>
F {xb/TY0 <title></title>
&|$pEE_Ll'bUo0 <meta. http-equiv="Content-Type" c>
u4]4]4D-}N~j1vtv0 <script. type="text/javascript" >
{o(}!R4z-K*g0 function fun1(obj) { }ITPUB个人空间*f1|"C?z;Hr8Q
function fun2() { }
az:erJO&V@c0 </script>
Xnvo`6D0 </head>
(Y d.H8k2N/E8ek1c0jJ0 <body>
@ SQ8q$r9H^.j[0 <input type="button" value="按钮1 " />ITPUB个人空间C9l L^&|e%D
<input type="button" value="按钮2 " />
_A4q\@H0
:t#Y{j x0 </body>ITPUB个人空间1W;Rw~8|'@C5B3fq(I
</html>ITPUB个人空间$t0Gjw7T!|K)D:[
ITPUB个人空间-E]{u,V/I#A
从上面的代码可以看出,html代码和javascript代码都混在了同一个html文件中。在一般情况下,客户端的界面是由美工设计的,而对于javascript代码,美工一般是不参与实现的。这些代码一般也应属于业务逻辑代码的一部分,虽然它们都在客户端运行,但可能也会处理一定的业务逻辑,如验证数据的正确性。尤其在AJAX应用中,在客户端还会通过http协议从服务端获取数据。这样就和业务逻辑绑定得更紧了。因此,如果将用于描述界面的html和用于处理业务逻辑的javascript(渲染界面的javascript除外)混在一起,非常不利于团队中负责这两方面的人员进行协调。
-w iNb?0ITPUB个人空间 e6}1o2bQyn
最好的可能就是将这些javascript代码从html代码中分离。也许有很多人马上就会想到,将这些javascript放到.js文件中,然后使用<script>标签引用一下就ok了。代码如下:
D:~!i;}1W\0ITPUB个人空间+T'knm q+z]-d4HmB
fun.js文件ITPUB个人空间%r.u q4U7@nD-H
!{M}g'L0function fun1(obj) { ... }ITPUB个人空间7aH ^A X x
V@?+Buz%\0function fun2() {... }ITPUB个人空间)w*^-l\ZJ Il
I%P*_F1V X3Z\3~0
y2b_~*Cd6yg7xq0N0index.html文件ITPUB个人空间-O Z'p K9`9C-{7A!_d%]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4rBh rv$k0<html>
Yh'[{yL0 <head>
;K,S^L\ H1Q.aE0 <title></title>ITPUB个人空间3y+EZ!f8fB
<meta. http-equiv="Content-Type" c>
`6l+zW^4U9e[0<script. type="text/javascript" src="fun.js">ITPUB个人空间R zd.^z ex
</script>ITPUB个人空间*dYVKZ)L)V Ze(S
</head>ITPUB个人空间`$Z^7b Z$E@g
<body>ITPUB个人空间~c1E wd
<input type="button" value="按钮1 " />ITPUB个人空间Js#D0R n+njAHs%f
<input type="button" value="按钮2 " />ITPUB个人空间H!^Z n@F0S*E
ITPUB个人空间0~E,ecS\+E
</body>
1kB(u|5{-_ Sz+d0</html>
0NTt`j5{hfU0ITPUB个人空间ChET K)Q#u'A
虽然上面的代码从某种程度上达到了视图和逻辑分离的效果。但仍然有着一定的联系。我们可以看到,两个<input>标签的onclick事件不还是引用着fun1和fun2函数吗!其实美工人员是不关心这两个函数到底是做什么的,甚至并不需要知道它们的存在。那么是否有更高的方法呢?答案当然是肯定的,就是通过动态的方式指定onclick事件,而这一切美工人员是完全没有感觉的。
:|4k[#B"nL!IR0
9j*H$n'Y5FE&^0 我们在文章的开头提到了MVC模式。其实在客户端也存在着一个MVC体系结构。我们可以将视图(V)看成是描述界面的html、css和javascript代码,而模型(M)可以看成是处理业务逻辑的javascript代码,而控制器(C)就是将这两类代码连接起来的代码(一般也是javascript代码)。
Oj5a(ZWZ#I@$a0
:fC[5B9Ah6oF3y0 在本文中给出了一个小例子来演示一下如何通过动态的方法将V和M分离。这个例子是通过<div>实现的10个小方块,点击其中的某一个,会将相应的数字追加到下方的文本框架中,并且加入了一些用javascript实现的效果,如以一定间隔随机更新方块和数字的颜色,直接在文本框中输入数字后,相应的文本框和数字的颜色也会随机发生变化。界面效果如图1所示。ITPUB个人空间,x6w&`|+}8r
ITPUB个人空间!\z:B1p&{ S}
ITPUB个人空间t&l}JJ ~

IgDH_"z001_mvc_web.jpg
$}ePl i.kf2S;W0ITPUB个人空间W%Q_:Vo{m&I
图1ITPUB个人空间u xE D2l3V
RxAZD0 下面先来实现View。先看看如下的代码:ITPUB个人空间L$c2?gA)MuK
SH$Nfz$mP3U'ws0numberKeys.htmlITPUB个人空间T9S1_O%W"s*oM
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">ITPUB个人空间FCbB.L%p
<html>ITPUB个人空间3v-o Z8F0Ay$f
<head>
NI fSlJ0 <title></title>ITPUB个人空间5c#S\;DN!h wWM3w,Um
<meta. http-equiv="Content-Type" c>
SiV]3`+m1}Bg0 <link rel="stylesheet" type="text/css" href="my.css"/>ITPUB个人空间0v(T9}3aO"~?;E
<script. type="text/javascript" src="addevents.js">ITPUB个人空间m3J;nP O/zj6e
</script>
\/[S2nMs|0O0
Ix6~;[6C5K [0 </head>ITPUB个人空间%A]s4A9~
<body>
e&a3Q)I,p5^0 <input id ="changeColor" type="button" value="开始变换颜色" />
LvA s[`1zc0 <br/><br/>
#X)F:k/I2mgH0
V7^{(C}0 <div id ="nubmerKeys" class="numberKeys" >
X `R8ofaX?0ITPUB个人空间 `\X3}h%WBn
</div>
Axj7]B$P0 <br/><br/>ITPUB个人空间;H LE's)r2V
<br/><br/>