Grails 的誕生緣起於 Ruby on Rails 的革命性影響。Rails 以「約定優於配置」的理念、強大的腳手架功能以及 Ruby 的元編程能力,讓 Web 開發效率大幅提升。然而,對於深耕 Java 生態系的開發團隊而言,完全遷移到 Rails 意味著放棄現有的 Java 代碼庫、生產環境與團隊專長——這是一個艱難的抉擇。
Grails 正是為了解決這個兩難而生:它提供 Rails 風格的開發體驗,同時以成熟穩健的 Java 平台為後盾。但 Grails 絕非單純的 Rails 移植版;它吸收了 Rails 的精華,融合現代 Java 開發實踐,是一個「受 Rails 啟發」而非「由 Rails 轉化」的原生框架。
正如 Rails 緊扣 Ruby,Grails 的靈魂在於 Groovy——一種運行在 JVM 上、與 Java 無縫互通的動態語言。Groovy 專為 Java 開發者設計,學習曲線平緩,甚至可直接將 .java 檔案重命名為 .groovy 即可執行。
Groovy 大幅精減樣板代碼:
list.each { ... } 取代冗長的迭代器寫法更關鍵的是,Groovy 與 Java 的深度兼容讓 Grails 能直接複用成熟 Java 技術棧:
GroovyTestCasegrails.zip 並解壓(內含 Groovy、Spring、Hibernate 等所有依賴)GRAILS_HOME 環境變數,並將 $GRAILS_HOME/bin 加入 PATHgrails -version 驗證Welcome to Grails 1.0 - https://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails
無需額外安裝伺服器與資料庫:內建 Jetty Servlet 容器與 HSQLDB 純 Java 資料庫,grails run-app 即可啟動;生產部署只需 grails war 產出標準 WAR 檔,可部署至 Tomcat、JBoss、WebSphere 等任何 Java EE 2.4 相容容器。切換資料庫僅需修改 DataSource.groovy 並放入 JDBC 驅動。
我們將構建一個「行程規劃器」,解決行程表只管時間、地圖只管地點的痛點。
grails create-app trip-planner
cd trip-planner
Grails 依約定建立標準目錄結構,讓任何開發者都能秒懂專案佈局。
grails create-domain-class Trip
編輯 grails-app/domain/Trip.groovy:
class Trip {
String name
String city
Date startDate
Date endDate
String purpose
String notes
}
無需寫 getter/setter,Groovy 動態注入。更強大的是,GORM 自動賦予持久化方法:
Trip.save()、Trip.delete()Trip.list()、Trip.get(id)這些方法無需繼承父類或實作介面,純粹靠 Groovy 元編程在運行時「憑空出現」。
grails generate-all Trip
產出 TripController 與對應 GSP 視圖。以 list 動作為例:
def list = {
if(!params.max) params.max = 10
[ tripList: Trip.list(params) ]
}
最後一行隱式返回 Map,鍵 tripList 對應 list.gsp 中的 ${tripList}。分頁、排序皆自動處理,零 XML 配置。
grails run-app
瀏覽 https://localhost:8080/trip-planner,點擊 TripController 即擁有完整 CRUD 介面。



grails stats
+----------------------+-------+-------+
| Name | Files | LOC |
+----------------------+-------+-------+
| Controllers | 1 | 66 |
| Domain Classes | 1 | 8 |
| Integration Tests | 1 | 4 |
+----------------------+-------+-------+
| Totals | 3 | 78 |
+----------------------+-------+-------+
不足 100 行代碼實現完整功能。
將 TripController 精簡為:
class TripController {
def scaffold = Trip
}
3 行代碼替換 66 行,運行時動態生成所有 CRUD 動作。啟動生產模式 grails prod run-app 資料持久化不丟失,同樣只需 15 行有效代碼 驅動整個應用。
Grails 以一個 ZIP 檔、幾條指令、極少代碼,展現了驚人的生產力。這只是冰山一角,下一篇將深入 GORM:MySQL 整合、資料驗證、一對多關聯,進一步強化行程規劃器。敬請期待!