`
agile_boy
  • 浏览: 558202 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Grails 1.1 正式版发布

阅读更多
  在比较漫长的期待之后(期间经历了Grails被SpringSource收购和Groovy1.6助速的利好消息),Grails 1.1终于跟我们广大的Grailers见面了,正如Grails的Roadmap所描述,此次的发布新增不少的人性化的特性,闲话少说,让我们一起来对Grails 1.1的新特性,先睹为快,以下只是主要内容的摘录和简译,详细请参考原文:http://www.grails.org/1.1+Release+Notes

GORM--期待已久了:)

独立的GORM
GORM现在不再依赖Grails 1.1了,只需要带有命名空间的Spring配置来设置必要的Hibernate SessionFactory就好了:
<gorm:sessionFactory base-package="org.grails.samples" 
                     data-source-ref="dataSource"
	             message-source-ref="messageSource">
   <property name="hibernateProperties">
        <util:map>
             <entry key="hibernate.hbm2ddl.auto" value="update"/>
         </util:map>
   </property>
</gorm:sessionFactory>

上述示例将扫描"org.grails.samples"包,只要每个GORM实体被grails.persistence.Entity注释(annotation)就可以了:
@Entity
class Book {
    String title
}

更多信息参考在GRAILS_HOME/samples/petclinic-mvcSpring MVC petclinic示例。

更好的GORM事件支持
在以前的版本中,GORM已经支持beforeInsert, beforeUpdate和beforeDelete事件了,现在相对应的afterInsert, afterUpdate and afterDelete也完全支持了。

持久化原生类型集合(Persistence of Collections of Basic Types)
现在,GORM通过关联表(join table)的方式支持原生类型集合的持久化,象String, Integer等集合:
class Person {
   static hasMany = [nicknames:String]
}

持久化枚举类型集合
GORM提供对枚举类型集合的持久化:
enum VehicleStatus { OFF, IDLING, ACCELERATING, DECELARATING }
class Truck {
   static hasMany = [statuses:VehicleStatus]
}

只读的对象实例
通过read方法,领域对象实例可以以只读的方式加载:
def book = Book.read(1)

缺省的排序
关联关系(Associations)可以在类级别中声明一个缺省的排序:
class Book {
  String title
  static mapping = {
     sort "title"
  }
}

或者在关联级别(association level):
class Author {
    static hasMany = [books:Book]
    static mapping = {
              books sort:"title"
    }
}

批量读取(Batch Fetching)
GORM支持在类级别中使用ORM DSL来配置批量读取(优化的延迟加载):
class Book {
  String title
  static mapping = {
     batchSize 15
  }
}

或者在关联级别(association level):
class Author {
    static hasMany = [books:Book]
    static mapping = {
              books batchSize:15
    }
}

更好的动态查找器(Dynamic Finders)
现有的动态查找器中新增了InList后缀:
def groovyBooks = Book.findByAuthorInList(['Dierk Koenig', 'Graeme Rocher'])

动态查找器还可以使用查询缓存:
def books = Book.findByTitle("Groovy in Action", [cache:true] )

并且还支持悲观锁(pessimistic lock):
def books = Book.findByTitle("Groovy in Action", [lock:true] )

支持遗留系统的单向一对多映射
单向的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'] }
 }
更好的枚举类型支持
枚举类型现在可以通过特定的getId()方法来确定要持久化的状态信息。这是除了枚举名称或者顺序值(Enum name or the ordinal value)之外的另外一种持久化的机制。
enum Country {
   AUSTRIA('at'),
   UNITED_STATES('us'),
   GERMANY('de');

final String id

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


插件(Plugins)--确实比以前便利了很多
全局插件
可以插件插件为所有应用所全局共享:
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发现插件的命令(plugin discovery commands)比如list-plugin和install-plugin将会自动的根据所配置的仓库去工作,要发布一个插件到特定的仓库,你可以用repository参数来指定特定的仓库:
grails release-plugin -repository=myRepository

自动的解决插件依赖传递(Automatic Transitive Plugin Resolution)
插件将不再需要检测SVN,在应用第一次加载的时候,会根据插件的元数据自动的被安装。
此外插件的依赖也将会通过类似传递来解决

插件的范围和环境(Plugin Scopes and Environments)
Plugins可以通过指定环境(environment)或者预定义的构建来标识范围:
def environments = ['dev', 'test']
def scopes = [excludes:'war']

插件就会只加载那些environments中定义的,并将不会被打包到WAR文件中,这样开发类插件("development-only" plugins)就不会被打包到产品中.使用而不再产品中.

插件资源的排除(Plugin Excludes)
你可以在插件中描述那些要排除的某些资源:
def pluginExcludes = [
    'grails-app/controller/DemoController.groovy',
    'grails-app/domain/DemoDomain.groovy'
]

这将在最后打包插件的时候,排除那些test/demo的资源很有用.

使用插件进行模块化应用开发(Modular Application Development with Plugins)
一个应用可以从任何地方进行加载,甚至都没有安装都可以,要达到如此,你只需要在你的BuildConfig.groovy 文件中指定位置即可:
// Useful to test plugins you are developing.
grails.plugin.location.jsecurity = "/home/dilbert/dev/plugins/grails-jsecurity"

// Useful for modular applications where all plugins and // applications are in the same directory. 
grails.plugin.location.'grails-ui' = "../grails-grails-ui"

这样做在以下两处地方有好处:
   1. 你正在开发一个插件,但是想在真正的应用中测试,却又不想先打包再安装.
   2. 你将一个应用拆分成一系列插件和一个应用,而且这些都在同样的"super-project" 目录中

测试
测试框架
新的测试框架已经被集成到Grails 1.1了
测试框架增加了模仿所有通用类型比如controllers, domain class, tag libraries and url mappings,这样就可以更少更快的运行单元测试.
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 } 
}

数据绑定(Data Binding)--更灵活了
绑定属性的一个子集
更简单的绑定属性子集,以前的语法是:
person.properties = params

这将请求参数中所有数据绑定到person中。如果你不期望这样的行为,你可以使用bindData,而现在你要帮定属性的子集,只需要使用下标操作符(subscript operator)就可以了:
person.properties["firstName","lastName"] = params

要访问领域类属性的子集也是同样的语法:
person.properties["firstName","lastName"].each { println it }

集合类型的帮定
Grails支持象lists, sets和maps集合类型的绑定.
<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" />

Grails会根据指定的索引自动的初始化领域对象实例并且赋予相应的关联对象的值

脚手架(Scaffolding)
模板和动态脚手架
通过install-templates命令,可以安装模板,动态脚手架现在使用此模板来运行

支持更多的关联类型
脚手架支持多对多和单向的一对多关联关系

控制器(Controllers)--新特性还不错
更好的RESTful映射
你可以使用如下的REST URLs:
"/books"(resource:"book")

上述示例中URI "/books"将会自动的映射到BookController. 而HTTP的GET, PUT, POST 和DELETE 将会相应地被"show", "save", "update" and "delete"所处理.

处理重复的提交
通过同步令牌模式("Synchronizer Token Pattern"),Grails内建了对重复提交的处理。不过首先你要在form中声明一个令牌:
<g:form useToken="true">

然后通过withForm方法你可以检测出是重复的还是无效的请求:
withForm {
   // good request
}.invalidToken {
   // bad request
}

转发请求(Forwarding Requests)
作为重定向的一个替代,你可以通过forward方法来转发你的一个请求:
forward controller:"home", action:"index"

声明式的错误处理
你可以在你的UrlMappings文件中声明一个特定类型的异常处理:
"500"(controller:"errors", exception:IllegalArgumentException)


视图(Groovy Server Pages)--兼容性更好
在GSP中支持JSP的标签
GSP支持重用JSP的能力:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatNumber value="${10}" pattern=".00"/>

在GSP中也支持方法式的JSP标签调用 :
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
${fmt.formatNumber(value:10, pattern:".00")}

模板的命名空间(Template Namespace)
对于模板的使用来说,增加了一个特定的命名空间,因此一个如下所示的_tableRow.gsp模板:
<tr>
    <td class="prop">${label}</td>
    <td class="value">${value}</td>
</tr>

可以通过使用tmpl命名来调用:
<tmpl:tableRow label="one" value="two" />

服务器端的包含
新增了一个<g:include>标签在当前的视图中来引入另外一个controller, action 或者 view的响应:
<g:include controller="book" action="list"></g:include>

此标签也可以在 controller 或者 另外的tag library中使用:
def content = include(controller:"book", action:"list")

工程基础架构(Project Infrastructure)--更多更好的构建集成
maven集成
Grails 1.1 comes with an associated Maven plugin and archetype that allows you to build your Grails project easily using Maven. Follow the instructions here and either use the archetype to create a new Grails project, or run:
mvn grails:create-pom

to create a Maven POM for an existing project.

Ant + Ivy 集成
Grails now creates an Ant build.xml and corresponding ivy.xml file for each project allowing you to build a Grails project on any build server that supports Ant (like CruiseControl and Hudson) without needing Grails installed on the target server.

在BeanBuilder中支持Spring的命名空间
Grails' Spring DSL has been extended to include access to the Spring namespace APIs allowing you to easily use Spring advanced AOP support (among other things):
beans = {
   xmlns aop:"http://www.springframework.org/schema/aop"

fred(Person) { name = "Fred" age = 45 } birthdayCardSenderAspect(BirthdayCardSender)

aop { 
config("proxy-target-class":true) { 
aspect( id:"sendBirthdayCard",ref:"birthdayCardSenderAspect" ) { 
after method:"onBirthday", pointcut: "execution(void ..Person.birthday()) and this(person)" } } } }


Environment and Metadata API
There is a new API to access the current Environment:

import grails.util.Environment

...

switch(Environment.current) { case Environment.DEVELOPMENT: configureForDevelopment() break case Environment.PRODUCTION: configureForProduction() break }

There is also a new class for easily accessing application meta-data:
def metadata = grails.util.Metadata.current
println metadata.applicationName
println metadata.applicationVersion

Log4j DSL
A new Log4j DSL is available that replaces the old way of configuring Log4j:

log4j = {
    appenders {
        rollingFile name: 'fileLog', 
        fileName: 'logs/full.log', 
        maxFileSize: 26214400, 
        maxBackupIndex: 10, 
        layout: pattern(conversionPattern: '%d{yyyy-MM-dd HH:mm:ss,SSS} %p %c{2} %m%n')
    }
    root {
         error()
         additivity = true
    }
    error  'org.codehaus.groovy.grails.web.servlet',  //  controllers
	       'org.codehaus.groovy.grails.web.pages' //  GSP

debug fileLog:'grails.app'

warn 'org.mortbay.log' }

Full documentation for the Log4j DSL is available in the user guide.

Flexible Build Configuration
A new grails-app/conf/BuildConfig.groovy file is available that allows you to configure different aspects of the Grails build including output paths and servers used for resolution of plugins:
grails.work.dir="/tmp/work"
grails.plugins.dir="/usr/local/grails/plugins"
grails.project.test.reports.dir="/usr/local/grails/test-reports"


Non-interactive mode
Grails now supports a --non-interactive flag at the command line that can be passed in order to disable any user prompts:

grails run-app --non-interactive


This is useful for continuous integration servers.

Encrypted Data Sources
DataSource passwords can now be encrypted using a supplied codec class:

dataSource {
       username = "foo"
       password = "438uodf9s872398783r"
       passwordEncryptionCodec="my.company.encryption.BlowfishCodec"
}


The supplied codec uses Grails' existing codec mechanism


升级注意事项--有必要专门写个blog总结一下
Grails 1.1 是发生很多重要的变化,但是大部分还是向后兼容的。以下是已知的一些会影响升级的东东:
  • 现在插件默认是存储在你的USER_HOME目录,因此你需要重新安装你的那些插件,或者你通过以下的方式来运行:

grails -Dgrails.project.plugins.dir =./plugins run-app
         或者在BuildConfig.groovy中定义grails.project.plugins.dir =./plugins
  • 枚举类型现在缺省将String类型的名称映射到数据库,而不是以前的ordinals
  • jsession id被放弃掉了,详细查看GRAILS-3364
  • GSP的空格处理比以前更胜,现在你可以比以前写更多的空格,详细参考GRAILS-3277
  • grails.testing.reports.destDir配置参数已经被grails.project.test.reports.dir替代
  • PreInit.groovy现在已经变成BuildConfig.groovy
  • 控制器的allowedMethods属性现在需要被定义为static.

8
5
分享到:
评论
4 楼 热带翎羽 2010-10-09  
博主没说重点...
3 楼 agile_boy 2010-10-09  
热带翎羽 写道
发现你这里很多都是项目上很需要的技巧,很好奇你是如何学习到的呢?

不抱怨,不折腾。经历越多,收获越多。
2 楼 热带翎羽 2010-10-01  
发现你这里很多都是项目上很需要的技巧,很好奇你是如何学习到的呢?
1 楼 Arden 2009-04-21  
查询缓存好象很多问题,我用hibernate的查询缓存,会把数据库搞死。~

相关推荐

    Grails1.1中文文档.rar

    通过阅读《Grails1.1中文文档.chm》和解压后的《Grails.rar》文件,你可以获得详细的框架指南、API文档和示例代码,从而加速学习进程。对于初学者来说,这份文档将是你理解Grails 1.1及其开发流程的重要参考资料。

    Grails1.1中文文档

    Grails1.1中文文档

    grails1.1中文文档

    这份“Grails1.1中文文档”是专为初学者准备的指导材料,帮助他们更好地理解和掌握Grails框架。 1. **Groovy语言基础**:Grails 使用 Groovy 作为主要编程语言,Groovy 是一种简洁、面向对象的JVM语言,具有动态...

    Grails 1.1 Web Application Development

    ### Grails 1.1 Web Application Development #### 核心知识点概述 《Grails 1.1 Web Application Development》是一本专注于使用Grails框架进行高效Web应用开发的技术书籍。本书由作者Jon Dickinson撰写,旨在...

    Grails1.1中文文档(CHM)

    Grails1.1最新 中文 文档 当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat Yourself (DRY) 法则。 因此我们要以一种新的思维...

    Grails1.1中文文档.zip

    《Grails 1.1 中文文档》是一个针对Grails框架1.1版本的详尽指南,旨在帮助中文用户理解并掌握这一强大的Groovy构建的Web应用开发平台。Grails是一个基于Groovy语言的开源框架,它采用了模型-视图-控制器(MVC)架构...

    Grails 1.1 中文手册 chm

    Grails 最新的 v1.1版的中文文档,chm格式,Grails是一套快速开发Web应用的开源框架,基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,能为大家带来超高效率的一站式框架。

    Grails 1.1 的动态编码方案(Dynamic Encoding Methods)

    本文将深入探讨Grails 1.1版本中的动态编码方案,这是该框架提供的一种强大且灵活的特性,使得开发者能够在运行时动态地创建和修改代码。 动态编码方法在Grails中主要体现在两个方面:GSP(Groovy Server Pages)和...

    Grails1.1中文文档-----2009.3.25

    Grails1.1中文文档-----2009.3.25

    grails framework 1.1 中文

    grails framework 1.1 中文

    grails-1.2.2.zip

    在实际开发中,解压"grails-1.2.2.zip"后,你会得到一个完整的Grails 1.2.2发行版,包括运行环境、源码、文档等。你可以根据需求创建项目,利用框架提供的命令行工具快速生成基础结构,然后通过编写Groovy代码实现...

    Grails Grails Grails

    《Grails1.1中文文档》是Grails 1.1版本的官方中文指南,包含了框架的详细介绍、安装指南、基本概念、MVC模式的应用、GORM的使用、服务层、控制器、视图、国际化、测试等方面的内容。通过阅读这份文档,开发者可以...

    grails-bin-1.1

    标题"grails-bin-1.1"指的是Grails框架的1.1版本的二进制发行版。这个版本的Grails是一个免安装版,意味着用户可以直接将它解压到任何位置,而不需要通过传统的安装程序进行安装。 描述中的"本文件只需要放到相应...

    Grails Quick Reference 1.1

    ### Grails 快速参考指南 1.1:领域模型与数据验证 #### 领域类(Domain Class) 在Grails框架中,领域模型是应用程序的核心组件之一,用于表示数据库中的实体。Grails通过使用GORM(Groovy on Rails ORM)提供了...

    grails 开发文档 合辑

    Apress.Beginning.Groovy.and.Grails.From.Novice.to.Professional.Jun.2008 grails_programming Grails1.1中文文档-----2009.3.25 Grails入门指南(第二版) Groovy经典入门 Programming Groovy 2 合集,超实惠哦

Global site tag (gtag.js) - Google Analytics