shinewang

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  53 随笔 :: 0 文章 :: 200 评论 :: 0 Trackbacks

Grails 1.1 Beta 2发布了,Groovy 1.6 finalGrails 1.1 final也越来越近,不过已经不是很感兴趣了。虽然对于Java开发者来说,相比RailsGrails更容易上手,但它并不成熟的。在论证 Grails的成熟度时,Graema说:你会把SpringHibernate看作风险吗?” SpringHibernate确实不是风险,但GrailsSpringHibernate的包装却是一个极大风险,在种种危险中,最主要的一点是我们已经对底层框架的抽象太成功了,以至于有时会出现问题。具体可以看看这个例子。使用Grails,不如使用JRuby On Rails或者Play!

 

不管怎么样下面介绍一下1.1版本的新特性:

 

GORM

更好的GORM事件

之前, GORM 只支持 beforeInsert, beforeUpdate beforeDelete 事件, 现增加了afterInsert, afterUpdate afterDelete 来完成图片操作

 

基本类型集的持久化

GORM 现在支持基本类型比如String, Integer 等使用一个连接表的持久化。

class  Person {    

static  hasMany = [nicknames:String] 

}  

 

class Person {

 

   static hasMany = [nicknames:String]

 

}

 

对象的只读访问

现在,持久化实例对象可以使用read 方法以只读状态被加载:

def book = Book.read(1)

                       

默认的排列顺序

现在,关联可以使用一个类级别声明的默认的排列顺序来排序:

class Book {

  String title

  static mapping = {

     sort "title"

  }

}

或在关联级别上:

class Author {

    static hasMany = [books:Book]

    static mapping = {

              books sort:"title"

    }

}

 

批处理

现在GORM 支持使用ORM DSL 在类级别上配置批处理batch fetching ( 延迟加载的优化):

class Book {

  String title

  static mapping = {

     batchSize 15

  }

}

或在关联级别上:

class Author {

    static hasMany = [books:Book]

    static mapping = {

              books batchSize:15

    }

}

 

动态Finders的改进

动态查询器的新后缀InList 可用:

def groovyBooks = Book.findByAuthorInList(['Dierk Koenig', 'Graeme Rocher'])

现在,Dynamic finders 也能查询缓存:

def books = Book.findByTitle("Groovy in Action", [cache:true] )

可以使用悲观锁:

def books = Book.findByTitle("Groovy in Action", [lock:true] )

 

单项的One-to-many遗留映射

单项的One-to-many关联关系可以使用joinTable 参数改变它们对底层数据库的映射:

class Book {

  String title

  static belongsTo = Author

  static hasMany = [authors:Author]

  static mapping = {

     authors joinTable :[name:"mm_author_books", key:'mm_book_id' ]

  }

}

class Author {

  String name

  static hasMany = [books:Book]

  static mapping = {

     books joinTable:[name:"mm_author_books", key:'mm_author_id']

  }

}

 

增强枚举类型的支持

现在,枚举类型使用GORM 调用的getId ()方法来持久化枚举状态。

enum Country {

   AUSTRIA('at'),

   UNITED_STATES('us'),

   GERMANY('de');

   final String id

    Country(String id) { this.id = id }

}

 

插件

全局插件

现在,安装插件可以给所有的应用程序共享:

grails install-plugin webtest -global

 

多插件仓库

现在,Grails 支持通过提供多插件仓库配置的能力

使用USER_HOME/.grails/settings.groovy 文件或包含配置好的仓库详情的grails-app/conf/BuildConfig.groovy 文件。

grails.plugin.repos.discovery.myRepository="http://svn.codehaus.org/grails/trunk/grails-test-plugin-repo"

grails.plugin.repos.distribution.myRepository="https://svn.codehaus.org/grails/trunk/grails-test-plugin-repo"

Grails的插件命令如list-plugininstall-plugin会自动使用所有设置的插件仓库,发布一个插件到一个插件仓库可以是用下面的命令:

grails release-plugin -repository=myRepository

 

自动安装插件方案

插件不再需要到SVN 检出,当应用程序第一次加载时,通过插件元数据会自动安装。另外,插件的依赖关系问题已经解决了。

 

插件的作用范围和环境

现在,插件可以作用于环境或预置的构建范围内:

def environments = ['dev', 'test']

def scopes = [excludes:'war']

仅在那些环境中加载使用,而不打包到WAR 文件中。这使得产品使用时 "development-only" 的插件不会被打包

 

测试

测试框架

现在,作为1.0.x 系列可用插件的新测试框架已集成到 Grails 1.1.

该测试框架增加了模拟所以普通类型包扩控制器,领域类,标签库和url 映射简写的行为,快速运行单元测试。

class SongTests extends grails.test.GrailsUnitTestCase {

    void testMinimumDuration() {

        mockDomain(Song)

        def song = new Song(duration: 0)

        assertFalse 'validation should have failed', song.validate()

        assertEquals "min", song.errors.duration

    }

}

 

数据绑定

属性子集的数据绑定

现在更容易对属性的自己和进行数据绑定。在之前的版本中你也许会使用:

person.properties = params  

 

这将会将request中的所有变量绑定到person中。如果你不想绑定所有的数据的话,你可以使用 bindData 方法。现在你可以通过使用subscript operator来绑定部分的变量:

 

