小李的Grails基础教程1

 

第一章 Grails 简介

伴随着新一轮以动态语言为主的 Web 框架的到来, Grails 也开始初露锋芒。在本章,我们将首先介绍下 Grails 的历史,以及它受到如此关注的原因。

Grails 专为下一代 Java Web 应用程序而设计的框架,其借助于 Groovy 动态语言,使 Web 开发变得简单而方便。 Grails 尽量为更多现有的 Java 项目创建一个全面的框架(不仅局限于视图处理),这和当前一些 Java 框架提供给用户的一种 Anemic API 形成了明显的对比。

Grails 的出现并不是偶然的,而是随着 Web 应用的日趋复杂及 Web 2.0 Ajax 的悄然兴起发展起来的。不过在我们继续介绍 Grails 之前,有必要先探究一下如今其他的 Java 框架及他们的用户体验,因为正是他们的积累,才会产生 Grails 这样的框架。

1.1Java 的困惑

对于 Java Web 开发人员来说,一直期望着能出现一个无须太多配置的 Web 应用框架,能够帮助我们直接完成业务逻辑的处理,而不需要了解堆积如山的配置选项。虽然现在的 Java Web 框架中,越来越多的采用代码生成的方式来开发 Web 应用程序,可惜这些代码生成工具只能用来生成相关环境配置或只能用于应用程序的初期开发阶段。如果您作为一个对 Grails 感兴趣的程序开发人员正在阅读这本书,我敢打赌你一定经历过载 Java 平台上进行 Web 框架开发的繁琐步骤。

人们对改变这种 Java 开发 Web 应用的方式的探索已经进行了多年,而且不在局限于框架本身,还扩展到 Java Web 开发的方方面面。究其根源,要从最初备受推崇的 J2EE 规范(被 Bruce Tate 戏称为大象)开始,该规范一开始就使用了繁琐的配置,耗时的环境,而这些后来最终被证明是错误的,尤其在企业 JavaBean EJB )的开发方面。

在解决这些问题之前,开源社区就从实际出发,开发出了能够简化开发模型的 Spring 框架,以及使用简单 Java 对象( POJO )为基础的对象关系映射( ORM )框架 Hibernate

Web 开发过程中,静态类型的 Java 的却对 Web 框架的设计方式起到了推动作用。虽然动态语言已经在其他领域取得不菲的成就,但是借助于 Ruby on Rails (以下简称 Rails )、 Django (基于 Python )和 TerboGears (基于 Python )这些 Web 开发框架,动态语言才从众人的嘲笑中等到了出头之日,并且使大家都来时反思应该如何简化 Web 应用程序的开发。

在面向对象的大潮流下,采用 Ruby Python 等动态脚本语言构建的新一代 Web 框架中,都引入了“约定优于配置”( Convention Over Configuration )的概念。与大量的 XML 配置不同,文件或者代码本身遵守的约定就代表了应该如何配置。由于不在需要在这些繁琐冗长的配置上花费时间,所以传统的开发周期也将大大缩短,再加上动态语言的动态特性,可以在不重新启动应用服务器的情况下方便地进行调试和开发。应用程序能够以修改 / 重新加载的模式进行开发,并且其状态也可以得到保持,于是敏捷、可迭代的开发模式终于来了。由于这些框架可以在运行时进行配置和处理,因此能够提供更丰富、更具领域特定性的 API

脚本语言之所以能在 Web 应用开发中流行起来,不仅因为其能快速识别变化的能力(省去了部署的步骤),而且还因为其简单准确的语法。但是令人遗憾的是,由于脚本语言通常缺少面向对象的特点,而且还存在性能,可伸缩性,以及系统集成等问题,人们还是认为其不适合应用在大型系统中。

不过一切都在变化中,随着这些动态脚本语言的发展和硬件平台的进步,上述问题都一一得到了解决。而且现在的动态虚拟机( VM )也越来越完善,并已成为一个真正可行的选择,这也吸引了众多 Java 程序员开始从 Java 平台转向动态语言平台。

