转载

Spring 全家桶火遍大江南北,兄弟产品 Grails 国内却依旧冷清

偶然要帮忙做次 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逻辑、简单页面和单元测试。

Spring 全家桶火遍大江南北,兄弟产品 Grails 国内却依旧冷清

下面以实际的Demo介绍一些特性。

简单的MVC分层

采用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 的魅力

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 持久层

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 友好的提示:

Spring 全家桶火遍大江南北,兄弟产品 Grails 国内却依旧冷清

丰富的插件

Grails 有着丰富的插件(1000+),常用工具都能找到,也可以引入Maven依赖。插件既可以是普通的工具组件,也可以是模块化的应用,插件可以是前端组件,也可以是后端组件。

下面是 AdminLTE UI 插件。

Spring 全家桶火遍大江南北,兄弟产品 Grails 国内却依旧冷清

灵活的视图层

自研的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

  • 国内较冷,不好找工作

原文  http://mp.weixin.qq.com/s?__biz=MzUxMjY2MDQyOQ==&mid=2247483977&idx=1&sn=f192d89dca08b0194e2e106fea967079
正文到此结束
Loading...