Grails技术精解与Web开发实践

Grails技术精解与Web开发实践"

作者:宋友、梁士兴、黄璐、王鑫
ISBN:9787302201878
定价:¥33
字数:千字
页数:
出版时间:2009.09.01
开本:
版次:1-1
装帧:
出版社:清华大学出版社
简介

Grails是继J2EE、PHP、ROR等技术之后又一个成功的Web框架。本书系统讲解了使用Grails技术快速进行Web开发的知识。本书内容分为四大部分,第一部分介绍了Grails必备的基础知识,包括环境配置、Groovy语言基础、HelloWorld程序开发实例等;第二部分以迭代的方式,设计并逐步完善了一个购物车应用,介绍了Grails基础知识;第三部分对Grails各个部分的细节进行了深入讨论;第四部分对Grails的实现原理进行了剖析,通过分析Grails的源码,帮助读者体会出Grails如此神奇的奥妙所在。

本书可作为大学本专科软件工程等专业教材,其适用的课程可以为Web开发与实践、软件工程实践等。本书也可供Web开发与应用的工程技术人员和爱好者参考。

前言

推荐序

互联网的发展带来了新的科技革命,Web 2.0的概念更是将网络技术和应用推向了新的高潮。在这个技术日新月异发展的年代,各种框架、各种概念、各种思想呈现出了百花齐放局面,虽然无比繁荣,却让人十分眼花缭乱。选择一种最适用的Web框架,可以给开发时间、开发成本、开发质量带来巨大的影响。

当今世界是一个创造奇迹的时代。J2EE创造了一个奇迹,使得开发企业级的Web应用变得快速、可靠、经济,从而成为近年来的主流Web开发框架。RoR的诞生创造了另一个奇迹,它的开发效率是J2EE的5倍以上,而且相比PHP技术,它有着更好的代码组织结构,更容易写出高质量的代码。

Grails是继RoR之后的又一个奇迹:它不但具备J2EE和RoR的诸多优点,还解决了RoR不能有效适用于广大Java用户的一大难题。目前,Grails已得到了业内广泛地认可。在2008年11月11日,以Spring框架而闻名于天下的SpringSource宣布收购主导Grails开发的G2one公司,并承诺在收购之后,会投入更大的力量去改进Grails并且对Grails的全球用户提供商业支持。正如著名的ququjoy的评论所述:“SpringSource 将G2One收购之后,以Spring为底层框架的Grails必将迎来自己的春天”。对于还在观望的用户,还犹豫什么呢?赶快加入到Grails的使用者队伍中吧,充分享受Grails带来的实用与便捷。

目前,市面上关于J2EE的书籍数不胜数。关于RoR的书籍也至少有数十本。然而,也许很快将引领潮流的Grails实在太新了,它的资料主要还在Grails官方网站上能获得。关于Grails的中文书籍仅有两本外版图书,并且介绍的是低版本的Grails。这对于广大爱好Web开发、并渴望学习Grails这门新技术的读者来说,不能不说是一个      遗憾。

可喜的是,这本书问世了,该书的作者们自己使用Grails开发了许多成功的应用。为了撰写该书,他们亲自编写了一个典型的网上购物车的Web应用实例。通过Web实例制作的示范和讲解,由浅入深地分析了Grails的神奇,实践性非常强。同时,本书也对Grails的源代码、基于MVC的Web开发原理进行了深入的分析,亦不失理论深度。该书的面市相信会为Web开发爱好者带来一个小的惊喜。

该书优美地结合了理论与实践。不失为一本优秀的教科书和程序员与项目经理的参考手册。值得一读。

孙  伟

北京航空航天大学软件学院院长

2009年4月5日

Grails技术精解与Web开发实践

目前,虽然J2EE仍然是企业级Web开发的主流,但越来越多的企业和个人在开发新项目时更倾向于尝试使用RoR,因为用RoR开发Web应用,可以更快捷、更简单。仿佛在一夜之间,RoR成为了Web框架领域内最耀眼的明星,RoR的一些理念,如约定优于配置,已经成为了新框架设计的金科玉律。

然而,RoR对于世界上数量最大的Java用户来说,并不足够友好。第一,Ruby语法与Java类语言有较大区别,需要克服较大的      障碍才能掌握。第二,历史遗留项目问题,Java语言的广泛流行使         得大量既有项目是用Java开发的,而且这些项目还需要被继续支持和扩展,扩展历史遗留项目的任务,RoR显得无能为力。第三,性能问题,Ruby语言相对于Java,其执行性能较差。上面这些因素,都会制约RoR在实际项目中的使用。正是在这一背景下,Grails诞        生了。

