1Grails框架综述摘要:JavaEE是目前使用最为广泛的Web应用开发平台,然而,JavaEE包含一套复杂的规范,开发效率较低。针对这一情况,本文介绍了一种新的开源框架Grails,它基于Groovy编程语言,构建于Spring、Hibernate和其它标准Java框架之上,为大家带来一套能实现高速生产力的框架。本论文对Grails框架、Grails框架的发展历史进行简要介绍,分析了Grails框架的现状和未来的发展趋势,目前国内外的主要成果及存在的问题等。关键词:Grails框架;Groovy语言;MVC;Web应用开发一、Grails框架简介Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。与以前的J2EE规范相比,Grails的目的在于帮助开发人员更快地创建Web程序。Grails形成于2005年夏天,那时Groovy语言正以惊人的速度发展。一小群Groovy爱好者对动态语言框架的强大功能感到震惊,但是由于无法将它们用在已有的Java平台上,所以组织起来使用Groovy开发了一个动态框架,并按照RubyonRails将其命名为GroovyonRails,后更名为Grails,由于这时Groovy语言本身已经达到企业应用的成熟度,因此也为Grails的形成创造了良好的时机。Grails的目标就是超越其他语言在Web领域的框架,为此Grails把目标集中在以下三个方面。与Java平台紧密结合。提供简单的接口,同时保持调用底层Java框架的灵活性及其特性。改进Java平台已有的缺点。为什么使用Grails呢?业务需求的快速变化使得JavaWeb的开发越复杂,原因之一就是当今众多Java领域的Web开发框架不仅使用复杂,而且没有很好的的遵循Don’tRepeatYourself(DRY)原则。像Rails,Django和TurboGears这样的动态框架在Web开发领域开辟了一条新道路,Grails基于这些概念之上,采用动态方法减少了Java平台上进行Web开发的复杂度,不过与那些框架不同的是,Grails是构架在Spring和Hibernate等Java已有的技术之上的一个full-stack框架,它借助于核心技术与相关的插件(plug-in)来解决Web开发中方方面面的问题。Grails遵循MVC设计模式,并构建于Spring、Hibernate、SiteMesh和其它标准Java框架之上,从2而为大家带来一套能实现超高生产力的一站式框架。图1.1表明了Grails和Spring、Hibernate、Quartz等框架以及企业级Java之间的关系。图1.1Grails的构架模块Grails的核心是Java虚拟机(JVM),Java和Groovy都是通过该虚拟机被编译成字节码。接下来,Spring、Hibernate、Quartz等框架都是建立在Java语言和Java虚拟机之上的。Groovy虽然可以在Grails之外与这些API协作,但是Grails仍然控制着企业级Java和Groovy高级特性之间的联合,以便能为构建Web应用提供一个简单的环境。如图1.1所示的许多框架尽管被称作轻量级框架,但其API仍然太过复杂。正因如此,Grails的主要目标之一就是结合Groovy的动态特性在这些框架之上为用户提供一个便于使用的抽象层。Grails使用Groovy语言进行开发,而Groovy又是运行于JVM,这一特性对广大Java开发者来说吸引力巨大,使用Grails意味着即可以继承原有J2EE项目资产,也可以体验敏捷开发框架带来的高效与便捷。Grails开发框架目前在国际上已经有了较为广泛的使用,Grails文档、社区、开发资源也有了一定基础。但国内对于Grails框架应用仍然处于“观望”状态,在国内拥有广大Java开发者这一背景下显得较为尴尬。二、Groovy动态语言使用Groovy来实现Grails,这使得Grails有了良好的开端,因为Groovy的目标之一就是让Java程序员可以无缝地向动态脚本语言过渡,而且为他们带来静态类型语言所不具有的高级特性。虽然发布时间不长,Groovy已经成为一门稳定且功能丰富的语言,这也为Grails奠定了坚实的基础。Groovy官方网址()对Groovy的定义是:Groovy是一种基于JVM的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多GrailsJavaEnterpriseEdition(JEE)SpringHibernateQuartzTheJavaLanguageTheJavaDevelopmentKit(JDK)TheJavaVirtualMachineGroovy3强大的特性,是一种可以无缝运行在Java虚拟机上的敏捷动态语言,对于Java开发者来说可以用几乎为零的学习成本来使用现代最流行的编程语言特性。Groovy与Java有着惊人的相似性,有些代码几乎无法分辨出使用的是Groovy还是Java,不过用Groovy编写的代码会具有更强的表达性。由于二者具有太多的相似性,以至于Java开发者可以很轻松地向Groovy转变。Groovy可以被看做Java语言的一个超集。Groovy和Java共享相同的对象和运行模型,即它们在JVM上的操作是一视同仁的。Groovy可以直接将代码编译成字节码(.class文件),这就保证了它在Java虚拟机(JVM)中能够共享相同的对象模型。实际上,Groovy对象就是一个Java对象,并且也使用Java编译器和虚拟机(VM)。此外,在Groovy发展路线图中Groovy2.0版本重点解决Groovy的性能问题,比如Groovy2.0版本已经提供了静态编译特性的支持,对性能改进非常明显。三、Grails和MVC模式Grails是一个遵循MVC设计模式的Web开发框架,它分别用DomainClass、View、Controller对应于MVC的模型、视图和控制器。某种意义上说Grails是变相的SpringMVC应用。SpringMVC是Spring框架内置的MVCweb开发框架,其优秀的设计和框架结构都非常适合在其基础上构建另一个像Grails这样的框架。一般情况下在Grails中,客户端浏览器(Browser)发送请求(Request)至服务器(WebServer),服务器经过路由(Routes)及请求转发(Dispatcher)将请求转发至对应的控制器(Controller)中的某个方法(Action),Action中处理该请求调用Model相关业务逻辑方法执行数据持久化或数据查询,处理完的结果在转交给视图(View)呈现,最终视图的处理结果以响应(Response)的方式传输给客户端浏览器,由客户端浏览器解释呈现给用户。4图3.1GrailsMVC架构Grails使用MVC模式来组织应用程序的结构,实现对应用程序的领域模型,用户接口或视图以及控制器逻辑的分离。这样可以对着眼点进行分离,并最小化构件之间产生混合逻辑的风险。可以简单地把一个DomainClass理解为数据库中的一张表,Grails在底层通过Hibernate将DomainClass和数据库的表进行了映射。Model(域模型层):负责业务实体的存储,主要是通过GORM(GrailsObjectRationalMapping:Grails对象关联映射)实现的,GORM利用底层Hibernate屏幕了对数据库的操作细节,程序员只需要专注于域模型构建,而不用花精力去考虑数据库如何实现,甚至不用自己建表、建库。这样通过oo(面向对象)方式来操作数据库的方式,显然能够大大提高工作效率。通过配置,GROM可以将Domain与不同类型的数据库实现关联映射,常用的数据库包括MySQL、SQLServer等。View(视图):View在Grails中指的是GSP页面(注意是GSP不是JSP),GSP中提供了易于使用的标签和语法,它用于显示用户界面。GSP与JSP类似,既可以编写静态网页的元素,也可以嵌入Groovy代码实现动态内容。Controller(控制器):在Grails中,控制器主要功能是处理请求,通过在Grails中编写Action调用业务逻辑并返回响应,这其中封装了绝大部分的基础CRUD业务逻辑。但需要注意的是把所有业务逻辑放到Controller中是不可取的,通常正确的做法是将核心应用程序逻辑放置在Service中。Controller在Grails中ModelViewControllerDispatcherrRoutesWebServerBrowserMySQL5充当着重要的角色:它可以响应用户的请求,可以接收用户提交的表单,还可以访问模型的数据,并传递给View。四、对Grails的一些误解作为新兴事物的Grails,人们还对其存在一些误解。(1)Grails还不够成熟。事实上,已经有越来越多的组织和个人选用Grails技术开发网站,Grails官方站点已经列出了上百个使用Grails技术的成功商业案例。此外,由于Grails本身是基于Hibernate、Spring和SiteMesh这些成熟完善的框架而构建的,因而无需担心它的成熟程度。(2)Grails是否只是Rails的一个克隆产物。RubyonRails引入了不少非常好的主意,Grails将其中的一部分应用到了Groovy/Java世界中,并且还加入了许多Ruby中并不存在的特性和概念,所有这些东西都是以一种对Groovy和Java程序员有意义的方式展现出来的。(3)有了JRubyonRails之后,谁还要Grails呢?Grails的目标与JRubyonRails大为不同。它不是为了在Groovy语言上实现一个Rails的移植版本,而是将业界最为强悍的组件(如Spring、Hibernate、Quartz、Compass和SiteMesh等)以最佳方式组合起来的一个实践,并通过采纳无配置规约使它们符合“不重复(Don'tRepeatYourself,DRY)”的原则。Grails没有重复造轮子,而且,由于Grails内核的绝大部分代码都是以Java编写的,它也显得更加强壮、稳定和高效。事实上,从内核角度看Grails应用,只相当于是一个SpringMVC应用,因而可以被部署到所有的主流容器之上,包括大型的商业容器,如WebLogic、WebSphere和OracleAS。五、Grails框架的优势与不足Grails框架本身的优势在设计实现过程中充分得以体现,具体来说有如下几点:1、约定优于配置Grails吸收了Rails所遵循的DRY和约定优于配置的思想,并将这些最前沿的设计理念带入已显得陈旧的J2EE社区,借助于这两点,Grails提供了比传统J2EE开发框架高得多的开发效率。2、运行于JVM、拥有成熟稳重的运行环境JVM经过多年的发展已经非常成熟,堪比业界标准级别的运行环境。Java6运行环境存在并成功运行多年,与Rails相比,在运行环境性能上Grails的优势非常明显,此外,已有的Java可重用组件基本都可以直接使用Grails,这对拥有多年技术及代码积淀的J2EE开发团队非常重要,这无疑也是Grails的一个明显优势。3、完美的插件系统Grails社区已经提供了各式各样的插件。基本上开发过程中遇到的各种问题都可以找到相应的插件帮助解决,充分利用好已有的插件,可以进一步加快Grails开发过程。比如在短网址项目部署时通过CloudFoundryGrailsPlugin可以很方便的将项目部署至CloudFoundry云服务平台。4、技术堆栈Grails是已有且成熟的J2EE组件和框架基础上集成而来,其中包括了Spring,SpringWorkflow,Hibernate,SiteMesh,JUnit等。这些开