Grails原生的scaffolding机制所生成的代码主要用于模型验证,在实际中基本无法直接在项目中使用,主要原因如下:
- 生成的CRUD中的代码过于简单,不包含:搜索(Ajax)、Tooltip、表单分组/分栏等
- Domain模型中没有包含对所生成的View层代码的控制信息和基础信息
- 现有的Domain模型,如果通过attributes进行自定义的扩展不符合Grails的整体思路
- 无法实现单一模型对多个View的情况,如:针对互联网版本和针对手机客户端版本
针对以上问题,如果可以通过引入Domain元数据的方式,通过元数据中的基础信息和控制信息,生成相互联系的Gomain/Controller/Views将一定程度上提升开发的效率,具体的思路如下:
元数据定义示例:
book.groovy
class Book {
static domain=[name:"Book", chinese:"书籍"]
static fields=[
[type: "String", name:"name", chinese:"书名", tooltip:"请输入书籍名称"],
[type: "Author", name:"author", chinese:"作者", tooltip:"请输入作者姓名", hasMany:true]
]
static views=[list:[template:"simpleList",ajaxSearch:true]
]
}
实现思路:
- 通过GroovyScriptEngine动态加载所需生成对象以及所关联对象的的元数据
- 通过GStringTemplateEngine加载模板,并生成:Domain定义、Controller和Views
Domain模板:
// 作者: bruce.lin.chn@gmail.com
// 时间: $date
package $domain.pkg
//模型: $domain.chinese
class $domain.name {<% fields.each{key,value -> %>
$value.type $key //$value.chinese <% } %>
static constraints = {<% fields.each{key,value -> %>
$key($value.constraintsString)<% } %>
}
String toString()
{
"$domain.chinese"+"实例"
}
}
Generator代码片段:
// Author: bruce.lin.chn@gmail.com
// Date: 2010-10-17
// Time: 12:37:10
import groovy.text.TemplateEngine
import groovy.text.Template
import groovy.text.GStringTemplateEngine
outputPath="./output"
generatingClasses=["Book"]
String[] loadingPaths = ['./input']
engine = new GroovyScriptEngine(loadingPaths)
generatingClasses.each{className->
clazz = engine.loadScriptByName(className+'.groovy')
instance = clazz.newInstance()
instance.domain.each{ key, value ->
println " "+key+":"+value
}
instance.fields.each{ key, value ->
println " "+key+":"+value
}
instance.fields.each{ key, value ->
value.constraintsString=""
value.constraints.each{ckey,cvalue->
if(value.constraintsString !="")
{
value.constraintsString+=","
}
value.constraintsString+=ckey+":"+cvalue.toString()
}
}
//Generating domain source code
File templateFile = new File("templates/domain.template");
TemplateEngine templateEngine = new GStringTemplateEngine();
Template template = templateEngine.createTemplate(templateFile);
println template.make(date:new Date(),domain:instance.domain,fields:instance.fields)
}
生成的domain代码:
// 作者: bruce.lin.chn@gmail.com
// 时间: Sun Oct 17 21:31:27 CST 2010
package application.
//模型: 书籍
class Book {
String name //书名
String author //作者
static constraints = {
name(size:2..20,blank:false)
author(size:2..20,blank:false)
}
String toString()
{
"书籍"+"实例"
}
}
- 大小: 47.8 KB
分享到:
相关推荐
NULL 博文链接:https://search.iteye.com/blog/383347
Grails视频教程:A screencast that demonstrates Grails' scaffolding feature
Grails Grails Grails Grails Grails
Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南
First-time developers are amazed at how quickly you can get a page-centric MVC web site up and running thanks to the scaffolding and convention over configuration that Grails provides. Advanced web ...
Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。
Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程
Grails1.1中文文档
grails+Xfire webservice
在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...
第5章 脚手架(scaffolding) 5.1 动态脚手架 5.1.1 创建操作(create) 5.1.2 读取操作(read) 5.1.3 更新操作(update) 5.1.4 删除操作(delete) 5.1.5 重写(overriding)crud...
grails-2.1.zip.001
详细讲解grails开发环境配置。 详细讲解grails连接mysql数据库,crud开发
Grails专为下一代JavaWeb应用程序而设计的框架,其借助于Groovy动态语言,使Web开发变得简单而方便。Grails尽量为更多现有的Java项目创建一个全面的框架(不仅局限于视图处理),这和当前一些Java框架提供给用户的一...
Grails 中文 参考手册
grails grails入门经典 grails入门 grails例子 grails资料 通过自学一点点积累起来的,相信对你有帮助的。
Grails 1.3.7英文版官方参考手册,学习Grails的权威指南
grails 中文文档+grails-fckeditor-0.9.5.zip插件
grails3.2.8 part1