1.2Web2.0 时代

在过去几年中, Web 的发展可谓天翻地覆。从互联网泡沫破灭,到搜索引擎成为 Web 门户,再到个人博客与开放信息的迅速增长,可以看出 Web 已经越来越按照自己独特的方式发展。而在技术方面,其中最重要的变化莫过于 Web 应用程序在外观上越来越近似于桌面程序。长期以来,与桌面 GUI 的开发相比, Web 开发人员一直被视为只懂得钻研技术而不考虑用户的体验,不过这一切正在改变,而产生的本质原因就是 XMLHttpRequest

其实, XMLHttpRequest 早已在实际中得以广泛运用。微软首先通过自定义的 ActiveX 对象,实现了在 Outlook 中以 Web 的形式访问 Microsoft Exchange 服务器,自此拉开了一场新的革命序幕。

从本质上将, XMLHttpRequest 的目的是让客户端浏览器可以同服务器进行通信,同时又不需要刷新整个页面。要实现页面的这种局部刷新,就需要使用 JavaScript 向服务器发送异步请求。理论上,客户端和服务器之间可以发送和接受任何东西,不过技术上最早使用的是 XML 。结合服务器端的组件, Web 应用程序可以实现事件驱动( Event-Driver ),比如拖曳、自动补齐以及各种以前只有 Swing 才能实现的功能。不仅如此,很多用户还使用 Gmail Flickr 替代了邮件收发软件和照片管理软件。

从这以后就产生了 Ajax (异步 JavaScript XML ),同时也标志着 Web2.0 时代的到来。这项技术的意义十分重大,它可以让 Web 应用程序具备传统桌面软件的许多能力。但是它同时也增加了开发 Web 应用程序的复杂性,所需的时间成本,以及相应的专业知识。

不过增加复杂性的同时,也吸引了大量的软件工程专家纷纷踏入客户端办成的领域,而却因为借助于面向对象技术来创造简单可复用的组件, JavaScript 的函数库也正以惊人的速度增长。但是,不仅客户需要时间来适应,而且 Ajax 程序增长了请求数量的确定也开始显露出来。网络管理员不心甘情愿的接受 Ajax 程序的原因就在于其加重了后台服务器端的负担。同样,让程序员不能忍受的是目前现有的框架和工具都是围绕着传统的请求 / 相应模型来设计的,而并非针对于 Ajax 的异步机制。

此外,现有的 Java 框架遵循的是传统的开发—编译—部署的模式,而随着需求的增加和项目规模的扩大,这一过程明显缓慢而臃肿。 Ajax 程序在项目规模上不可难免的会大于传统的 Web 应用。这也意味着要在部署一个 Web 应用程序前的编译和打包环节花费更多的时间。

综合这些因素会发现,对这些 Ajax 应用的流程测试也开始成为问题。因为大量的状态保留在客户端,因此当应用服务器重新启动时,不得不重新加载浏览器,这在某种意义上是技术的一种倒退。框架首要的目的在于适应实际需要,但是这对于静态类型的 Java 虚拟机来说绝非易事,因为 Java 类需要被重新编译。而动态语言中这一情况恰恰相反,这些动态语言或者是解释运行,或者能够在运行时自动更新资源。

对于上述动态语言为基础的框架来说, Ajax 的到来如同雪中送碳,而且这些框架也纷纷为开发人员提供了对 Ajax 开发应用和自动加载的支持。在加上与 Prototype Acript.aculo.us JavaScrip 库的紧密集成,现在开发人员可以很容易地执行异步请求,监控 Html 元素,以及使用富有吸引力的特效。

此外,这些框架提供的迭代开发,零配置或者无发布周期,以及基于规约的变成,都使得成为极具吸引力的开发环境。

