登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

杨柳千丝,绊惹春风

普通人日记

 
 
 

日志

 
 
关于我

性格还算开朗,为人还算不错。 长相一般,身高一般,能力一般,人是一般。 不会浪漫,不会情调,不会唱歌,不会跳舞,不会吸烟,不爱喝酒,不会开车,爱听老歌

Groovy 和Grails从入门到精通 第四章 grails 介绍(七)  

2010-08-02 22:17:46|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

完善域类和控制类

      现在你已创建了Todo的域类和控制器类,你可以重复创建域类和控制器类的步骤来完成剩余的域类和控制器类:Category User。之后你可以添加域类间的关联了(见下小节)。

      4-6UML图例所示,Category类非常简单。列表4-9所示的代码就是使用create-domain-class命令生成的Category类,并添加了图4-6UML图例中的属性。

      列表 4-9. Category 域类

class Category {

String name

String description

static constraints = {

name(blank:false)

}

String toString() {

name

}

}

 

列表4-9中的Category 类只有namedescription两个属性和一个重载的toString()方法用来返回name属性。这个重载的toString()方法在稍后将变得非常重要,因为它要用于HTML的选择域(populate an HTML

select field),没有重载toString(),这个选择域只能显示CategoryID,这样的话在HTMLLIST页面中很难分辨出每个Category对象。

User域类与cagegoryTodo域类是相同的格式,列表4-10所示的代码就是使用create-domain-class命令生成的User类,并添加了图4-6UML图例中的属性。

列表 4-10. User域类

class User {

String userName

String firstName

String lastName

static constraints = {

userName(blank:false,unique:true)

firstName(blank:false)

lastName(blank:false)

}

String toString () {

"$lastName, $firstName"

}

}

      列表4­-10所示的user域类包含userNamefirstNametlastName三个属性,构造限制用来限制所有的属性不为空,并且强制userName在数据库中唯一。最后重载了toString()方法用来返回firstNamelastaName

注意:如果应用程序运行在默认开发数据源配制环境(development data-source configurations中,你改变域类或控制器类,所有数据都会丢失。其原因是改变域类将导致Hibernate重新生成数据库结构。在12章你将学习如何改变开发数据源配制环境(development data-source configurations

 

 

Category控制器类创建过程完全重复TodoController,列表4-11显示了通过create-controller命令创建的CategoryController和脚手架变量设置。

Listing 4-11. CategoryController

class CategoryController {

def scaffold = Category

}

 

列表 4-12显示的是 UserController.

Listing 4-12. UserController

class UserController {

def scaffold = User

}

完成了usercategory域类和控制器类后,应用程序的开始页面显示出了三个控制器。另外,当点击各自的控制器链接时,usercategoryCRUD页面都是可用的。

 

创建域类关联

到目前为止,你建立了三个毫无关联的独立域类:TodoUserCategory。但是,你应该还记得图4-6所示的UML图例,user类还有todo类是通过它们的属性即category类关联组织起来的。现在,是使用gelongsTohasMany属性把域类之间的这种一对多的关系表现出来时候了。

列表4-13显示的是改进后的Tode类,里面显示出了与usercategory类的关系。

Listing 4-13. Todo 域类与User Category域类的关系

class Todo {

String name

String note

Date createdDate

Date dueDate

Date completedDate

String priority

String status

User owner

Category category

static belongsTo = [User, Category]

static constraints = {

name(blank:false)

createdDate()

priority()

status()

note(maxSize:1000, nullable:true)

completedDate(nullable:true)

dueDate(nullable:true)

}

String toString() {

name

}

}

注意列表4-13Tode域类与UserCategory域类的关系是用belongsTo属性来定义的。我们在Tode域类增加了两个新的属性:ownercategorygelongsTo属性告诉GORM如果关联的usercategory被删除的话同时删除Todo类。Grails的脚手架将这种域类之间的关系以选择栏形式发送到CreateTodoEditTodo页面,如图4-16

Groovy 和Grails从入门到精通 第四章 grails 介绍(七) - 虹 - 杨柳千丝,绊惹春风

 图

4-16 创建 Todo页面中的Category Owner选择栏

注意到图4-16OwnerCategory的选择栏中列举出来的是域类中toString()返回出来的值。

Todo域类类似,Categoryuser的关系也是belongsTo,但它同样也是Todos的一个集合,如列表4-14:

Listing 4-14. Category 域类与UserTodo域类的关系

class Category {

String name

String description

User user

static belongsTo = User

static hasMany = [todos: Todo]

static constraints = {

name(blank:false)

}

String toString() {

name

}

}

注意到,Category域类除了通过belongsToUser域类关联外,还包含了一个hasMany属性用来映射与Todo类的关系是一对多的关系。同理,这个集合通过CategoryTodos属性来保持有效性。

最后,列表4-15显示了user域类与TodoCategory类的关系。

列表4-15 user域类与TodoCategory类的关系

class User {

String userName

String firstName

String lastName

static hasMany = [todos: Todo, categories: Category]

static constraints = {

userName(blank:false,unique:true)

firstName(blank:false)

lastName(blank:false)

}

String toString () {

"$lastName, $firstName"

}

}

如列表4-15所示,User域类增加与TodoCategory类的关系只需要一行代码。hasMany属性标示出集合名称是:todos categories

提示:我们将在第六章进行更多的关系讨论。

如前面所述,当你运行程序时,Hibernate依据域类创建数据库结构。图4-17显示了到目前为止的所有域类的实体关系图。

Groovy 和Grails从入门到精通 第四章 grails 介绍(七) - 虹 - 杨柳千丝,绊惹春风

                 

4-17 实体关系图

注意图4-17的实体关系图与4-6UML图示非常相像。Hibernate创建了三个以类名为表名的数据表,创建表字段时采用了下划线命名法而不是“驼峰命名法(译注:在英语中,依靠单词的大小写拼写复合词的做法,叫做“驼峰命名法”(CamelCase)。比如,backColor这个复合词,color的第一个字母采用大写)。同时注意到idversion列是Hibernate对象标识符(object identity开放式锁定(optimistic locking)。Hibernate也生成外键用来体现两个域类的关系。

开发过程中,灵活的(out-of-the-box)Grails使用了甘特网络容器(Jetty web container)和嵌入式的HSQLDB数据库。然而在许多操作环境中使用了其它的网络容器或者应用程序服务器以其基于服务的数据库(However, many operational environments use other web containers or applications servers and use server-based databases.)。在12章,我们将看到如何打包和部署应用程序到可选的操作环境。

总结

在本章,我们了解到Grails是网络开发框架,它是基于Java平台,并集成了最好的Java开源代码、规约和Groovy动态语言。

同时,你看到了如何使用Grails脚手架轻易的搭建一个功能全面的应用程序。在第5章,你将学习如何使应用程序更完美,你可以定制应用程序的外观,并且使控制器功能更强大。在第6章,你将学习增加域类功能,包括GORM的持久性功能。

  评论这张
 
阅读(766)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018