Grails的全称为Groovy on Rails,是一种基于Groovy语言的Rails类框架。它继承了RoR的绝大多数优点,几乎和RoR一样简单。而对于RoR的不足,它有着明显的优势。第一,Groovy语言运行于JVM,可以透明地执行Java程序。Java程序员可以迅速地掌握Groovy,同时对基于Java的历史遗留项目,可以得到非常好的支持。第二,Groovy语言的执行性能虽然不及Java,仍然比Ruby有较大的优势。另一方面,Grails虽然名为Groovy on Rails,但实际上Grails的主要开发语言是Java,Grails框架有的绝大多数代码是用Java编写的,因而,Grails的性能就更可以得到保障。

Grails技术凭借它卓越的设计,给用户提供了一种高效、简单易用、一栈式Web开发的框架。利用Grails技术,可以以极低的学习代价,换来很高的开发效率。使用Grails开发Web应用,需要使用的编程语言是Groovy语言。Groovy是运行于JVM之上的程序设计语言,近些年发展迅猛。对于Java用户,要想掌握Groovy,是非常容易的,学习曲线也非常平缓,甚至不需要学习,仅凭借Java的基本功,就可以把Grails驾驭得非常好。因此,极力推荐正在使用Java开发Web应用的公司、学生、个人用户学习并使用Grails。对于没有掌握Java技术,但很想学习Web开发技术的用户,那不妨就直接从Grails开始吧,Grails非常容易掌握。使用Grails,开发人员就可以更多地把精力花在业务上,而不是技术细节上。

一、阅读本书需要的预备知识

现代的Web应用通常会涉及到页面设计、数据存储等多个方面。Grails将这方方面面的问题都考虑了进来,因而说Grails是一个一栈式的框架。本书预期的读者,应预备以下几方面的基础知识。

1.HTML的基础知识。是的,无论如何,HTML都是Web技术的基础,只有具备一定的HTML基础,才能设计并输出Web页面的基本元素。同时,应该对表单的提交(GET/POST)有所了解。当然,这部分内容非常容易掌握,通过百度Google,可以轻松地找到许多有用的教程。

2.数据库的基础知识。Grails对数据库的操作进行了封装和简化,但开发人员仍然有必要掌握一定的数据库知识,对数据库表、主键、外键、索引,有基本的了解。能够读写简单的SQL语句。只有这样,才能真切地体会到Grails与生俱来的快捷与便利,而且遇到问题才不会茫然。

3.Java语言或Groovy语言,或者其他类似的面向对象程序语言。使用Grails进行开发,需要使用Groovy语言。掌握Java,就意味着在相当程度上掌握了Groovy。它们二者间比较重要的差异,本书中会进行必要的介绍。当然,对于不了解Java但至少掌握了一种编程语言的读者,学习Groovy也不会有任何困难,毕竟Groovy的设计思想就是设计一种比Java更简单易用的编程语言。

4.Hibernate基础知识(非必需)。本书会对Grails的部分实现原理进行深入和分析,会涉及到许多Hibernate中的概念。读者如果只是希望用Grails开发自己的Web应用,则无需要求这一点。

二、关于本书的内容说明

本书的内容包括四大部分。从第一部分到第四部分,按知识的难度和深度,存在一定的递进关系。但各部分也相对独立。

第一部分是入门篇,介绍了Grails必备的基础知识,包括:环境配置、Groovy语言基础、HelloWorld程序开发实例,以及一些基本概念。对于熟悉Java编程的读者,可以快速浏览本部分。

第二部分共7章,以迭代增量的方式,完整地设计并开发了一个Web应用——网络购物车。该部分内容从最简单的环境准备开始,接下来包括数据创建、数据查询、数据维护与管理、系统后台管理、系统测试、系统部署等。该部分是一个逐步完善的过程,每开始新的一章,就是增加了一些新的功能和知识点。

学习完前两部分,可以掌握Grails主要的基础知识,并能开发一些简单的Web应用。这可以称得上是Grails开发的初级用户了。

第三部分共6章,对Grails的关键问题进行了比较深入的讨论,对相关的原理进行了介绍。该部分内容包括Grails的MVC原理、GSP输出、Web Service实现、Grails插件使用等内容。本部分的内容有一定难度和深度,但这些知识也是Web开发的基本要素,要开发真正实用的Web应用,掌握这些知识是必要的。

掌握了前三部分内容的读者,可以称得上是中级用户了,能够比较熟练地使用Grails开发Web应用。

