可惜啊,短短一章的篇幅无法承载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应用。