也许很多人会这样认为:这一跨时代的变革除了表明我们需要改变构建方式外,也暗示我们需要改变构建程序时所使用的技术,甚至其于是着 Java 的终结或者 Java 正在成为下一个 COBOL 语言。但是事实却并非如此。

1.3Java 的力量

不幸的是,不管这些动态框架有多好,还是不能被广大企业组织所接受,其原因很简单——不能无缝的集成 Java 。而且 Java 集成本身也不仅局限于 JVM 的集成,还包括 API 集成、架构集成(安全、配置、调试等)、对象模型集成、企业级 Havana JavaEE )集成,以及技术和思想上的集成。

世界各地的公司在 Java 平台上已经做出了巨大的投资,其中包括应用服务器、支持合同、培训材料、员工,以及特地为 JVM 优化的硬件等诸多方面。由于这些投资实在过于巨大,以至于是这些公司根本无法放弃现有的 Java 平台而去使用最新的动态框架。

Java 产业是一个数以十亿美元计的庞然大物,不但包括了 Web 应用,而且还包括了服务器应用、桌面应用软件、智能卡、手持设备、手机、机顶盒等。现在 Java 会议是世界上最大的技术活动,其他技术产业很难望其项背。

产业的大小有时很难计算,因为这还要取决于其平台的广度。现在已经可以证实, Java 的开源库已经远远多于其他语言的开源库。比如如果要通过程序创建 PDF 文档,可以选择 FOP 或者 iText ;如果希望选择一个涵盖各方面的 Web 框架,那么 Java 有数十种可以选择的框架;如果需要能够创建服务架构( SOA )的应用平台,在 Java 平台中也有相应的解决方案。

对许多人来说, Java 和其企业应用 JavaEE 一直是首选平台,因为他们达到了无可比拟的成熟度及工业级支持。其次 Java 应用服务器已经成为稳定且可扩展的管理环境,并且还集成了先进的部署力量,成熟的安全管理,以及 Web 服务。

不幸的是,虽然 Java 是这么强大,但是与其他像 Ruby Python PHP 等动态语言对手相比, Java 开发 Web 应用的过程还是太痛苦了,大量的时间被白白浪费在配置、构建和部署上。为了让构造过程更加简单, Java 程序员已经能够努力地创造了自动构建工具,而且随着 Java5 对注释的支持,这中便利得到进一步提高。但是 Java Web 应用开发的其他部分仍然很复杂,而且需要繁琐的配置。

不管怎样,如果 Java 社区拒绝接纳与动态语言平台具有相同能力的框架,那对 Java 来说是不公平的。不过 Jython JRuby Groovy 等动态语言已经可以很好地在 JVM 上运行,这表明 Java 也希望能够尽快支持动态语言。还好 Java 社区广开言路,取其精华,于是就有了 Grails

1.4 什么是 Grails

Grails 形成于 2005 年夏天,那时 Groovy 语言正以惊人的速度发展。一小群 Groovy 爱好者对动态语言框架的强大功能感到震惊,但是由于无法将它们用在已有的 Java 平台上,所以组织起来使用 Groovy 开发了一个动态框架,并按照 Ruby on Rails 将其命名为 Groovy on Rails ,后更名为 Grails 。由于这时 Groovy 语言本身已经达到企业应用的成熟度,因此也为 Grails 的形成创造了良好的时机。

Grails 的目标就是超越其他语言在 Web 领域的框架,为此 Grails 把目标集中在以下三个方面。

<!-- [if !supportLists]-->l        <!-- [endif]--> Java 平台紧密结合。

<!-- [if !supportLists]-->l        <!-- [endif]-->提供简单的接口,同时保持调用底层 Java 框架的灵活性及其特性。

<!-- [if !supportLists]-->l        <!-- [endif]-->改进 Java 平台已有的缺点。

使用 Groovy 来实现 Grails ,这使得 Grails 有了良好的开端,因为 Groovy 的目标之一就是让 Java 程序员可以无缝地向动态脚本语言过渡,而且为他们带来静态类型语言所不具有的高级特性。

