dependencies {
// ...
implementation "org.grails.plugins:scaffolding"
// ...
}
19 Scaffolding
版本 6.2.0
19 Scaffolding
使用 Scaffolding 可为您生成一些基础的 CRUD 接口,供各种领域类使用,包括
-
必需的 视图
-
建立/读取/更新/删除 (CRUD) 操作的控制器操作
应用程序需表达对 scaffolding 插件的依赖方式是在 build.gradle
中包含以下内容。
动态 Scaffolding
开始使用 scaffolding 的最简单方式是,通过将控制器的 scaffold
属性设为特定领域类来启用
class BookController {
static scaffold = Book // Or any other domain class such as "Author", "Publisher"
}
通过此配置,在您启动应用程序时,操作和视图将在运行时自动生成。以下操作由运行时 scaffolding 机制以默认方式动态实现
-
索引
-
显示
-
编辑
-
删除
-
创建
-
保存
-
更新
还将生成一个 CRUD 接口。要访问这个接口,请在浏览器中打开 http://localhost:8080/book
。
注意:定义 scaffold
属性的旧式选择
class BookController {
static scaffold = true
}
已不在 Grails 3.0 以上版本中受支持。
如果您愿意用 Java 保存领域模型,并且 (用 Hibernate 映射),仍可以使用 scaffolding,只需导入领域类并将其名称设为 scaffold
参数即可。
您可以为 scaffolding 的控制器添加新的操作,例如
class BookController {
static scaffold = Book
def changeAuthor() {
def b = Book.get(params.id)
b.author = Author.get(params["author.id"])
b.save()
// redirect to a scaffolded action
redirect(action:show)
}
}
您还可覆盖 scaffolding 操作
class BookController {
static scaffold = Book
// overrides scaffolded action to return both authors and books
def index() {
[bookInstanceList: Book.list(),
bookInstanceTotal: Book.count(),
authorInstanceList: Author.list()]
}
def show() {
def book = Book.get(params.id)
log.error("{}", book)
[bookInstance : book]
}
}
所有这些操作都被称为“动态 scaffolding”,在此,CRUD 接口是在运行时动态生成的。
默认情况下,scaffolding 视图中文本区域的大小在 CSS 中定义,因此添加“行”和“列”属性不会产生任何效果。 |
此外,标准脚手架视图期望集合的模型变量形式为< propertyName>InstanceList
,而单实例形式为< propertyName>Instance
。使用“books”和“book”等属性很有吸引力,但它们不起作用。
静态脚手架
通过命令行,Grails 允许你生成一个控制器并生成用来创建上述界面的视图。若要生成一个控制器类型
grails generate-controller Book
或生成视图
grails generate-views Book
或生成所有内容
grails generate-all Book
如果你在一个包中有一个域类或者从一个Hibernate 映射类生成,请记住包含完全合格的包名称
grails generate-all com.bookstore.Book
自定义生成视图
视图适应于验证约束。例如,你可以在视图中更改字段出现的顺序,只需重新排序生成器中的约束
def constraints = {
title()
releaseDate()
}
如果你使用inList
约束,还可以让生成器生成列表,而不是文本输入
def constraints = {
title()
category(inList: ["Fiction", "Non-fiction", "Biography"])
releaseDate()
}
或如果你对数字使用range
约束
def constraints = {
age(range:18..65)
}
使用约束限制大小也会影响可以在 d 视图中输入的字符数
def constraints = {
name(size:0..30)
}
字段插件
<%-- Generate an HTML table from bookInstanceList, showing only 'title' and 'category' columns --%>
<f:table collection="bookInstanceList" properties="['title', 'category']"/>
自定义脚手架模板
通过使用install-templates命令安装模板,Grails 可以使用模板自定义用于生成控制器和视图的模板。