第四部分是最后5章,其内容包括:介绍Groovy的高级特性、分析Grails的源码、讲解Grails 的插件开发、阐述Grails的新特性等。该部分内容难度和深度都较大,是对Grails的一些原理进行深入分析。掌握该部分内容,有助于帮助读者体会出Grails之所以如此神奇的奥妙所在,在实践中能够通过灵活运用Grails,并可能修改源码,进行更丰富的二次开发。

在实例分析和原理解析上,本书两者并重,它们分别占了约一半的篇幅。但两者并不是截然分离的,有的时候两者是有机地结合在一起。读者通本书实例的学习实践,可以依葫芦画瓢地开发自己的Web应用;通过品味Grails的原理,将能开发出更多、更复杂的Web应用。读完这本书,读者不仅仅能开发一个网上购物车,同样能开发自己的工作流、表单系统、等等。

由于Grails的知识很新,可参考的文献非常少,本书的知识大部分是作者从Grails的官方资料中获得的。本书是作者通过阅读和分析Grails的源码,亲自开发Web应用,编写了较多的实际代码,然后再总结自己从事Web开发的一些经验而完成的。本书原创内容较多,因而疏漏之处可能不少,诚恳地请读者批评指正。

三、代码的阅读说明

本书的代码可从网络下载,网址为www.tup.tsinghua.edu.cn,包括了网络购物车的完整代码。

在本书中,因为购物车的开发是增量进行的,所以随着每一章的代码逐步添加,最后才形成了完整的应用代码。但读者在阅读过程中,阅读并实践到某些章节时,因为还不涉及到后面章节的内容,所以将会发现自己按书上步骤介绍而写出来的代码跟我们提供代码的内容并不一致。

但我们不打算把每一章的代码都单独放在一个文件夹里,写成一个独立的应用。一方面,这样会破坏该应用的完整性;另一方面,也是更重要的,读者在阅读每一章时,可能会不假思索地把我们的代码复制到开发环境里,顺利地让程序运行起来,自己却可能并不明白代码说的是什么。

读者在阅读并实践本书的应用实例时,我们鼓励读者按书上描述的步骤,尽量自己亲自输入相关的代码,并运行程序分析结果。如果有些例子的代码的确非常多,可以从我们提供的代码里摘录部分核心内容。

另外,在分析实例时,有些知识点的代码也比较长,我们在书里也没有全部把代码列出来,读者可以参阅网络文件里的相关内容。

四、写作小札

在2008年4月初时,我们刚使用Grails 开发了一个成功的商业应用。在开发该应用的过程中,我们深刻感受到Grails中文资料在国内的匮乏,而且原创的Grails中文书籍在国内还没有。另外,市面关于Grails的书籍中,基本上都是以Grails 0.3为基础来介绍的,但当时主流应用的是Grails 1.03,两者的差距较大。这给广大Web爱好者学习和应用Grails 带来了困难。于是,我们就萌发了写作此书的想法。

2008年五一后,该写作计划开始启动,并且该计划得到了清华大学出版社和北航软件学院的大力支持。

我们原计划用大约半年时间完成该书的写作,但事实上花了近一年时间才完稿。实际写作过程中,开发一个完整的Web应用实例并不是难事。但在分析Grails的原理时,要把Grails之所以神奇的本质阐述清楚(例如Grails 如何通过Hibernate进行数据库操作、如何通过Spring引入外部的组件、等等),则并不容易,主要是这方面的参考资料非常少,作者不得不花大量的功夫来仔细研读并分析Grails 的源代码,然后用通俗的语言,并设计一些例程进行解释。

本书的大部分内容是在2008年完成的,这其中经历国人大悲的5.12地震和大喜的北京奥运会,因此,我们的写作心情也受到巨大的影响,前半年时间是在心情很不平静的情况下完成写作的。整个暑假,我们每天都在坚持写作,当然,期间有伴随着边看奥运会边写作的一段快乐日子。在此期间,我们也承接了一些用Grails开发的Web应用小项目,当然,那时我们使用Grails开发的速度已非常快,效益比率也非常可观。开发这些应用,对于我们进一步理解Grails,从而更好地写作该书提供了许多有意义的启发。

我们写作的基础曾是Grails 1.03,但Grail的发展很快,寒假前夕,我们的书稿快完时,Grails 1.04正式版出来了,我们不得不把整本书的相关内容都换成1.04版的内容。当时,1.1版的测试版也有了,于是我们还特别地介绍了部分新版本的新特性。但很遗憾,刚完稿没多久,1.1的正式版又出来了。我们深刻理解,计算机领域,技术的更新速度永远都比知识传播得要快,因此我们知道,我们难以保证今天出的书里面的内容一定反映今天最新的事情,虽然我们有时可以预测今天或明天将要发生的事情。该书目前以Grails 1.04为基础进行介绍,这对于读者学习和使用1.1版而言,应该说没有影响。不过我们希望,每隔一段时间后,能不断有新结合Grails新版本、反映Grails新特性的书籍出现。下一个作者,也许就是你——今天的读者。