Groovy 成为 Java 平台上的通用语言这一目标,与 Grails 成为通用 Web 框架的目标不谋而合。他们都希望尽可能使 Java 开发人员不需要再重新学习就可以过渡到动态语言的开发中。而且 Groovy 的创建者们也意识到,当 Java 程序员要使用一门动态语言时,不应该让他们在语言之间的转换上花费过多的精力。基于以上考虑, Groovy 使用了与 Java 及其相似的语法及与 JDK 相同的 API

Groovy 可以直接将代码编译成字节码( .class 文件),这就保证了它在 Java 虚拟机( JVM )中能够共享相同的对象模型。实际上, Groovy 对象就是一个 Java 对象,并且也使用 Java 编译器和虚拟机( VM )。

1.4.1 Java 集成

Groovy Java 无缝集成的能力及其与 Java 相类似的语法是对 Groovy 产生误解的首要原因。我们将有类似能力的动态语言,例如 Ruby Smalltalk 直接在 Java 虚拟机上运行,结果很明显,只有 Groovy 能最大程度的混合 Java 代码。此外, Groovy 允许在程序中混合使用静态类型和动态类型,这样既能利用静态语言类型的安全特点,又可以在需要时灵活地使用动态类型。

Java 的无缝集成是 Groovy 能够越来越流行的主要原因,对 Web 应用来说也同样如此。 Web 应用中许多相同概念在不同的开发平台会使用不同的术语来表达,例如在 Java 中就有 Servlet ,过滤器( Filters ),标签库( Tag Libraries )和 Java Server Pages JSP )等概念。当转移到一个全新的平台时,不仅需要重新学习这些基本的概念,而且还要熟悉相应的 API 和可能难以理解的术语。

学习新东西并不是坏事,关键在于现实中获取新知识的成本是多少。如果这些新知识有悖于 Java 平台和企业中的公共标准或者公共约定,那这种学习反而会成为前进的主要障碍。

目前为止, Java 已经能够在企业开发方面存在了足够的标准,比如部署、管理、安全和命名服务等。而 Grails 的目标就是创建一个拥有 Ruby on Grails 的基本特性,同时又符合 JavaEE 标准及相关 API 框架。

1.4.2 简单而强大

显然, Groovy 真正强大的优势在于拥有 Java 平台中众多优秀的特性,然而又不失其简单性。 Groovy Java 平台上极少数的优秀语言之一,因为它既跟 Java 紧密集成又兼顾了 Java 的语法,关于 Groovy 的简单性和方便性只讨论到这里,接下来主要介绍 Grails 如何借助于 Java 平台的强大特性来灵活实现软件开发的。

为了让 Grails 能够具有这种灵活性,需要仔细选择相关的实现技术。而 Java 社区提倡“不重复编写”的理念,因此 Grails 自然会选择最流行的开源技术作为基础架构,具体的开源醒目分类如下:

<!-- [if !supportLists]-->l        <!-- [endif]-->Hibernate Java 中对象关系映射的实际标准。

<!-- [if !supportLists]-->l        <!-- [endif]-->Spring :极为流行的发转空值容器和其他 Java 框架的包装器。

<!-- [if !supportLists]-->l        <!-- [endif]-->Quartz :非常灵活的企业级作业调度框架,可以持续执行作业。

<!-- [if !supportLists]-->l        <!-- [endif]-->SiteMesh :稳定的布局渲染框架。

对于读者来说, ORM IoC 的概念可能还比较陌生,在此稍作解释, ORM 可以简单看做将面向对象世界中的对象映射到关系型数据库的表上, ORM 还在 SQL 基础上进行一定的抽象,允许程序员直接使用领域模型,而不用编写大量繁琐的 SQL 语句。

IoC 又名依赖注入( Dependency Injection ),通常将对象“装配”在一起,在运行时可以使用对象的依赖。例如,一个持久化操作可能需要一个数据源,此时 IoC 就负责获取数据源的引用。不管怎样,目前我们没有必要深入研究这些概念,随着本书的讲解会逐步加深对它们的理解。