person.properties["firstName","lastName"] = params  

person.properties["firstName","lastName"] = params

 

要取得domain中的所有属性的一个子集也可以通过这样的方式:

person.properties["firstName","lastName"].each { println it } 

 

集合类型的数据绑定

Grails已经支持集合类型的数据绑定,例如listsetmap

<g:textField name="books[0].title" value="the Stand" />

<g:textField name="books[1].title" value="the Shining" />

<g:textField name="books[2].title" value="Red Madder" />

 

脚手架

模板和动态脚手架

现在,动态脚手架使用通过install-templates 命令安装的模板

 

支持更多关联类型

现在,Scaffolding 支持 many-to-many 和单项的 one-to-many 关联。



Groovy Server Pages

JSP中支持JSP标签库

现在,GSP 已经支持JSP 标签库复用的能力:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:formatNumber value="${10}" pattern=".00"/>

JSP 标签也可以像正常的GSP 标签一样调用:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

${fmt.formatNumber(value:10, pattern:".00")}

 

工程基本结构

Maven 集成 

Grails 1.1 缘自和 Maven plugin archetype 的关联,允许你使用Maven 更容易的构建Grails 工程。根据操作指南here或使用原型来创建一个新的Grails 工程, 或运行:

mvn grails:create-pom

来为已有工程创建一个Maven POM.

 

环境及元数据API  

使用新 API 来访问当前环境:

import grails.util.Environment

...

switch(Environment.current) {

        case Environment.DEVELOPMENT:

           configureForDevelopment()

        break

        case Environment.PRODUCTION:

           configureForProduction()

        break

}

当然也有一个易于访问应用程序元数据的新类:

def metadata = grails.util.Metadata.current

println metadata.applicationName

println metadata.applicationVersion

 

Log4j DSL  

新的 Log4j DSL 用于替换以前Log4j 配置的方式:

log4j = {

    error  'org.codehaus.groovy.grails.web.servlet',  //  controllers

               'org.codehaus.groovy.grails.web.pages' //  GSP

    warn   'org.mortbay.log'

}

详见user guide Log4j DSL 全部文档。

 

灵活的构建配置

新的 grails-app/conf/BuildConfig.groovy 文件可用,它允许你配置不同层面的Grails 构建输出路径和服务器使用插件的解决方案:

grails.work.dir="/tmp/work"

grails.plugins.dir="/usr/local/grails/plugins"

grails.project.test.reports.dir="/usr/local/grails/test-reports"

 

非交互模式 

现在,Grails 支持一种--non-interactive flag ,须键入到命令行,目的是关闭用户提示:

grails run-app --non-interactive

这对服务器持续集成是有帮助的。

 

加密数据源 

现在,数据源密码可以使用已提供的编码类来加密:

dataSource {

       username = "foo"

       password = "438uodf9s872398783r"

       passwordEncryptionCodec="my.company.encryption.BlowfishCodec"

}

支持的编码使用 Grails' 现存的编码机制。

 

升级备注

Grails 1.1 有很多改变,但大多是向后兼容1.0.x 系列的。如果有问题请报告。升级时,以下是已知需要注意的问题列表:

Plugins 不保存在你的 USER_HOME 路径下. 你需要重写安装插件或运行:

      grails -Dgrails.plugins.dir=./plugins run-app

现在枚举类型已经被映射到数据库,使用字符串值而不是原始默认的。

jsession id 默认已无效. 详见GRAILS-3364

GSP 空白符处理已经变好很多了,比以前有更多空白符. 详见GRAILS-3277

grails.testing.reports.destDir 配置选项已被替代为grails.project.test.reports.dir

现在,PreInit.groovy 改为BuildConfig.groovy

控制器中的allowedMethod 属性被标识为static 。非 static 版本不推荐使用,尽管它仍然起作用并在控制台产生信息。

 

Grails1.0这篇文章也可以作为参考。


posted on 2008-12-26 16:47 shinewang 阅读(1810) 评论(4)  编辑  收藏 所属分类: Groovy & Grails

评论

# re: Grails 1.1 Beta 2发布 2008-12-26 19:33 山风小子
任何事物都有两面性 :)  回复  更多评论
  

# re: Grails 1.1 Beta 2发布[未登录] 2008-12-26 22:32 daniel
在风险上,play!< spring+hibernate+groovy ??  回复  更多评论
  

# re: Grails 1.1 Beta 2发布 2008-12-26 23:01 shinewang
@daniel
很难说play!和grails究竟哪个风险高。play!虽然还不成熟,但核心代码很少,几百K的Java代码很容易搞清楚和自己扩展。play!的风险主要是它不是建立在spring+hibernate的基础上,也不能或者说不方便部署在tomcat这类常见的Java服务器上。而grails的风险其实也是不成熟产生的,一方面我们都知道封装带来易用性的同时也要付出灵活性的代价,另一方面grails对spring+hibernate的包装没有到位,所以导致用spring+hibernate很容易做的,用grails反而难做了。如果play!能够建立在spring+hibernate的基础上就完美了。  回复  更多评论
  

# re: Grails 1.1 Beta 2发布 2008-12-26 23:44 ci
good.  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: