偶然要帮忙做次 Grails 面试,回味遍久别的 Grails,曾经对它也是无限热爱,不过后来投入 Spring 全家桶门下,今天就简单分享一下 Grails。
Grails 是一个开源的Web框架,旨在简化Web应用开发,提供全栈开发能力,自 2009 年以来已有十年历史。
它由 Spring全家桶所属公司 Pivotal 出品,在国外应用广泛,国内相对较少。
秉承着 " 约定优于配置(Convention Over Configuration) "、 "Don’t Repeat Yourself" 理念,在曾经开发人员呕吐着与漫天飞舞的配置信息做斗争的时代,Grails 真是让人眼前一亮、激动难安。后来,Spring Boot 打破了宁静,微服务的加持,又是另一番景象了。
Grails 采用动态语言 Groovy, 优雅高效,当前应用框架已基于 Spring Boot 之上,前端除自带的视图层技术GSP外,亦支持 Angular、React、Vue等。利用Grails可以快速搭建Web应用。
下面是个Demo,通过简单的领域类
User
,利用脚手架工具就可以一键创建简单CRUD逻辑、简单页面和单元测试。
下面以实际的Demo介绍一些特性。
采用MVC三层,下面是项目的默认目录结构,理解简单。
controllers、views、services
三层。
├── assets
├── conf
├── controllers
├── domain
├── i18n
├── init
├── services
├── taglib
├── utils
└── views
以
Controller
为例,不用做任何配置,Controller 下的函数(
action
) 自动暴露对外访问。
class UserController {
def list() {
def userId = params.id
def data = [userId: userId, name: "kitty"]
render data as JSON
}
}
访问示例:
curl --location --request
GET 'http://localhost:8080/user/list?id=1'
Groovy 作为动态语言且拥有很多高级特性,开发非常高效。
在应用运行期间直接开发,即时编译,可以和前端开发一样立马看到效果,不用重启应用
File ...controllers/UserController.groovy changed, recompiling...
Grails application running at http://localhost:8080 in environment: development
很早就拥有 Java8
lambda表达式、函数式编程
等类似特性
语法兼容Java,会Java则可以使用 Groovy
有着ES6+的编程舒适感
// List 定义与遍历, 常见聚合操作支持
def list = [1, 2, 3, 4]
list.each { print it }
list.sum()
// Map 定义与遍历
def map = [name: "hello", value: "grails"]
map.each { println it.key + ":" + it.value }
// 在函数内可直接定义函数并使用, 也可以把函数作为参数传递
def add = { num -> return ++num }
println add(1)
GORM 基于 Hibernate,拥有多种查询方式,使用非常简单,下面以 User Domain演示。
class User {
Long id
String name
Integer age
Long lastUpdatedBy
// 丰富的字段约束限制
static constraints = {
name(nullable: false)
age(range: 0..150)
}
// 各类拦截操作, 全局或特定Domain都支持
def beforeUpdate() {
lastUpdatedBy = -1
}
}
下面看看其CRUD,Domain类自带CRUD操作。
// 新增并保存对象, 更新同操作
User user = new User()
user.save()
// 根据主键查记录, 查出来后为 readonly
User.read(1)
// 根据主键查记录, 查出来后可操作
User.get(1)
// 锁住记录(DB锁)
user.lock(1)
// 删除记录
user.delete()
// 多种查询方式
User.list()
User.findAll { name == "kitty" }
User.executeQuery("from User where 1=1")
def query = User.where { name == "kitty" }
query.find()
def criteria = User.createCriteria()
def results = criteria {
between("age", 1, 20)
eq("name", "kitty")
like("name", "Fred%")
order("name", "desc")
}
IDEA 友好的提示:
Grails 有着丰富的插件(1000+),常用工具都能找到,也可以引入Maven依赖。插件既可以是普通的工具组件,也可以是模块化的应用,插件可以是前端组件,也可以是后端组件。
下面是
AdminLTE UI
插件。
自研的GSP(Groovy Servers Pages)技术用于展示层,类似于JSP,但使用更便利。
例如,在接口中直接返回
book
对象。
def show() {
[book: Book.get(params.id)]
}
在
.gsp
页面中,可以直接使用:
${book.title}
和JSP类似,提供了大量的标签。
<g:if test="${flash.message}">
<div class="message" role="status">${flash.message}</div>
</g:if>
<f:table collection="${userList}" />
<div class="pagination">
<g:paginate total="${userCount ?: 0}" />
</div>
越简单,自然越重,开发时电脑资源消耗高。
打包后体积大,空项目达
73M
,而 Spring Boot 空项目
17M
。
国内较冷,不好找工作