本书译自Grails项目负责人Graeme Keith Rocher所著的“The Definitive Guide to Grails”一书,着重介绍了如何在Grails框架下使用Groovy语言进行敏捷的Web开发。本书详细讲解了Grails开发的全部过程,包括项目构架、控制器和视图、与关系数据库之间的ORM映射,以及与Ajax和Java平台的无缝集成。同时该书也揭示了Grails对Java Web开发领域极大的推动作用,英文原版自出版后屡受大师佳评。\r\n 本书分为11章,所介绍的内容主要包括:Grails的目的与优势、Groovy语言基础与高级特性、Grails的工程项目结构、根据领域模型自动创建Web程序、在Grails中实现单元测试和功能测试、控制器的使用、Grails的高级视图技术GSP、在Grails中使用Ajax增强用户体验、Grails的高级特性,以及与Java的无缝集成。\r\n 本书适合所有对动态语言感兴趣的读者阅读,不管是否有过从事Perl、Ruby还是Python项目开发的背景,只要希望能够对动态语言有更深入的理解,都可以从本书中获益。不过,本书主要还是面向那些已经掌握Java语言,希望找到更好、更快捷地开发Web框架的Java爱好者。\r\n 本书适合所有对动态语言感兴趣的读者阅读; 掌握Java语言,希望找到更好、更快捷的开发Web框架的Java爱好者。
第1章 寻找Grails之旅\r\n 1.1 Java的困惑 \r\n 1.2 Webc2.0时代\r\n 1.3 Java的力量 \r\n 1.4 什么是Grails\r\n 1.4.1 与Java集成 \r\n 1.4.2 简单而强大 \r\n 1.4.3 吸取的经验教训 \r\n 1.5 使用Grails的原因 \r\n 1.6 Grails入门 \r\n 1.6.1 运行Grails命令 \r\n 1.6.2 义不容辞的“HellocWorld!”\r\n 1.7 单元测试 \r\n 1.8 本章小结 \r\n第2章 Groovy动态语言 \r\n 2.1 Groovy和Java的异同 \r\n 2.1.1 相同点 \r\n 2.1.2 不同点 \r\n 2.2 基础知识 \r\n 2.1.1 类声明 \r\n 2.2.2 语言级断言(Assertion) \r\n 2.2.3 Groovy字符串 \r\n 2.2.4 闭包(Closures) \r\n 2.2.5 列表(List)和映射(Map) \r\n 2.2.6 Expando动态对象 \r\n 2.2.7 范围(Range) \r\n 2.3 Groovy的高级特性 \r\n 2.3.1 一切都是对象 \r\n 2.3.2 元编程(Metaprogramming) \r\n 2.3.3 生成器(Builder) \r\n 2.4 本章小结 \r\n第3章 Grails工程基础架构 \r\n 3.1 Grails工程结构 \r\n 3.2 Grails和MVC模式 \r\n 3.2.1 MVC中的模型(M) \r\n 3.2.2 MVC中的视图(V) \r\n 3.2.3 MVC中的控制器(C) \r\n 3.2.4 除MVC之外的其他部分 \r\n 3.3 Grails支持多种环境 \r\n 3.4 数据源配置 \r\n 3.4.1 支持的数据库 \r\n 3.4.2 配置自定义方言(Dialect) \r\n 3.5 引导Grails应用程序 \r\n 3.6 配置日志(Logging) \r\n 3.6.1 启用SQL日志 \r\n 3.6.2 日志记录(Logging)和环境 \r\n 3.7 Grails命令行工具 \r\n 3.7.1 在不同的端口上运行Grails应用程序 \r\n 3.7.2 打包war存档文件(WARcArchive) \r\n 3.8 使用Grails控制台(Console)及命令解释程序(Shell) \r\n 3.8.1 使用命令行Shell \r\n 3.8.2 Grails控制台(Console) \r\n 3.9 IDE集成 \r\n 3.9.1 安装Groovy-Eclipse插件 \r\n 3.9.2 导入Grails工程 \r\n 3.9.3 在Eclipse中运行Grails应用程序 \r\n 3.10 本章小结 \r\n第4章 Grails中的域(Domain) \r\n 4.1 简化的ORM和Grails对象关系映射(GORM) \r\n 4.2 GORM基础 \r\n 4.3 设置属性可选 \r\n 4.4 GORM中的关系 \r\n 4.5 执行CRUD操作 \r\n 4.5.1 创建书签 \r\n 4.5.2 读取书签 \r\n 4.5.3 更新书签 \r\n 4.5.4 删除书签 \r\n 4.6 查询领域模型(DomaincModel) \r\n 4.6.1 使用get方法和exists方法进行基本查询 \r\n 4.6.2 列举(Listing),70排序(Sorting)以及合计(Counting) \r\n 4.6.3 用动态查找器(Finder)查询 \r\n 4.6.4 使用HQL进行查询 \r\n 4.6.5 按样本(Example)查询 \r\n 4.6.6 使用条件(Criteria)查询 \r\n 4.7 映射继承 \r\n 4.8 验证领域(Domain)模型 \r\n 4.8.1 使用域约束(Domainonstraints) \r\n 4.8.2 验证约束(Constraints) \r\n 4.8.3 自定义约束(Constraints) \r\n 4.8.4 回顾更新操作 \r\n 4.9 本章小结 \r\n第5章 脚手架(Scaffolding) \r\n 5.1 动态脚手架 \r\n 5.1.1 创建操作(Create) \r\n 5.1.2 读取操作(Read) \r\n 5.1.3 更新操作(Update) \r\n 5.1.4 删除操作(Delete) \r\n 5.1.5 重写(Overriding)CRUD操作 \r\n 5.1.6 使用约束自定义字段.\r\n 5.2 静态脚手架 \r\n 5.2.1 生成控制器(Controller) \r\n 5.2.2 生成视图(Views) \r\n 5.3 本章小结 \r\n第6章 测试 \r\n 6.1 编写高效的单元测试 \r\n 6.1.1 使用assert关键字 \r\n 6.1.2 使用测试数据 \r\n 6.1.3 探索GroovyTestCase \r\n 6.1.4 测试实践 \r\n 6.2 使用Mocks和Stubs \r\n 6.2.1 Mock实战 \r\n 6.2.2 使用闭包修整(Closureurrying)定义测试数据 \r\n 6.3 使用WebTest进行功能测试 \r\n 6.3.1 安装WebTest \r\n 6.3.2 生成Web测试 \r\n 6.3.3 执行Web测试 \r\n 6.3.4 与表单交互 \r\n 6.4 本章小结 \r\n第7章 Grails控制器(Controller) \r\n 7.1 控制器介绍 \r\n 7.2 设置默认操作 \r\n 7.3 访问Request属性 \r\n 7.3.1 使用日志(Logging) \r\n 7.3.2 处理request参数 \r\n 7.3.3 理解Flash作用域 \r\n 7.4 创建模型(Model) \r\n 7.5 数据绑定和类型转换 \r\n 7.5.1 用领域模型(DomaincModel)进行数据绑定 \r\n 7.5.2 使用bindData方法进行数据绑定 \r\n 7.6 用重定向控制流程 \r\n 7.7 使用chain方法构造模型(Model) \r\n 7.8 显示响应(Response) \r\n 7.8.1 显示文本 \r\n 7.8.2 显示指定的视图 \r\n 7.8.3 显示标记(Markup) \r\n 7.9 拦截操作 \r\n 7.9.1 Before通知 \r\n 7.9.2 After通知 \r\n 7.9.3 使用拦截器实现验证 \r\n 7.10 处理文件上传 \r\n 7.10.1 使用multipart请求 \r\n 7.10.2 上传和数据绑定 \r\n 7.11 本章小结 \r\n第8章 GroovycServercPages \r\n 8.1 基础知识 \r\n 8.1.1 理解模型 \r\n 8.1.2 页面指令 \r\n 8.1.3 GroovycScriptlets \r\n 8.1.4 在GSP中使用GString \r\n 8.2 Grails内置标签 \r\n 8.2.1 使用标签来设置变量 \r\n 8.2.2 逻辑标签 \r\n 8.2.3 迭代标签 \r\n 8.2.4 过滤器和迭代 \r\n 8.3 Grails动态标签 \r\n 8.3.1 链接标签 \r\n 8.3.2 创建表单和字段 \r\n 8.3.3 验证和错误处理 \r\n 8.4 国际化支持 \r\n 8.4.1 标签 \r\n 8.5 使用布局和模板 \r\n 8.5.1 布局演示 \r\n 8.5.2 按照惯例布局 \r\n 8.5.3 使用Meta标签进行布局 \r\n 8.5.4 演示布局 \r\n 8.5.5 理解模板 \r\n 8.5.6 共享模板 \r\n 8.5.7 重新讨论Render方法 \r\n 8.6 对数据进行分页 \r\n 8.7 创建自定义标签 \r\n 8.7.1 创建标签库 \r\n 8.7.2 自定义标签基础内容 \r\n 8.7.3 演示自定义标签 \r\n 8.7.4 测试自定义标签 \r\n 8.8 本章小结 \r\n第9章 Ajax \r\n 9.1 Ajax基础知识 \r\n 9.2 Ajax实战 \r\n 9.2.1 在远程方法调用前后执行代码 \r\n 9.2.2 事件处理 \r\n 9.2.3 完善页面的更新 \r\n 9.3 创建远程调用链接 \r\n 9.4 实现Ajax效果(Effects) \r\n 9.5 如何处理JavaScript事件 \r\n 9.6 以异步方式提交表单 \r\n 9.7 关于Ajax性能的讨论 \r\n 9.8 本章小结 \r\n第10章 服务(Services)和作业(Jobs) \r\n 10.1 服务基础知识 \r\n 10.1.1 事务 \r\n 10.1.2 服务和依赖注入 \r\n 10.2 服务实战 \r\n 10.2.1 示例A——扩展搜索功能 \r\n 10.2.2 示例B——显示del.icio.us中的最新数据 \r\n 10.2.3 测试服务 \r\n 10.3 使用Quartz进行作业调度 \r\n 10.3.1 简单的作业 \r\n 10.3.2 Cron作业 \r\n 10.4 作业实战 \r\n 10.4.1 修改领域模型 \r\n 10.4.2 实现控制器 \r\n 10.4.3 创建视图和模板 \r\n 10.4.4 作业调度 \r\n 10.4.5 测试作业 \r\n 10.5 使用调度程序 \r\n 10.5.1 暂停和恢复作业 \r\n 10.5.2 触发作业 \r\n 10.5.3 增加和删除作业 \r\n 10.6 本章小结 \r\n第11章 与Java集成 \r\n 11.1 服务器端Java集成 \r\n 11.2 通过集成Hibernate实现ORM \r\n 11.2.1 使用HibernatecXML映射 \r\n 11.2.2 EJB3方式的映射 \r\n 11.2.3 在POJO实体中使用约束 \r\n 11.2.4 得到SessionFactory对象 \r\n 11.3 使用Spring进行依赖注入 \r\n 11.3.1 使用Grails中的Bean \r\n 11.3.2 重载Bean的定义 \r\n 11.4 在Grails中使用Spring控制器 \r\n 11.5 在Grails中使用Acegi \r\n 11.6 使用XFire创建SOAP服务 \r\n 11.7 本章小结 \r\n附录
Java作为如今世界上使用最广泛的语言,经过十多年的发展,已经在各个领域尽显其优势,尤其在Web开发领域中,从众多的Web框架就可以看出其快速并日趋成熟的发展。在开源社区的努力推动下,Struts、Spring、Hibernate都已经成为了行业中实际的标准。但是如今的Java开发者们仍然需要埋头于繁杂的配置文件中,这也正是之前Ruby on Rails(简称ROR)这样的敏捷性开发框架能够震撼Java社区的原因。许多Java开发者不得不重新开始学习Ruby,以便投入ROR的怀抱。这使得Java社区终于开始反思,随即迎来了属于自己的脚本语言Groovy和敏捷的Web开发框架Grails。
作为赢得JAX(德国最重要的Java会议)2007年创新大奖第一名的Groovy,已经用三年多的时间在Java社区中树立了其坚实的根基。而对于Rails这个使Ruby一举成名的框架,Java社区也顺水推舟,借助于Groovy的强大优势推出了Grails。由于其整合了Spring、Hibernate、SiteMesh这些经过千锤百炼的框架,而且与Java的无缝集成也使得Java开发者可以轻松地转到敏捷开发的道路上来。此外,不仅Eclipse、IntelliJ IDEA都开始提供Groovy和Grails的开发插件,Oracle和IBM等也都提高了对Groovy和Grails的关注程度,基于二者的应用也如雨后春笋般地出现了。
本书历经数月的翻译及审校,由张若飞、孙岚、郭会强(排名不分先后)三人共同翻译完成。其中郭会强翻译第1、2章,孙岚翻译第3~7章,张若飞翻译了文前、第8~11章并负责了全书的统一及初步校对工作。由于长期从事Java开发工作,我们深切地感受到Spring、Hibernate等框架在配置文件方面的烦琐,也曾被ROR的简捷所感染(虽然效率一直是其诟病),但仍舍不得完全抛弃使用多年的Java及其丰富的资源。当我们第一次接触到Grails的时候,一种期盼已久的感觉不由涌上心头——因为我们知道,它就是众多Java开发者所期待的东西。随着其不断的发展,我们也以各种方式对Grails及Groovy进行了宣传介绍:不仅在各自的博客上不断发布有关Grails和Groovy的技术文章,热心解答爱好者们提出的问题,也参与了部分Grails的开发工作,其中孙岚便参与了Cache部分的开发。在实际应用中,我们也积极采用Grails,积累了大量的实践技巧和经验,并且取得了令人满意的效果。在2007年年底正式发行Groovy1.1和Grails1.0后,我们坚信2008年一定会是一个“Groovy和Grails年”!
本书能与大家见面,首先要感谢策划编辑张春雨的不断支持与帮助,为我们尽心尽力解决各种困难,并提出许多中肯的建议。感谢我们的家人、朋友的关怀与鼓励,是他们在这期间给了我们无微不至的照顾。感谢出版社的编辑、审校等的严谨校对,也感谢Groovy精英联盟群中荐言献策的朋友们及后期参与校对的众多优秀技术人员,是他们进一步地提升了本书的品质,因此我们相信这本书一定会成为读者学习Grails的最佳资料。在本书的翻译过程中,我们本着严谨、创新的态度,不仅完全保留了原书的所有内容,修正了原书中的错误,并且根据如今最新的Grails发布版本(0.5.6版)及我们从实践应用中获得的经验和技巧更新了原书中的部分内容,力求使读者能够接受最新的知识。此外,我们还将与原书配套的代码进行了修正,读者可以在飞思的网站上进行下载。翻译此书,不仅因为我们本身热衷于Groovy和Grails,同时我们也希望能将更新、更好的技术尽快地引进国内,引起更多人的关注,促进国内的技术发展,共同提高技术水平。鉴于时间仓促及技术和经验上的不足,本书中难免有错误和疏漏之处,恳请读者批评指正,不胜感激。
译 者
2007年8月
GRAEME KEITH ROCHER是Skills Matter(http://www.skillsmatter。corn,专注于开源技术和敏捷软件开发的技术传播公司)的软件架构师与技术部负责人。他现在的职位是CTO,并负责Skills Matter公司的课件开发方案和总体技术指导。作为开源社区的多领域专家之一,他积极地在各种会议上进行有关Groovy、Grails以及Java动态语言等话题的演讲。
Graeme的职业生涯开始于与一个团队共同开发基于J2EE技术、可升级式的企业学习管理系统,其中他负责电子学习(E—Learning)部分的开发。随后他进入了数字Tv领域,当面对不断更新的数字平台时,他决定使用敏捷方法来解决日益增长的复杂需求。这是Graeme第一次接触Groovy,随后他使用Groovy和Cocoon,在数字TV平台上实现了动态多通道容量管理系统。
由于看到了web服务及其实现复杂功能的增长趋势,Graeme着手开发_上个能够加以简化的项目,这就是Grails。Grails框架本身来源于Ruby on Rails,但是目标在于与Java的紧密集成。Graeme是现在Grails项目的负责人,而且还是Groovy JSR一241执行委员会的成员之一。在Skills Matter之前,Graeme还在Knowledge Pool工作过。在那里他使用Groovy开发了一种名为Originate的快速电子学习开发工具。Originate使用Groovy将多种技术融合到一起,其中包括Visual Basic、Microsoft Word、XSLT、Javascript和xSL—FO。
不过Greame最大的成就还是他的两个漂亮的孩子,Lexeia和Alex,以及他深爱的妻子Birjinia。
Grails是一个面向企业级应用、基于MVC模式的Web框架,其构建于Spring、Hivernate、Quartz和SiteMesh这些已被无数实际应用证实的、可扩展的开源框架之上。与以前的J2EE规范(Bruce Tate称其为“大象”,意味着J2EE规范既强大又笨拙)相比,Grails的目的在于帮助开发人员更快地创建Web程序。
或许从Ruby on Rails、Django或TurboGears这些新框架中得到了灵感,Grails也按照“习惯优于配置”的原则来简化复杂的问题。不仅如此,Grails使开发人员找回了开发Web程序的乐趣。Grails的灵活性使得开发人员可以在几个小时之内就创建出Web系统的原型(ProtoType),这样就可以对底层的域模型(Domain Model)进行验证,或者进一步通过与客户讨论来确定需求,避免出现用户在开发的前几个月中只能等待的情况。
由于借助于Java平台和开源框架,Grails不仅能在装有开源Servlet容器的普通机器上运行Web程序,也能用于商业中大规模的集群服务器。这样企业可以放心地在软件和硬件上进行投资。而且开发团队无须经过长时间的培训和拥有长期的开发经验,就能在开发过程中充分发挥Java、Spring和Hibernate等技术的优点。虽然Grails将底层的实现框架封装了起来,但是当实际需要(如与遗留系统的集成)时依然可以由开发者来进行配置。
Graeme Rocher和他的团队不仅在Grails中使用之前那些强大、成熟的框架,而且使用了Groovy——与Java 平台集成性最好的动态语言作为Grails的基础,这样Grails就能够充分利用Groovy具有的动态特性。之所以选择使用Groovy是由于Groovy与Java非常类似,这样Java开发人员可以很轻易地过渡到Groovy的开发中。我们不仅可以像在Java中一样编写Groovy代码,在深入了解Groovy后还可以使用其强大的动态特性,而这一切都得益于背后的Java平台和Grails框架。
之所以给这个框架起名“Grails”,是希望它能够成为所有开发者手中的Holy Grails(圣杯)。Grails通过极大地提高开发人员的开发效率,已经证明了这一目的不只是夸夸其谈。Graeme Rocher,Grails项目的负责人及本书的作者,已经为开发这个强大的Web框架做了巨大的工作,并且也培养出了一个开放、团结的社区。在这本书中,他会带领我们逐步对Grails有一个清晰、透彻的了解。
《Grails权威指南》是Graeme Rocher的另一本著作,他本人不但负责整个框架的开发工作,而且还编写了大量细致的在线文档。在这本书中,Graeme会借助他在开发Web程序中的经验和知识,带领我们逐步掌握Grails框架和Groovy动态语言。
我们十分有幸能与Graeme一同开发Grails并完成这本书。
对于任何希望学习Grails,并且愿和我们共同分享编程乐趣的读者来说,都应该仔细阅读这本书。
Guillaume Laforge
Groovy项目经理
Dierk König
《Groovy in Action》一书主要作者
关于作者
GRAEME KEITH ROCHER是Skills Matter(http://www.skillsmatter.com,专注于开源技术和敏捷软件开发的技术传播公司)的软件架构师与技术部负责人。他现在的职位是CTO,并负责Skills Matter公司的课件开发方案和总体技术指导。作为开源社区的多领域专家之一,他积极地在各种会议上进行有关Groovy、Grails以及Java动态语言等话题的演讲。
Graeme的职业生涯开始于与一个团队共同开发基于J2EE技术、可升级式的企业学习管理系统,其中他负责电子学习(E-Learning)部分的开发。随后他进入了数字TV领域,当面对不断更新的数字平台时,他决定使用敏捷方法来解决日益增长的复杂需求。这是Graeme第一次接触Groovy,随后他使用Groovy和Cocoon,在数字TV平台上实现了动态多通道容量管理系统。
由于看到了Web服务及其实现复杂功能的增长趋势,Graeme着手开发一个能够加以简化的项目,这就是Grails。Grails框架本身来源于Ruby on Rails,但是目标在于与Java的紧密集成。Graeme是现在Grails项目的负责人,而且还是Groovy JSR-241执行委员会的成员之一。
在Skills Matter之前,Graeme还在Knowledge Pool工作过。在那里他使用Groovy开发了一种名为Originate的快速电子学习开发工具。Originate使用Groovy将多种技术融合到一起,其中包括Visual Basic、Microsoft Word、XSLT、JavaScript和XSL-FO。
不过Greame最大的成就还是他的两个漂亮的孩子,Lexeia和Alex,以及他深爱的妻子Birjinia。
关于技术评审
GUILLAUME LAFORGE 是Groovy项目的官方项目主管,以及JSR-241(该规范负责Groovy脚本语言的标准化)的规范负责人。他将业余时间都花在开发一种全面的敏捷环境上,一年之前他开始讨论基于Groovy和Spring的Grails框架。
他与另一名富有热情的Groovy开发者Dierk König共同编写了《Groovy in Action》一书,并已由Manning出版社出版。
在他的职业生涯中,Guillaume是OCTO Technology公司的软件架构师和开源顾问。OCTO Technology是法国一家关注于软件架构和信息系统的技术咨询公司。
DIERK KöNIG 是一名高级程序员、技术顾问及指导员。他是《Groovy in Action》一书的主要作者,热衷于Groovy和Grails。由他创立并管理的开源项目Canoo WebTest深受欢迎。Dierk通常在国际会议上和主要杂志上发表演讲和文章。他作为创始合伙人和执行委员会成员,工作于瑞士巴塞尔(Basel)的Canoo Engineering AG。
作者致谢
首先,也是最重要的,我要感谢我的妻子Birjinia,感谢她的美丽、聪明、无尽的爱和支持,她是最好的妻子。同样要感谢的还有我的孩子,Alex和Lexeia。很多次当我写这本书的时候,她们都想把我从笔记本电脑旁拽走,但她们还是耐心地等我写完。感谢我的母亲,我的父亲(我想念你),我的姐姐,以及Birjinia家的所有成员,你们对我而言是那么的重要。
对于Apress出版社,感谢Steve Anglin最初的建议,并鼓励我写一本关于Grails的书籍。虽然后来也有其他出版社询问此事,不过在此还是要感谢Steve和Apress出版社对Grails发展的远见卓识。
同样要感谢的还有一起工作过的Apress制作团队,包括Jennifer Whipple和Ami Knox(我的责任编辑),Nancy Sixsmith(校对员),Lori Bring(制作编辑),还要特别感谢容忍我推迟交稿的Kylie Johnston(项目经理)。
不用说,还要感谢本书的技术评审Guillaume和Laforge(Groovy项目负责人),以及在编写本书过程中提供了深刻见解和建议的Dierk König(《Groovy in Action》一书的主要作者)。
相信如果没有那些一如既往为Grails贡献力量的人们,这一切都是不可能的。在这里要再次感谢Interface21 的Steven Devijver和Guillaume,感谢他们在Grails还只是有一些想法的时候就在邮件中表示了对我的支持。
感谢Marc Palmer提供了合理的意见、机智的论点以及不断为Grails做出的贡献。感谢Micha Kujszo在Quartz项目上的贡献。再次感谢Dierk和Canoo(http://canoo.com)提供了Grails持续集成服务器与测试架构。感谢John “Tug” Wilson和Jochen “blackdrag”Theodorou等Groovy团队成员,是他们及时的支持才使得Grails项目成为可能。
感谢Hermit Design(http://www.thehermitdesign.co.uk)的Arthur Smit,他设计了最初的Grails图标及Grails中很多其他的图案,以及本书的封面。如果你需要制作富有创造性的商标或者任何图片,他将是合适的人选。
同时还要感谢Grails社区一如既往的支持。感谢所有Grails的用户,尤其是Sven Haiges,他制作了Grails的演示视频,以及在InfoQ等网站了写了无数介绍Grails文章的Jason Rudolph。
追溯过去,我还要感谢原先Futuremedia团队的核心成员们,他们教会了我很多东西,即使现在也是一样。感谢其中的Jeremy Aston、Piers Geyman、Phil Horton、Nathan Summers等人,并要特别感谢Pete Bergin(RIP),我们想念你。
再次感谢Oracle的Tugdual Grall极力在Oracle和JavaOne、JavaPolis等重要会议上对Grails的宣传和支持。最后,我要感谢Skills Matter的Wendy Devol
无封面