`
vanadiumlin
  • 浏览: 492530 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

颠覆臃肿的JavaEE开发框架(bloated Enterprise Java stacks)的Play框架1.0发布,它在很多方面有其革命性的独创,也有助于我们了解现在JavaEE框架的不足。

Play框架吸收PHP RUBY动态语言的特点,采取即时源码编写,即时激活,框架本身融合了编译器和服务器。取代了 compile-package-deploy 过程,提高产品的开发效率。Play框架甚至提供在线编辑器,在线修改BUG后即时投入应用。

主要架构特点:

1、一个非常简单的开发周期。此框架自动编译和重新装载源文件的任何改变。

2简单的无状态MVC架构:智能捆绑HTTP参数到Java方法参数。
Play框架认为一边是数据库保存状态,一边是浏览器也可以保存状态,那么还要中间件MVC保存Session状态干什么呢?
HttpSession
有很多问题,虽然可以处理针对某个用户的状态,但是万一用户中途离开怎么办,HttpSession对资源消耗,以及在可伸缩性方面是有问题的。Play框架秉承share nothing架构思想,不再象黑客那样破解原本自然正常Http模型,然后强行植入状态,无状态架构可以并行同时输出多个页面,提高Web性能。

3、内置基于Apache Mina的快速HTTP服务器。

4、一个基于Groovy的强大的模板引擎,具有多层继承,定制用户标签的能力,Play框架认为JSP & Expression Language模板机制很好,但是需要太多配置,吸收其模板设计,剔除配置。等。

5、优秀的错误报告功能:当发生异常,此框架会直接显示出错代码,甚至是模板代码。
6 RESTFul

众所周知的Servlet API Struts其实是扭曲的,使用奇怪的APIHttp协议隐藏起来,Play框架认为一个Web应用框架应该给用完整的 直接的对Http调用和使用,这其实就是RESTFul精神。

这样 URIplay framework的主要概念。

对一个Java对象的调用,不是写Java语句,而是使用URI就可以,如下:
GET /clients/{id}
实际是调用Clients对象的show方法。
7、集成JPA 持久层

Play框架采取JPA作为持久化,并且使其更方便使用。
个人意见:这段代码倒是直接将持久层和表现层直接耦合在一起,没看到Domain Model了。看来DDD需要普及到每个角落不容易啊。)
8整合了缓存支持,可以使用memcached作为分布式缓存
9融入了OpenID 这样单点登录SSO技术。
10提出组件重用,可以重用各种组件,包括CSS Javascript

个人点评:总体来说,Play框架是一个与Struts2 JSF Tapestry竞争的框架,但是又整合了持久层和服务器。

业务系统市场分析

90%web业务开源系统都是php版本的,特别是新兴产品的开源实现,java的身影几乎销声匿迹了。可惜java出身的人去阅读php风格的代码简直是一种受虐。这其实说明一个道理,java优美的架构还是很有价值的。但优美+务实的平衡才是最佳选择。
 框架对比:

 

 

 

 

 

运行方式与服务器兼容性:

 

Play 应用可使用这么几种方式运行:标准Servlet容器、独立服务器、Google App EngineStax 云计算平台,等等
你也可以将应用发布到标准的应用服务器上执行,大部分应用程序支持Play应用。

下面的应用服务器都可以用来运行Play应用

这些应用服务器经过测试是支持Play 1.0.2的,但其他版本尚未经过充分测试。

 

JBoss 4.2.x

JBoss 5.x

JBoss 6M2

Glasshfish v3

IBM Websphere 6.1

IBM Websphere 7

Geronimo 2.x

Tomcat 6.x

Jetty 7.x

Resin 4.0.5

 

详细分析与外界介绍:

下图是 Play Framework 框架中用到所有的 jar 包的集合,位于 {play}/framework/lib 目录

 Play! Framework 07年的一个项目,08年开源,091125日发布了1.0版。发布后我就一直在学习这个框架。现在正式发布版本已经是1.01版,而且1.1版本也在每日更新。可以在http://download.playframework.org 下载已发布版本,和每日的最新版。


 

bc. # Additional modules

# ~~~~~

mdoule.gwt=../gwt

module.cms=../cms

module.forum=../forum

module.directory=../directory



学习Play!的过程中,最经常的感受就是——简直太简单了!并不是说Play!是一个设计简单的框架,相反学习中发现处处都会发现Play!设计的完整,这种完整性甚至包括网站设计和学习文档Play!的简单之处在于它学习和使用起来非常简单。使用Play!新建项目,所有的目录结构都会自动建立。Play!摒弃了传统的JSP,Servlet技术(这太伟大了),自己提供了一套非常易用的MVC 框架。Play!内建了JPA的支持,内置了Hibernate作为默认的持久化引擎。

Play!
还内置了HSQLDB 数据库,支持内存数据库,非常方便做项目开发和测试。



Play!
Controller采用命名约定:



1 <form action="@{Application.createUser}">
2     <input name="name" />
3     <input name="password" />
4     <input type="submit" value="Create User" />
5 </form>




无需其他任何配置,Play!会自动映射form中的namepassword参数至createUser方法。



View
Play!使用以Groovy语法写好的html模板中去以render()方法的参数渲染,并将结果回传给客户端。

 

外界介绍:
Play!
虽然使用简单,扩展性却非常强大,篇幅所限所述不能详尽。http://www.playframework.org Play!的官方网站,推荐大家到这儿看看。Play!的文档非常详细,教程中有份手把手做一个Blog引擎的教程,相信照着做一下之后一定会让你学会Play! Framework,那时你一定会爱上她的!

 

 

貌似正常的开发流程,总要面对项目原型构建的问题,重新发明轮子,或者把以前的家伙式儿再搬出来reuse一下?此时此景,都不是最佳选择。

  90%web业务开源系统都是php版本的,特别是新兴产品的开源实现,java的身影几乎销声匿迹了。可惜java出身的人去阅读php风格的代码简直是一种受虐。这其实说明一个道理,java优美的架构还是很有价值的。但优美+务实的平衡才是最佳选择。


  这不,基于java的类RoR风格的full-stack framework的话题又回到我的视线内了,


  几年前是appfuse,基于此搞过几个小项目,但发现熟悉appfuse本身就已经稍重了。而appfuse看起来还真只是个toydemo show +study 为主。


  后来国内出现了springside,应该是借鉴了appfuse的思想,更简单,更符合国情一些了。基于springside开发中小项目也没问题,但国内的开源产品很少能在真正意义上通过多人协作持续变得越来越健壮,版本发布计划总是落单,向下兼容,核心代码等品质还不稳定。


  再到今天的play!framework,几个同事也对play!framework很看好,貌似是目前java阵营里最ROR,同时java开发人员又最易上手的框架了。


  不得不承认,web开发已经完全是php等脚本语言占优了,就算你开发新一代的企业级产品,你也会发现互联网化+轻量化也是个潮流。就算是IBM team collaboration software - Lotus Quickr ,虽然server端是开发了10多年的老系统。但quickr要做的也是在应用层上基于server做业务扩展。这样,再复杂的系统,在前端应用层上来看其实也可以轻装上阵了。


  很多java开发人员对ROR风格不屑一顾甚至根本不关注,不了解,也许是被sun+ibam下毒太深了吧?其实想想,spring的基于接口 bean管理的xml在很多时候也是写一次,到项目下线也未曾修改过。


  java本身也太过强调仅仅java语法层面上的通用,抽象,配置,甚至太OO了,在java诞生的时代,这种做法是很先进的,而当今web应用开发算是一个特定领域,这种不与时俱进,不考虑web开发实际特点的做法有点杀鸡用牛刀之嫌,必然打不过转为web开发场景设计的新的动态脚本语言。 java毕竟不是专为web开发设计的语言,随着时间的推移,java的身躯越来越笨重,版本升级很慢,期待jdk7加强对动态语言的支持:JSR292。但这还不够,就像ruby on rails一样。还得有一个rails框架支撑。java官方的脚步实在是。。。只能用非官方的框架了。


  在中国,企业级系统至少一大半是比互联网线上产品还小的系统。特别是中国互联网公司的玩得还是硬气功,之内的企业级系统开发很多还是停留在一个人,两三个人搞定一个系统的层次上。那这样看来,就算有人认为play!framework不一定适合巨复杂的业务系统,那怎么也很适合这样场景的系统开发了吧。


  appfuse更新的越来越慢,是有原因的。因为play!framework这样的新一代类java ROR full-stack framework已经初长成。GrailsJRuby,也占据新一代java ROR full-stack framework的市场,但与之相比,play!framework的好处是兼容现有的java代码,语法,更加适合过渡期的需要,当然由于基于java这种强类型的静态类型安全检查语言,这也势必通过一些hack手法使play!变得很ROR


  周末网上找了些资料,在电脑上play了一下playframework,的确比appfusespringsideRoR,当然就更好用。


  play!framework 是无状态的mvc框架,搭配memcached,伸缩性应该没啥问题(集群水平扩展应该很好做。)


  play!framework 支持jrebel类似的j效果,修改java代码,无须重启,热部署,很方便。再也不用重复edit-complie-deploy-running漫长之路了,


  还有,java mvc框架最麻烦,最弱的就属view层的模板语言和js实现了,play!framework 采用的是Gsp Groovy server page),及jquery框架。模板语法简练很多。


  也不要被play这个词蒙蔽,play!framework 还是很DDD的。只有属性和getset方法的贫血模型不见了,取而代之的是有行为的充血模型,很DDD吧。


  play!framework 真的很full-stack,连httpserver都给你提供了,


  play!framework Python取代Maven来完成创建,运行等与系统的交互。appfuse之所以学习成本比较高,其实都花在maven本身的配置,理解,使用上了。Python应该更适合于系统打交道,更轻便吧。


  play!framework 本身支持插件机制。扩展应该也没问题。估计也一大堆可用的组件,这个很重要,http://www.playframework.org/modulesspring orm(应该也有Ibatis吧),lucene searchMongoDB,甚至Scala。都很不错。


  想在Model层用一下no-sq的话,Siena组件可以做介个(Siena orm+mongodb就可以了吧)


  
The siena module automatically enable Siena support for your application.

  
Read more at http://www.sienaproject.com/

  我想,支持可插拔组件的框架是衡量一个好框架最重要的指标,一下子事无巨细都塞给你,你肯定消化不良,由繁入减可太难了。好多开源实现都犯同样的问题。搞得你在相当长的一段时间内很头大,饱尝贪多嚼不烂之苦。play!framework 的默认配置可真清爽,连spring bean管理都不是默认配置,根据业务需求不断做加法,正是我想要的。哈哈。

缺点: 


  有人声称play!framework不适合多人协作开发,晕,门户网站千万级用户量的系统核心开发人员也不会超过5-8人。更何况,在多人开发的情况下也是尽量一人负责一块儿的,相反,现在好多开源框架恰恰过多考虑了不符合中国实际的多人协同开发场景,搞得框架分离得过于松散,过于流水线,搞得一两个人开发项目时,反倒觉得麻烦得要死。所以不适合多人协作开发好像也算不上什么缺点。


  ROR COC就是要改变java程序员妄图对一切应用都机械地力求基于接口编程,通用,显式配置才放心的习惯。大部分web应用开发只要做到webservice restful api层面上的面向接口编程,和通用性基本就足够了。不要忘了restful api本身已经是抽象得巨好的架构了。这样,web开发人员才可能提升开发效率,把时间和精力放到业务逻辑本身,这样才有敏捷开发的可能。想想,如果你的开发要点和时间都消耗在未雨绸缪,坐在椅子上凭空想象n年后的需求变更,而作所谓的基于接口编程,再加上缓慢的编译,部署,运行,怎么可能适应敏捷开发的要求呢?反而会导致一个项目虎头蛇尾,前期优雅得要命,后期丑陋得要命,都往action甚至jsp里堆代码了,何苦呢?反不如,一开始就低下你高贵的头颅,心平气和务实地去ROR了。

  总之,简单说,如果play!framework真的兼容了javaphpruby等动态语言的优势,那就是目前java人员web开发最佳的选择之一。




 

  • 大小: 577.6 KB
分享到:
评论
4 楼 cppmule 2015-01-10  
Play!在国内实际产品级应用案例有吗?有哪些公司在用?
国外的LikedIn内部是否大量好用?目前感觉Java开发人员更适合使用1.2.x。
3 楼 linkerlin 2012-03-12  
个人觉得,以后应该是web socket + 纯前端框架。
2 楼 winerdaxian 2011-11-15  
很好的文章,总结的真好!!!
1 楼 estn_h 2011-08-26  
很好!研究研究,还望多指点指点。

相关推荐

    从实例谈面向对象编程、工厂模式和重构

    现在可以总结一下,从 MediaPlayer 类的演变,我们可以得出这样一个结论:在调用类对象的属性和方法 时,尽量避免将具体类对象作为传递参数,而应传递其抽象对象,更好地是传递接口,将实际的调用和具 体对象完全剥...

    java 面试题 总结

    多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、...

    Qt入门PPT跨平台开发案例总结

    Qt入门PPT跨平台开发案例总结,包含多章案例。Qt是1994年成立的总部位于挪威奥斯陆的奇趣科技公司(Trolltech)提供的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI(图形用户界面)程序,也可开发非GUI...

    c语言课程设计-小型超市管理系统.doc

    摘 要 该系统主要是介绍超市进销存管理信息系统的环境、功能作用、所用到的语言、设计 的方案等各方面的内容。主要是让使用者了解此系统,使他们能更好的运用本系统,使 此系统发挥出应有的作用。本系统运用计算机...

    Java版水果管理系统源码-crifan_play_learn_logic_spirit:crifan的折腾精神、学习能力和逻辑能力的体现

    逻辑性比较强 有足够技术敏感度 有很强的折腾精神 善于总结 从而才能 能够快速学习新的技术 善于和能够解决复杂的技术问题 找到问题的根本原因 追根溯源 能想办法提高做事情的效率 详见: 总结出 和其他各种技术和非...

    论坛弹幕播放器(DZ测试可用,可以简单修改移植到PHPwind)

    总结:实现了基本的弹幕存储功能,但是管理很麻烦,而且安全性也有待加强,字段类型也弄的很随便,期待有强人来完善 若有问题可回帖,有时间我会回答,但不一定每个都回答(只针对本帖的内容和源码,在其他地方下的...

    基于单片机的数字时钟设计.doc

    Into hardware and software design guidelines and give full play MCU functions, most of the functionality through software programming to implement, simple circuit, high stability of the system....

    NLW4-React

    &gt;状态显示项目:总结 :check_mark: | 视频 :movie_camera: :laptop: 普罗耶托可以在Pomodoro上使用移动应用程序,并可以通过计算机对自己的运动进行临时性的修改。部署否请立即取消合同的解决方案:[商队]( )科莫...

    UnBiased App Reviews | Hi Tech Gazette-crx插件

    3.它可以在Google Play商店或任何其他商店平台上使用吗? 4.是免费还是付费? 5.用户对该特定应用有何看法? 6.如何下载和安装? 7.是否有逐步指南? 8.有手册吗? 9.下载任何应用程序会有哪些安全风险? 10.等等......

    websiteHealthScheduler

    :construction: 总结 :rocket: :construction: 目录 贡献者 :laptop: 关于该项目 HealthScheduler是连接Centro Hospitalar Vila Nova de Gaia / Espinho的用户的一种方式。 在移动应用高级专业技术课程的第二学期...

    android-examples:带有各种笔记和简单项目的 Android 示例

    流感事实和预防技巧在 Android 设备上以有趣、易于理解的格式进行总结和呈现。 Flu Aware 还可作为查找有关流感的其他信息和服务的资源。 您只需单击一下即可直接从 CDC 接收最新的播客或短信更新。 可在从 Google ...

    百度地图开发java源码-LK_SDK:蓝港Androidsdk有关文档

    为了项目维护起来更方便、代码可读性更强、同事之间接手项目更快速以及团队的开发更规范,根据我一年来的SDK开发经验,总结此文。不管是APP开发还是SDK开发,一个团队拥有相同的开发环境是很有必要的。所以我们首先...

    snowdreams1006.github.io:雪之梦技术驿站,snowdreams1006构建的Gitbook个人博客

    教程分享均是笔者亲身学习经验总结,涉及到的知识点均亲身试验,但有时为了知识转化,可能直接参与确认,对于这部分内容会明确指出,到时由读者确认试验。 如果Reader实际运行效果和教程演示效果有出入,很可能是...

    C 程序指导书及实践指导

    2、总结C程序的结构和书写规则。 实验二 数据类型、运算符和表达式 [实验目的] 1.熟练表达式的表示方法 2.了解表达式的运行结果 3.了解C语言中数据类型的意义 [实验内容和步骤] 1. 用printf函数来输入表达式...

Global site tag (gtag.js) - Google Analytics