`
热带翎羽
  • 浏览: 62421 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Grails原生的scaffolding的改进设想

阅读更多
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
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics