基于客户端的MVC架构

09-12-23 banq
                   

在当前模型驱动设计DDD和share nothing架构驱动下,以及基于分布式CAP定律和BASE理论的普及,Web本质上作为一个分布式系统的认识越来越受到很多人注意,因此,基于浏览器的RIA应用越来越普及,如google的GWT等等。

将这么多概念揉合在一起,可能你有点茫然,他们之间有关系吗?浏览器作为富客户端,越来越有必要做更多的事情,包括和Client操作有关的一切,例如Session等,这样,减轻服务器端负担,使服务器端不必被客户端Session绑架(Stick to session),从而实现更好的可伸缩性Scalable。

为了实现这点,曾经天经地义在服务器端实现的MVC模式也被搬到RIA浏览器中,当然主要是VC两个部分,和服务器端交互的就是Model,而服务器端摆脱了客户端Session约束,专注对Domain Model实现伸缩性,这种分布式的分工俨然是合适的,如果再结合BASE理论,如果我们需要高一致性,就将数据作为Model的字段,否则,由RIA浏览器通过AJAX再次实现读取,或者通过Web Sockets由服务器端推到客户端。

所以,Web架构两个趋势:胖客户端RIA + 胖领域模型(也就是服务器端的充血模型)。

在浏览器客户端实现MVC好像只有Swing或VB专有语言才能实现,实际上现在基于Javascript的MVC框架非常多,这里介绍一个基于JQuery的MVC框架coreMVC,使用起来比较简单易行。

corMVC: An jQuery-based MVC Framework一文介绍了coreMVC如何使用?

下面是coreMVC架构:

以contact应用为例,实现步骤:

1.建立一个“contact” model,取名为 “contact.js”

2.建立controller MVC中的控制器,在这个控制器中实现contact模型的增删改查CRUD流程划转。addContact, editContact, deleteContact等方法分别是新增 编辑和删除,与服务器的RESTful接口交互,如下代码:

function Controller(){
		// Route URL events to the controller's event handlers.              
		this.route( "/", this.index );
		this.route( "/contacts/", this.index );
                 ///contacts/add/很REST
		this.route( "/contacts/add/", this.addContact );
		this.route( "/contacts/edit/:id", this.editContact );
		this.route( "/contacts/delete/:id", this.deleteContact );
                .....
 
	};
<p>

更多Controller代码可见原文。

3.建立MVC的视图,比如 “Contact List“(Contact列表), “Contact Form”(单个Contact表单) , 个人感觉coreMVC实现View比较复杂了些,View视图实际直接使用html实现即可,js只是将Model数据填入到html的表单form或相应的html字段中即可。

更多服务器体验搬迁到客户端,可见这个视频,当然只是展示一个新的idea。

[该贴被banq于2009-12-23 13:15修改过]

                   

9
itian
2009-12-24 11:32

我现在也特迷信 胖客户端 之前的项目都是用 css + js 实现的客户端,整体作下来对 html, css, js 的胖客户端挺失望,(没实际开始做,只是猜想)相比插件式(Flash, Applet)的 胖客户端 来说, 前者要解决的问题又多又麻烦, 光是一个页面的浏览器兼容就搞死一帮人,然后有些系统需要服务器主动往客户端发信息,js没辙,最后用了tomcat comet的实现才完成这个系统,最近也看到banq发的WebSocket信息,好像给js带来了一些希望,但我却是觉得绝望,浏览器之间的统一,到什么时候各大浏览器才能全都支持,而现在插件式的胖客户端N年前已经能用Socket了,前段时间也看到篇文章说WebGL,我也是差不多的想法,js写opengl,而且现在还是在构想阶段,插件式的胖客户端的现在已经可用了,Flash10开始支持opengl, java这块我所知道的就有2个opengl的实现,而且才好几年前就已经有基于Java3D浏览器上的Applet的Web3DGame了。

[该贴被itian于2009-12-24 11:34修改过]

banq
2009-12-25 11:26

>光是一个页面的浏览器兼容就搞死一帮人

这个主要是使用JS思路不对,使用JS一定要使用框架比如Jquery或Prototype.js等等,js框架帮助你解决了兼容性问题。所以,各大浏览器是否统一这些问题都是平台以下问题,这个问题JS业界已经解决,不是我们应用者应该考虑的。

使用JS做业务计算肯定是兼容的,这是关键,显示效果等和设备相关的可能不同浏览器结果不一样,但这已经被jquery框架解决。

要把浏览器看成是操作系统,Java解决了linux和windows操作系统跨平台问题,而JS解决了跨浏览器问题,两者都是异曲同工。