首页 » Java程序员修炼之道 » Java程序员修炼之道全文在线阅读

《Java程序员修炼之道》13.5 深入Grails

关灯直达底部

可惜啊,短短一章的篇幅无法承载Grails框架的所有内容,因为它需要一本书!在这一节,我们再为新加入Grails阵营的开发人员讲一些值得探索的领域:

  • 日志;
  • GORM:Grails对象—关系映射;
  • Grails插件。

另外,也可以到http://www.grails.org网站上去看看,上面有关于这些主题的基本教程。Glen Smith和Peter Ledbrook写的Grails in Action(Manning, 2009)也值得仔细阅读。

我们从Grails的日志入手吧。

13.5.1 日志

Grails的日志功能是由log4j提供的,在grails-app/conf/Config.groovy文件中配置。

比如说,你可能想要chapter13包中的代码显示WARN消息,而域对象类PlayerCharacter只显示ERROR消息。要满足这一要求,可以把下面这段代码放到log4j的配置文件Config.groovy文件中。

log4j = {   ...   warn /'com.java7developer.chapter13/'   error /'com.java7developer.chapter13.PlayerCharacter/',         /'org.codehaus.groovy.grails.web.servlet/', // 控制器   ...}  

日志配置就跟你过去用log4j的log4j.xml配置一样灵活。

接下来我们会看看Grails中的对象关系映射技术GORM。

13.5.2 GORM:对象关系映射

GORM是用Spring/Hibernate实现的,这是Java开发人员非常熟悉的技术组合。它所涵盖的功能非常广泛,但其核心功能非常像Java的JPA。

要想马上实验一下它的持久化行为,可以执行如下命令打开Grails控制台:

grails console  

还记得第8章讲的Groovy控制台吗?这个Grails应用环境跟那个非常类似。

首先,我们保存一下PlayerCharacter域对象:

import com.java7developer.chapter13.PlayerCharacternew PlayerCharacter(strength:18, dexterity:15, charisma:15).save  

PlayerCharacter保存好后有很多种办法可以读取它。最简单的办法是通过Grails添加到域对象类中的隐含id属性取回可写的完整实例。在控制台用下面这段代码换掉前面那段并执行。

import com.java7developer.chapter13.PlayerCharacterdef pc = PlayerCharacter.get(1)assert 18 == pc.strength  

要更新对象,修改一些属性然后再次调用save方法。请再次清空控制台并运行下面这段代码。

import com.java7developer.chapter13.PlayerCharacterdef pc = PlayerCharacter.get(1)pc.strength = 5pc.savepc = PlayerCharacter.get(1)assert 5 == pc.strength  

要删除对象请用delete方法。再次清空控制台并运行下面的代码,删除PlayerCharacter

import com.java7developer.chapter13.PlayerCharacterdef pc = PlayerCharacter.get(1)pc.delete  

GORM具备完整丰富的多对一、多对多关系声明能力,以及其他我们熟悉的Hibernate/JPA所支持的关系声明能力。

现在我们去看看从Rails“拿来”的插件概念。

13.5.3 Grails插件

Grails有大量插件,可以帮开发人员完成常见的Web开发任务。其中最流行的插件有:

  • Cloud Foundry Integration(用于将应用部署到云服务上);
  • Quartz(用于计划调度);
  • Mail(用于处理电子邮件);
  • Twitter、Facebook(用于社交网络集成)。

要查看有哪些插件可用,请执行如下命令:

grails list-plugins  

然后可以执行grails plugin-info [名称]查看插件的更多信息,用感兴趣的插件名称替换[名称]就可以了。此外,也可以访问http://grails.org/plugins/深入了解这些插件及其生态系统的信息。

要安装插件,请运行grails install-plugin [名称],用要安装的插件名称替换[名称]。比如说,为了更好地支持日期和时间,可以安装Joda-Time插件。

grails install-plugin joda-time  

装上Joda-Time插件后,可以给PlayerCharacter加上LocalDate属性。把下面的import语句加到域对象类中。

import org.joda.time.*import org.joda.time.contrib.hibernate.*  

把下面这个属性加到PlayerCharacter中。

LocalDate timestamp = new LocalDate  

为什么这跟引用JAR文件中的API不同呢?因为Joda-Time插件会确保该类型跟Grails 惯例优先的原则兼容。这就是说Joda-Time的类型是映射到数据库类型上的,并且完全支持它的映射和脚手架处理。如果现在回到http://localhost:8080/pcgen_grails/playerCharacter/list页面中,会看到列出了日期。

借助插件的这类支持,Grails开发人员可以用很短的时间构建出数量惊人的功能。

我们对Grails的初次拜访结束了,但本章中Web快速开发的故事还没讲完。下一节会讨论Clojure的Web快速开发类库Compojure。熟悉Clojure的开发人员可以借助它用简洁的Clojure代码迅速构建出小到中型的Web应用。