2012年(366)
分类: 系统运维
2012-03-13 19:35:35
GWT 本质是个toolkit,不是一个framework, 它提供了比较丰富的wigdet,但是如果只依靠其提供的 wigdet,那么可以其widget还是远远不够丰富的。所以一些基于GWT的extention就应运而生了。常用的extention库有GWT-ext,smartgwt等。因为在smargwt的showcase里面看到他们的listgrid 组件性能特别符合我的需要,最后选择了gwt+smartgwt。
smartgwt有好几个版本,开源免费版,还有付费的企业版,个人开发者版和至尊版。看过企业版的showcase,应该说是功能相当强大的好东西。企业版smartgwt提供了一套他们自己的framework技术方案,用来解决JEE的3tier间数据交互过程。当然这个都是付费的,所以它的自己的这套framework没有在我的考虑之内。
因为GWT不是一个framework,而是一个提供了很多组件的toolkit。在开发中就会遇到怎么设计网站架构的问题。我不是专家,所以在看待问题的时候,没能一眼就知道了自己需要用怎么样的解决方案,而是等到问题显现时去努力找出来问题所在,然后针对性的去找到解决方案。
作为JEE Framework, 首推Spring Framework,彻底体现了JAVA的博大精深。Spring的设计模式特别适合server端。要是能够选择GWT+SpringMVC的组合,那就太让人心动了,GWT处理Client端,SpringMVC负责Server端。可惜,这么好的两个东西要融合在一起,如果没有对两者都有很深的了解,对新手难度还是相当有的。Spring+GWT项目反馈中,有一部分人反映很好用,有一些人觉得有点难处理。问题在哪呢,问题在GWT在客户端和服务器端的通信通过Remote Procedure Call上面。SpringMVC+GWT融合的资料相当少。看到过有人发过一个blog把SpringMVC的servlet dispatcher和GWT 的通过extends 还是implements的方式结合在一起,不过看起来还是很牵强。最后还是放弃了SpringMVC+GWT的设计模式。用了最基本的gwt的RemoteServletDispatcher和gwt的MVP设计模式。实践证明,MVP相当适合GWT开发。
另外一个纠结的问题来了,smartgwt对MVP设计模式的支持程度。在逛论坛或者博客的时候有个很好玩的现象,smartgwt的开发者常常抱怨smartgwt对MVP支持不够,每当这个时候,smartgwt的“水军”出现了,义正言辞的争辩MVP不是适合smartgwt开发的设计模式,smartgwt有自己的设计模式。这个是事实啊,连数据库persistence这部分会出现的serialize和deserialize的问题都给你想好了,但是它的这个设计模式服务是要付费的啊。所以应用MVP设计思想在面对smartgwt的时候确实要多做一步考虑。
既然选了开源免费版的smartgwt,只能自己对自己负责了。接下来一个问题要考虑的是,data access这一层,用什么方案。gwt的java外表下其实包装的是javascript的内心。数据串通过rpc从客户端传到服务器端再把结果从服务器端传到客户端,传输的是POJO,简单古老类。这就要求数据从数据库通过data access返回时也是POJO,否则无法deserialize. 可惜,JEE里面相当流行的data access所用的hibernate 或者JPA方法,偏偏得到的都不是POJO。这是个相当让人头疼的问题。
在这种情况下,也不要绝望。在GWT下这有好几种处理方法。情况分纯rpc还是gwt的requestfactory. 纯RPC如果用hibernate那么有Gilead解决方案,Gilead就是以前的hibernate4gwt, 它的思想就是在把hibernate里面用Entity Manager得到的object和rpc端传输的同一个objet,通过一个管道传输,使得两端不会出现serialize的问题。还有更加直接的就是data access object了,也就是说,把Entity Manager得到的object的内容原模原样的复制到另一个POJO中。但是当项目边大,需要persistence的object越多,这种DAO的方式就显得有点麻烦了。还是比较推荐Gilead。如果你选择的是requestFactory那么,JPA是个最佳选择,就不要用hibernate了。因为requestfactory就是以能兼容JPA吸引人吧。
由于在做项目的时候也是一步一步开发,就像盲人摸象,一条腿一个鼻子的摸才慢慢琢磨出来大象到底长什么样。在我的技术方案中,我一开始就选择了smartgwt+hibernate,如果我要把我的设计换成requestFactory+JPA那么需要考虑时间成本。所以最终还是保持了smartgwt+MVP+rpc+hibernate+Gilead+springSecurity的构架.
(未完待续)