关于学习代理的一些经验!
2010-09-23 17:18
274 查看
Grails原生的scaffolding机制所生成的代码主要用于模型验证,在实际中基本无法直接在项目中使用,主要原因如下:
生成的CRUD中的代码过于简单,不包含:搜索(Ajax)、Tooltip、表单分组/分栏等
Domain模型中没有包含对所生成的View层代码的控制信息和基础信息
现有的Domain模型,如果通过attributes进行自定义的扩展不符合Grails的整体思路
无法实现单一模型对多个View的情况,如:针对互联网版本和针对手机客户端版本
针对以上问题,如果可以通过引入Domain元数据的方式,通过元数据中的基础信息和控制信息,生成相互联系的Gomain/Controller/Views将一定程度上提升开发的效率,具体的思路如下:
元数据定义示例:
book.groovy
实现思路:
通过GroovyScriptEngine动态加载所需生成对象以及所关联对象的的元数据
通过GStringTemplateEngine加载模板,并生成:Domain定义、Controller和Views
Domain模板:
Generator代码片段:
生成的domain代码:
生成的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() { "书籍"+"实例" } }
相关文章推荐
- 个人总结--关于学习过程中的一些经验心得分享
- 关于代码阅读的编程实现技巧及自己工作学习的一些经验(推荐看后面的后记)
- R语言-关于对象学习的一些注释和实例
- 关于学习JavaScript 的 高三编程 一些心得(三)
- 一些关于目标追踪的学习体会
- 关于java学习的一些东西
- 【关于MFC操作Excel表格的一些经验】
- 关于分布式系统的一些学习心得-笔记
- java学习笔记--关于interface和abstract的一些思考
- 关于 UICollectionView 的一些代理和数据源方法
- 学习Java的一些经验讲解!
- 关于ccna的一些学习笔记
- 学习unity的一些经验和见解
- 关于RDLC报表的一些总结,希望对正在学习使用它的朋友有所帮助
- 【大家好,我有几个关于创业的问题,希望有创业经验,或是现在在开公司的朋友们给一些建议?】
- 关于APK瘦身值得分享的一些经验
- 【转载】分享Swing学习的一些经验
- 关于cloudstack 个人使用的一些经验记录
- 关于线上静态页面资源更新的一些经验分享
- 关于框架的一些学习笔记