李锟

汉家烟尘在东北,汉将辞家破残贼。男儿本自重横行,天子非常赐颜色。摐金伐鼓下榆关,旌旆逶迤碣石间。校尉羽书飞瀚海,单于猎火照狼山。山川萧条极边土,胡骑凭陵杂风雨。战士军前半死生,美人帐下犹歌舞。大漠穷秋塞草腓,孤城落日斗兵稀。身当恩遇恒轻敌,力尽关山未解围。铁衣远戍辛勤久,玉箸应啼别离后。少妇城南欲断肠,征人蓟北空回首。边庭飘飖那可度,绝域苍茫更何有。杀气三时作阵云,寒声一夜传刁斗。相看白刃血纷纷,死节从来岂顾勋。君不见沙场征战苦,至今犹忆李将军。

原创 RIA+REST如何来化解Java的劣势收藏

新一篇: 给热爱Ajax的朋友增添一些信心 | 旧一篇: REST的主要优势到底是什么?

我在前面两篇blog中都说到:“REST是简化Java Web开发的良药”。
Java的劣势在何处?与前些年相比,现在看的已经很清楚了,Java的劣势就在于做Web表现层的开发。Web表现层开发需求变化频繁,Java这类静态类型的语言不够敏捷,严重影响了开发的效率。

而JavaEE的一个最大的缺点,就是企图在服务器端搞定一切,我将这种开发方式称作“传统集中式的开发方式”。标准的J2EE三层架构——Web表现层、业务层、持久层,也许对于传统的基于HTML表单的Web应用来说是恰当的,但是现在已经显得落伍了。JavaEE企图在服务器端完全搞定Web表现层的开发,给自己制造了一个大麻烦。无论是从这门语言本身,还是从支持这门语言主要的公司Sun、IBM、BEA、Oracle来说,他们并不擅长此道。擅长此道的是哪些公司呢?Adobe/Macromedia、M$、Borland/CodeGear。

如果Web表现层必须要在服务器端开发,Ruby on Rails的优势与JavaEE相比要明显的多。RoR要比任何主流的JavaEE Web表现层框架和技术(Struts、WebWork、Spring MVC、JSF、Tapestry、etc.)更加灵活,学习成本更低,开发效率更高。

换个思路来思考,如果我们不再假设客户端就是几乎毫无智能的Thin Client将会如何?假设我们能够充分利用客户端的Ajax组件库和各种RIA技术,将Web表现层完全或者绝大部分前推到客户端来开发,并且通过REST风格的API来与服务器通信,那么服务器的角色就变成了类似于Web服务提供者(注意:这里和Web服务还是有很大的差别,因为REST在这里是用于同一个应用内部的通信,即连接一个应用的客户端和服务器端)的角色,这样就能够极大地简化服务器端Java的开发工作,让它从自己所不擅长的领域退出来,集中精力做自己最擅长的一些工作。

这个趋势其实在3年多前我在JavaEye论坛中宣传基于XMLHttpRequest的开发方式的时候就已经看到了,现在这个趋势已经越来越明显了,新一代Web开发方式的面貌已经逐渐浮出水面。Adobe AIR/Flex、M$ WPF/Silverlight都是这样一类的开发方式,当然Ajax也可以以这种方式来做开发。我给这样一类开发方式取名叫做“RIA+REST”。

在服务器端搞定一切当然也有好处,因为这样可以获得最佳的控制,安全问题解决起来也比较容易。但是其代价就是无法得到最佳的交互设计,强迫用户不得不承受降级的使用体验。如果这样的用户体验是能够接受的,那么采用这种方式做设计和开发问题不大。但是如果这样的用户体验是无法接受的,那么就需要严肃地考虑RIA+REST的开发方式了。与传统集中式的开发方式相比,这是一类新型的分布式的开发方式,在一些方面(交互设计、服务器端架构)得到了简化的同时,也会使得一些方面(服务器端的控制能力、安全性)复杂化,所以要求架构师作出慎重的权衡。分布式应用必然会带来很大的复杂性,但是REST无疑是基于Web的分布式应用的最理想的架构风格,在Web领域REST的优势要比RPC和分布式对象等架构风格大的多。同时REST是简练实用的,可以很大程度上降低分布式应用的巨大复杂性。