接下来, Grails 通过定义简单的接口来提供上述框架的功能,但是仍然可以分别独立使用各框架。

Grails 的核心是 JVM Java Groovy 都是通过该虚拟机被编译成字节码。接下来, Sping Hibernate Quartz 等框架都是建立在 Java 语言和 JVM 之上的。 Groovy 虽然可以在 Grails 之外与这些 API 协作,但是 Grails 仍然控制着企业级 Java Groovy 高级特性之间的联合,以便能为构建 Web 应用提供一个简单的环境。

许多框架尽管被称为轻量型框架,但其 API 仍然太复杂,正因为如此, Grails 的主要目标之一就是结合 Groovy 的动态特性,在这些框架之上为用户提供一个便于使用的抽象层。

不管怎样, Grails 保留了这些框架的所有功能,以便在需要的时候由用户调用,但是如果 Grails 没有从以前 Web 框架的整合中吸取教训,那么就无法充分利用这些框架的功能。

1.4.3 吸取的经验教训

Java 已经对 Web 开发的实践和方法方面进行了很长时间的精简和优化,虽然框架和规范本身也曾存在很多错误,不过经过 Java 社区大量的时间和反馈,这些错误逐渐在各个版本中得到纠正。

动态语言平台本身也不能完全避免这些错误,例如彻底的业务逻辑费力意味着视图中不能包含 scriplet 代码,而在彻底的模型—视图—控制器( MVC )结构中业务逻辑与视图逻辑应该是完全分离的, MVC 结构就是为了减少试图中混杂业务逻辑代码的风险,但是由于 MVC 应用程序的局限性,所以仍然不能避免这种可能。

Grails 的目标就是提供必要的基础架构,使用 Java 中熟悉的标签库、服务层、领域驱动等概念来清晰地分离上述视图中的业务逻辑代码。

1.5 使用 Grails 的原因

目前为止,我们已经了解了 Grails 的一些相关背景知识,那么为什么使用 Grails 呢? Web 开发所固有的重复性和其他一些常见问题,例如应用程序的状态,从文本到对象的转化,多线程处理等都是当今 Web 开发者所要面对的问题。随着各种新技术的应用,这些情况只会变得越来越复杂,比如 Ajax 让客户端保持应用程序状态,这就增加了程序的复杂性,并且增加了请求的数量。动态框架可以用更简单的方式来缓解这种开发周期的紧张程度。

即使如此,静态类型语言也还是有很多优点,例如成熟的集成开发环境( IDE ), Java 平台上的重构功能,以及相关的开发环境等,随着应用程序复杂性的增加,您就会意识到这些特性的重要性。 Grails 允许混合使用静态类型的 Java 代码和动态类型的代码如 Groovy 进行开发。

此外, Grails 允许按照应用复杂度增加比例,来调整 Grails 程序的性能。如果有一段更适合用 Java 实现的业务逻辑,由于 Groovy Grails 都可以和 Java 无缝的集成,因此可以用习惯的 IDE 进行代码浏览、分析和重构。

即使已经在使用以上的其他框架, Grails 也可能是开发人员在 Java 领域中苦苦寻找的解决办法。因为 Grails 非常灵活并且功能强大,能够混合使用静态类型和动态类型及与 Java 紧密集成,因此完全可以实现中应用。

除了集成 Java Java 虚拟机外, Grails 还有其他一些明显的优势。例如,它不需要 Java 开发者抛弃对已有框架( Sping Hibernate 等)的知识,因为 Grails 就是建立在这些框架基础上并且依然能够使用框架中的 API 的。而且这些框架本身也是由 Java 编写的,因此也就获得 Java 性能上的优势。

听了以上的介绍您是否迫不及待了呢 ? 那就让我们从安装开始开启 Grails 世界之旅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值