该书写完后,本书的作者之一,梁士兴也顺利硕士毕业了。在进行该书的写作过程中,他还完成了自己的学位论文写作、论文答辩、就业等事情,并且,写作这本书也有力地促进了他在学业和就业上的进步。最终,他以优良的毕业成绩通过答辩,并得到了自己满意的工作——获得了IBM的offer。于是,他得到一个感悟:读一本好书、学习一门技术、开发一个项目、撰写一本书和文章,其收获可能是自己也无法预知的一个惊喜。

五、致谢

在本书近一年的写作过程,得到了广大老师、朋友的热心支持。

感谢北京航空航天大学软件学院的领导和老师对该书撰写工作的支持,并提供了良好的写作条件,该项目得到了北京市教育委员会第二类特色专业建设项目支持。

感谢曹媛、李翔昊、吕经纬、李宇杰、刘其帅、宋恒、赖景愚等同学作为该书的第一批阅读者和实践者,并对该书的内容提出了许多宝贵的修改意见。

在此,谨对关心和帮助本书完成的所有老师、同学和朋友,以及相关单位致以诚挚的感谢。

宋友 北京航空航天大学软件学院

梁士兴 IBM中国开发中心

黄璐 IBM中国开发中心

王鑫 IBM中国开发中心

2009年4月  北京

目录

第1章  导论 1

1.1  RoR的革命与Web开发的新时代 1

1.2  RoR并不完美 2

1.2.1  Ruby语言方面的不足 2

1.2.2  对历史遗留项目的支持较为困难 2

1.3  Grails的诞生解决了一些遗憾 3

1.3.1  Groovy语言 3

1.3.2  Grails站在了巨人的肩膀之上 3

1.3.3  Grails有良好的扩展性 3

1.4  对Grails的一些误解 3

1.5  本书的使用说明 4

1.6  本章小结 4

第一篇  入门篇

第2章  Hello Grails 6

2.1  Grails的安装 6

2.1.1  JDK的安装与配置 6

2.1.2  Grails的安装 7

2.2  创建Grails工程 8

2.3  Grails的MVC架构 11

2.4  Scaffold应用程序 14

2.5  开发工具的使用 17

2.6  本章小结 19

第3章  Groovy VS Java 20

3.1  Groovy的基本类型与运算符 21

3.1.1  字符串 21

3.1.2  数字 22

3.1.3  Groovy的类 23

3.1.4  运算符 24

3.2  Groovy的控制结构 25

3.3  Groovy的集合 27

3.3.1  列表 27

3.3.2  映射 28

3.3.3  区间 29

3.4  Groovy的闭包 30

3.4.1  闭包的定义 30

3.4.2  闭包的代表 31

3.4.3  闭包在GDK中的使用 31

3.5  本章小结 33

第二篇  实际应用

第4章  商品维护 36

4.1  准备工作 36

4.2  查看商品列表 40

4.3  创建和编辑商品 44

4.4  本章小结 48

第5章  商品搜索 49

5.1  构造查询表单 49

5.2  复杂的数据库查询 50

5.2.1  HibernateCriteriaBuilder

的初窥 51

5.2.2  数据库的分页查询 54

5.2.3  将查询改造为inner join 59

5.3  显示分页导航 60

5.4  本章小结 62

第6章  用户注册与登录 63

6.1  表单验证与资源文件 63

6.2  用户注册 69

6.3  用户登录 73

6.3.1  登录的数据库查询 73

6.3.2  使用Session维持会话 74

6.3.3  自定义Codec实现对

密码加密 75

6.4  登录保护 76

6.5  本章小结 79

第7章  购物车与订单 80

7.1  购物车的查看与管理 80

7.1.1  定义购物车的Domain类 80

7.1.2  定义OrderService类 82

7.1.3  显示购物车 84

7.1.4  维护购物车 85

7.2  订单的提交 90

7.2.1  定义订单的Domain类 90

7.2.2  提交订单的表单页面 90

7.2.3  订单的保存 94

7.3  订单的查看 95

7.4  本章小结 99

第8章  系统后台管理 100

8.1  页面布局的使用 100

8.1.1  Grails Layout的基础知识 100

8.1.2  为系统后台管理创建