根据我的经验,在绝大多数中小型项目中,Web表现层开发的工作量要比后面两层的开发工作量的总和还要大,也就是占到项目开发工作量的一半以上。当用户需要较为苛刻的使用体验时,传统集中式的开发方式完全无法满足要求,而必须由Ajax来补充。然而,对于有复杂交互需求的应用来说,RoR应用的开发效率同样也会受到基于DHTML的开发效率的拖累,而无法充分体现出其敏捷的优势。

如果Java将做Web表现层开发的负担卸掉,让客户端的RIA技术来承担,那么Java在服务器端开发中与Ruby相比的劣势就不是那么明显了,甚至在很多方面还有优势。从整体架构的开发效率来考虑,
RIA + REST + Java
RIA + REST + Ruby
两种架构组合也许可以达到大致相同的级别,即使Java在开发效率上仍有劣势,但是也不会像在传统集中式的开发方式中那样悬殊。有很多传言说基于RoR开发的项目与基于Java开发的项目相比,开发效率能够高出5-10倍。我虽然对于Java并不乐观,但是对于RIA+REST这种新的开发方式,我估计开发效率的差距应该可以降低到2倍左右。不过开发效率只是一个方面,如果服务器端的代码经过良好重构,重用性非常好,不会在半年之后就成为必须要抛弃的遗留代码,那么Ruby在开发效率方面的巨大优势也许只会停留在最初的阶段。随着代码的积累,这种开发效率的优势会逐渐降低下来。

Ruby会不会拥抱RIA呢?RoR 2.0将会是完全基于REST设计的开发框架,他们现在拥抱REST,就是为将来拥抱RIA做准备。对于传统集中式的开发方式来说,应用REST当然也会带来很大的好处,但是我认为这并不是RoR的主要的目的。RoR拥抱REST,是希望使自己在将来的技术变迁过程中处于一个非常有利的位置。对于未来Web开发技术的发展,REST处在一个核心的位置,它是连接客户端和服务器端的纽带,REST也会极大影响客户端架构和服务器端架构的设计和建模。“面向资源的Web应用”,将会是未来几年的一个技术热点。

Java在对于REST的支持这个方面行动要迟缓的多。官方正在制订的JSR 311规范主要还是面向不同的应用之间的集成,也就是主要覆盖SOAP所覆盖的领域,而不是面向RIA+REST这样一类新型的Web应用开发方式。不过,一些支持REST的Java框架已经存在,也可以基于Adobe的Flex框架(今年之内就会开源)来做设计,这些框架使得基于Java做REST设计和开发成为了一件比较容易的事情。我们不指望Sun已经有很多年了,日子不是一样过来了吗?Sun其实可以坦承:“我不做老大已经很多年了”。

综上所述,我认为支持REST对于JavaEE而言,意义甚至要比RoR更大。是否能够拥抱未来Web开发技术的发展趋势,对于Java语言未来的命运来说是至关重要的。

发表于 @ 2007年06月15日 09:38:00|评论(loading...)|编辑

新一篇: 给热爱Ajax的朋友增添一些信心 | 旧一篇: REST的主要优势到底是什么?

评论

#nowican 发表于2007-06-15 12:02:43  IP: 60.13.219.*
蛋蛋
#turingbook 发表于2007-06-16 00:03:51  IP: 218.95.47.*
很深刻,也很简明。
Restful Web Services一书的畅销说明,业界已经开始认识到REST的重要性和趋势性了。

