讀古今文學網 > Java程序員修煉之道 > 13.5 深入Grails >

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.PlayerCharacter
new PlayerCharacter(strength:18, dexterity:15, charisma:15).save
  

PlayerCharacter保存好後有很多種辦法可以讀取它。最簡單的辦法是通過Grails添加到域對像類中的隱含id屬性取回可寫的完整實例。在控制台用下面這段代碼換掉前面那段並執行。

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

要更新對象,修改一些屬性然後再次調用save方法。請再次清空控制台並運行下面這段代碼。

import com.java7developer.chapter13.PlayerCharacter
def pc = PlayerCharacter.get(1)
pc.strength = 5
pc.save
pc = PlayerCharacter.get(1)
assert 5 == pc.strength
  

要刪除對像請用delete方法。再次清空控制台並運行下面的代碼,刪除PlayerCharacter

import com.java7developer.chapter13.PlayerCharacter
def 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應用。