统一的decorator 103

8.2  文件上传的实现 107

8.2.1  开发表单页面 107

8.2.2  在Controller中接收文件 108

8.3  修改订单状态 109

8.4  本章小结 110

第9章  Grails的自动化测试 111

9.1  Grails自动化测试基础知识 111

9.2  编写测试用例 113

9.2.1  对Domain类进行测试 113

9.2.2  对Service类进行测试 116

9.2.3  对Controller进行测试 118

9.2.4  对Taglib进行测试 120

9.3  本章小结 121

第10章  部署应用 122

10.1  Grails对部署的支持 122

10.2  配置应用程序 124

10.3  本章小结 127

第三篇  深入了解Grails

第11章  深入GORM 130

11.1  自定义映射 130

11.1.1  基本映射 130

11.1.2  配置主键 131

11.1.3 “锁”与Version 133

11.1.4  事件与自动时间戳 134

11.1.5  映射Blob字段 134

11.1.6  定义非持久化属性 135

11.2  深入理解Domain间的关系 136

11.2.1  一对一关系 136

11.2.2  一对多关系 137

11.2.3  多对多关系 139

11.2.4  继承关系 141

11.2.5  合成关系 143

11.3  数据库查询小结 143

11.3.1  GORM提供了便捷的

查询方法 143

11.3.2  基于HQL的查询 145

11.4  对GORM进行性能优化 146

11.4.1  设置抓取模式 147

11.4.2  使用二级缓存 147

11.5  使用GRAG工具生成Domain 151

11.6  本章小结 154

第12章  与Spring整合 155

12.1  依赖注入与Spring容器基础 155

12.1.1  依赖注入 155

12.1.2  Spring容器基础 157

12.2  在Grails中使用Spring 158

12.3  本章小结 160

第13章  深入Controller 161

13.1  Controller中常用的属性与方法 161

13.2  自定义URL Mapping 164

13.3  Web Flow 167

13.4  本章小结 172

第14章  深入Groovy Server

Page 174

14.1  GSP基础知识 174

14.1.1  GSP输出表达式 174

14.1.2  GSP中预定义的变量

与作用域 175

14.2  GSP标签库 175

14.2.1  常用的内置标签 176

14.2.2  开发自定义标签 179

14.3  Grails对Ajax的支持 182

14.4  本章小结 184

第15章  实现Web Service 185

15.1  REST风格的Web Service 185

15.1.1  什么是REST 185

15.1.2  在Grails中实现REST 185

15.1.3  在Client端调用服务 187

15.2  基于SOAP的传统Web Service 188

15.3  本章小结 189

第16章  使用Grails插件 190

16.1  插件的安装 190

16.2  插件的组织结构 196

16.3  插件的使用 197

16.3.1  Acegi插件 197

16.3.2  Debug插件 204

16.4  本章小结 205

第四篇  Grails解密

第17章  高级Groovy特性 208

17.1  动态方法调用与属性访问 208

17.1.1  动态方法调用 208

17.1.2  动态属性访问 208

17.2  invokeMethod和getProperty 209

17.3  MOP动态基础 211

17.3.1  遍历方法和属性 211

17.3.2  动态添加方法 213

17.3.3  动态添加属性 215

17.3.4  使用方法对象 216

17.3.5  为某一特定的实例

添加方法 217

17.4  本章小结 218

第18章  Grails插件开发 219

18.1  创建与发布插件 219

18.2  插件能做什么 221

18.2.1  添加Spring配置信息 223

18.2.2  与Spring容器交互 224

18.2.3  修改web.xml 224

18.2.4  添加动态方法 226

18.2.5  捕获变更 227

18.3  插件的依赖关系 229

18.4  在安装或升级时执行附加操作 230

18.5  本章小结 230

第19章  浅析Grails的源程序 231

19.1  准备工作 231

19.1.1  下载源码 231

19.1.2  编译Grails源码 231

19.2  HibernateCriteriaBuilder的原理 233

19.3  开启Hibernate Query Cache 237

19.4  本章小结 241

第20章  未来Grails版本的新特性 242

20.1  GORM的新特性 242

20.1.1  更多的GORM事件 242

20.1.2  映射基本类型的集合 243

20.1.3  对Domain的只读访问 243

20.1.4  定义默认排序字段 243

20.1.5  改进的findBy 245

20.2  对插件系统的改进 245

20.3  数据绑定 245

20.4  在GSP中使用JSP的标签 246

20.5  加密配置文件中的数据库密码 246

20.6  本章小结 246

参考文献 247

索引 248

Grails技术精解与Web开发实践

XII

XI

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个