但是另一本有关REST的书Ajax and REST Recipe却备受冷落,不知为何?
#XCL6996 发表于2007-06-16 10:43:28  IP: 125.62.23.*
java写页面,累
#mozilla 发表于2007-06-16 17:48:36  IP: 122.51.100.*
to turingbook:
Gross那本书评价不高,我觉得跟Gross本人的写作风格有很大的关系。我在翻译《Ajax模式与最佳实践》的过程中,就感觉作者的英文不是很出色。作者很多地方思考的非常深邃,但是讲解的却并不是很清楚。需要翻来覆去读几遍才能完全读懂。《Ajax模式与最佳实践》一本书与REST关系很大,但是作者却没有花一些篇幅去深入介绍REST究竟为何物,甚至没有给出到Fielding论文的链接。似乎他认为全世界的开发者都应该已经熟读了Fielding的论文,但是实际情况远非如此。我翻译完了这本书,仍然未能理解REST的具体含义,只得去翻译Fielding的论文。
我本来希望《Ajax and REST Recipes》能够弥补这个遗憾,但是看到电子版之后,感觉非常失望。这本书其实是类似于《Ajax Hacks》那样的案例研究,具体是讲Ajax能够解决哪些问题的,并不是我起初根据名称理解的是一本关于REST架构设计的专著。
#caihuan 发表于2007-06-18 08:59:13  IP: 221.216.5.*
我怎么觉得RIA,REST这些无非就是用Http的C/S,原来C/S的容器是操作系统,现在C/S的容器是浏览器。而REST充分挖掘了http而已。不知各位大侠怎么看
#fireflyc 发表于2007-07-23 17:24:46  IP: 60.191.227.*
昨天晚上我突然意识到一个问题~~~~~~~~~我们现在的web程序的URL太难看了。
所以我有了个疯狂的想法~~~我想用java做一个框架,来让URL变的好看。当URL好看了,REST就应该比较容易了。初步的想法~~~~~~~~~
#hawk_e2e 发表于2007-07-24 22:00:59  IP: 121.8.30.*
觉得JAVA不少架构其实以前在其它工具都见过(包括这个REST),也就是新瓶装旧酒,没多少新意。
有种感觉:JAVA这么多架构冒出来这么多宣传,无非是想自定业界标准。

我可以在这里预言:以后,WEB表现层跟WEB服务的交互主要用临幕者机制实现。所谓临摹,就是客户端界面某个组件的变化是通过临幕者根据服务端那里对应的虚拟组件的状态的“绘画”。这跟MVC里的C有些类似,但临幕者的“绘画”机制更智能。

不信,可以视目而待。
#hawk_e2e 发表于2007-07-24 22:02:23  IP: 121.8.30.*
上面应改为“...对应的虚拟组件的状态来“绘画”。...”
#candigan916 发表于2007-07-25 17:43:45  IP: 222.244.112.*
感觉收益非浅,顶
#damooo 发表于2007-08-14 10:33:18  IP: 121.77.139.*
J2EE开发中的View部分的开发是不大方便,期待有支持REST技术的好框架的出现。。。
#kudo23 发表于2007-11-25 22:47:49  IP: 121.19.196.*
分析得不错,我刚看REST论文时一头雾水,后来还是从其它网站找相关分析才明白的,用惯了MVC突然换到REST还真不知道如何下手,期待作者新的见解。。
#cnoss 发表于2008-06-06 11:29:42  IP: 219.137.38.*
向大家推荐一个REST的Java实现

http://code.google.com/p/jrest4guice/

特点:

* 基于GUICE,内置带事务的JPA实现
* 零配置式服务声明
* 服务的自动扫描注册
* 非侵入式,用户不需要实现特定的接口来实现Restful服务
* 支持Post. Get. Put. Delete操作
* 灵活的注入(支持上下文环境request/response以及参数的自动注入)
* 与JAAS的无缝集成
* 支持分布式资源对象
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © dlee