阅读更多

26顶
1踩

编程语言

原创新闻 Grails 1.1 Beta 2发布

2008-12-26 09:48 by 见习记者 shiren1118 评论(13) 有8468人浏览
 

<!----><!----><!----> <!---->

Grails 1.1 Beta 2发布

 

 

 

SpringSource Grails 开发小组非常高兴的宣布Grails web application 开发框架的 1.1 beta 2 版本发布了.

Grails 是一个构建在JavaGroovy 之上的动态web application framework ,利用Java EE 领域的最好的breed APIs 包括Spring, Hibernate SiteMesh 。允许Java developers 利用他们使用多年的已有知识和被证实配置复杂的经历, GrailsJava and Groovy 开发者带来了基于约定快速开发的乐趣。

关于此次发布的更多信息,请访问下面的链接:

下面介绍一下1.1 版本的新特性.

新特性

GORM

更好的GORM 事件 (Better GORM events

之前, GORM 只支持 beforeInsert, beforeUpdatebeforeDelete 事件, 现增加了afterInsert, afterUpdateafterDelete 来完成图片操作

Persistence of Collections of Basic Types 基本类型集的持久化

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

class Person {

   static hasMany = [nicknames:String]

} 

对象的只读访问Read-Only Access to Objects

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

def book = Book.read(1)


默认的排列顺序Default Sort Order

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

 

class Book {

  String title

  static mapping = {

     sort "title"

  }

}

或在关联级别上:

class Author {

    static hasMany = [books:Book]

    static mapping = {

              books sort:"title"

    }

}

批处理Batch Fetching

现在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 的改进Improvements to Dynamic 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-manys 遗留映射Legacy Mapping for Unidirectional

单项的One-to-manys 关联关系可以使用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']

  }

}

增强枚举类型的支持Enhanced Enum Support

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

enum Country {

   AUSTRIA('at'),

   UNITED_STATES('us'),

   GERMANY('de');

   final String id

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

}

插件

全局插件Global Plugins

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

grails install-plugin webtest -global

多插件仓库Multiple Plugin Repositories

现在,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"

The Grails plugin discovery commands like list-plugin and install-plugin will then automatically work against all configured repositories. To release a plugin to a specific repository you can use the repository argument:

grails release-plugin -repository=myRepository

自动安装插件方案 Automatic Transitive Plugin Resolution

插件不再需要到SVN 检出,当应用程序第一次加载时,通过插件元数据会自动安装。

另外, plugin dependencies are now resolved transitively.

插件的作用范围和环境       Plugin Scopes and Environments

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

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

def scopes = [excludes:'war']

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

测试

测试框架The Test Framework

现在,作为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

    }

}

数据绑定

属性子集的数据绑定Data Binding a Subset of Properties

It is now simpler to bind data to a subset of properties. Previously you could use the syntax:

person.properties = params

Which would bind all the incoming request parameters to the person. If you didn't want that behavior you could use the bindData method. Now you can bind to a subset of properties using the subscript operator:

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

And access a subset of the domain classes properties using the same syntax:

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

集合类型的数据绑定Data Binding for Collection Types

Grails now supports data binding to collections types including lists, sets and 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 will auto-instantiate domain instances at the given indices and the necessary values will be populated in the association.

脚手架

模板和动态脚手架Templates and Dynamic Scaffolding

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

支持更多关联类型Support for more association types

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

<!----><!----> <!---->

Groovy Server Pages

JSP 中支持JSP 标签库 JSP Tag library support in 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")}

工程基本结构(Project Infrastructure

Maven 集成        Maven integration

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

mvn grails:create-pom

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

环境及元数据API     Environment and Metadata 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 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 全部文档。

灵活的构建配置   Flexible Build Configuration

新的 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"

非交互模式          Non-interactive mode

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

grails run-app --non-interactive

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

加密数据源          Encrypted Data Sources

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

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 版本不推荐使用,尽管它仍然起作用并在控制台产生信息。

 

 

26
1
评论 共 13 条 请登录后发表评论
13 楼 山风小子 2009-01-02 13:03
shiren1118 写道

关注的人不够多啊~~~

呵呵~因为目前处于Beta阶段,可以理解 ;)
12 楼 shiren1118 2008-12-29 17:46
关注的人不够多啊~~~
11 楼 shiren1118 2008-12-27 18:45
gorm ,gsp ,都独立出来就爽死了
10 楼 tongyi121 2008-12-27 15:11
多时候更改controller和domain不能反映更新,需要重启,但凡有点血性的人都受不了这种龟爬
jamesqiu 写道

tongyi121 写道
wenson 写道一些似乎没什么值得惊喜的更新而已,而且Grails最近更新的也超慢你能说出Grails的缺点吗?grails 启动一次20多秒,很多时候更改controller和domain不能反映更新,需要重启,但凡有点血性的人都受不了这种龟爬速度.

我开发到现在位置没试过这么慢的速度,而且凡是修改controller都是不用重新启动的,而domain的修改本来就不应该在启动后修改。这些问题在java中存在并且更严重,我觉得java能接受的人对grails的启动速度通常不会有问题。还有你用过1.1的没,1.1在启动速度上有了很大的改进。
9 楼 jamesqiu 2008-12-27 00:45
tongyi121 写道

wenson 写道
一些似乎没什么值得惊喜的更新而已,而且Grails最近更新的也超慢

你能说出Grails的缺点吗?



grails 启动一次20多秒,很多时候更改controller和domain不能反映更新,需要重启,但凡有点血性的人都受不了这种龟爬速度.
8 楼 tongyi121 2008-12-26 22:49
wenson 写道

一些似乎没什么值得惊喜的更新而已,而且Grails最近更新的也超慢

你能说出Grails的缺点吗?
7 楼 令狐虫 2008-12-26 22:08
好消息
祝愿Grails越走越好
6 楼 herowzz 2008-12-26 15:32
看来值得一试了...
5 楼 Craft 2008-12-26 12:34
还不能和idea8很好的集成。
4 楼 wenson 2008-12-26 10:38
一些似乎没什么值得惊喜的更新而已,而且Grails最近更新的也超慢
3 楼 dishhy 2008-12-26 10:18
不错,继续关注
2 楼 rockjava 2008-12-26 10:05
Grails插件机制非常好。
1 楼 phoenixup 2008-12-26 09:56
虽然Grails已经很优秀~~~但Groovy本身要走的路还很长~~~

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 学习dll编程的小例子

    http://blog.csdn.net/jiayou8809/article/details/16982465 dll学习的小例子

  • 准备工作 第一篇:如何加载dll

    启动autocad2007 ,在命令行输入:netload ,在弹出窗体内输入dll文件路经。如何当启动时自动加载所写的dll呢。方法一:写一个lsp文件内容如下:(COMMAND "NETLOAD"  "F://C#//autocad二次开发//练习//AcdNextool//AcdNextool//bin//Debug//AcdNextool.dll")(Command "Showpalette")第一句表示让autocad加载指定的dll,第二句表示执行名为"showpalette"的命令。如果此dl

  • 使用功能类CDynLinkLibrary加载多个动态库时报错问题

    在网上看到一条解答,原文如下:最近Perry在写一个简单的插件系统框架,需要有n多动态链接库加载来加载去的。调试时偶然发现提示在dllmodul.cpp中会报告若干个跟CDynLinkLibrary相关的内存泄漏。错误信息具体看起来大概是这个样子:Detectedmemoryleaks!Dumpingobjects-&gt;...\atlmfc...

  • windows:加载dll时的DLLMain介绍

    在实际开发中,通常情况下,系统自带的初始化和清理机制(如全局变量初始化和析构、自动内存管理等)已经足够。然而,有些特定场景下,需要开发者自己在DllMain中处理和。以下是一些可能的情况:线程本地存储(TLS)当需要在每个线程中维护独立的数据(如线程本地存储),必须手动进行线程初始化和清理。例如,多线程日志记录、线程特定的配置等。示例:每个线程都有独立的日志文件句柄或配置对象。资源管理当需要在DLL加载时分配全局资源(如文件句柄、网络连接)并在卸载时释放这些资源时,必须手动进行初始化和清理。示例。

  • Dynamic-link library

    动态链接库基本概念Dynamic-link library (or DLL) is Microsoft’s implementation of the shared library concept in the Microsoft Windows and OS/2 operating systems. These libraries usually have the file extension D

  • C++动态链接库(DLL)的创建和调用(VS2019)

    动态链接库(Dynamic Link Library,DLL)是一个包含可由多个程序同时使用的代码和数据的库。通俗来讲,它就是一个仓库,提供一些可以直接拿来用的变量、函数或者类。

  • DLL(Dynamic Link Libraries)专题

    [ 原创文档 本文适合初级读者 已阅读13080次 ] DLL(Dynamic Link Libraries)专题 作者:姜山 原文出处:http://www.microsoft.com

  • VS2017的动态链接库(Dynamic Link Library)配置

    前言:和静态链接库不同的是,静态链接库是在程序编译的时候就需要的,而动态链接库是在程序执行的时候才需要,在VS2017这样的集成开发环境之下,动态链接库的配置方式有很多,很多文章只说了其中一些,本文针对此种情况做一个简单的汇总。 一、直接拷贝法 将需要的动态链接库直接拷贝到和可执行程序的同目录之下,这是最常见,最通用的方法了。 二、拷贝到两个特殊的目录 32位的 x86的动态链接库 ...

  • Windows系统中的DLL文件详解

    随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的“动态链接库”,DLL是Dynamic Link Library(即“动态链接库”)的缩写。从Microsoft公司推出首个版本的Windows以来,动态链接库就一直是这个操作系统的基础。.dll文件是Dynamic Link Library(动态链接库)文件的缩写,它是一种共享库文件,包含了程序所需的代码和数据。与静态链接库不同,动态链接库可以在程序运行时动态加载,使得程序的内存占用更小,同时也方便了程序的更新和维护

  • DLL(Dynamic Link Library)

    DLL文件反编译,如何打开DLL文件 https://jingyan.baidu.com/article/48b558e3ff86667f38c09ab4.html  

  • 命令行调用各程序(Window系统)

    Window系统的命令行调用各程序控制面板类应用程序类 命令行界面中,直接输入下列的命令,可以打开各种应用。(Win10实测有效) 控制面板类 控制面板\所有控制面板项\ control 控制面板\所有控制面板项\XXXX #设备和打印机 control.exe /name Microsoft.AddHardware #管理工具 control.exe /name Micr...

  • dll学习(一):dll简介

    什么是 DLL? DLL 是一个包含可由多个程序同时使用的代码和数据的库。 例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。 因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。 这有助于促进代码重用和内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。 例如,一个计帐程序可以按模块来销售。 可以在运行时将各...

  • zz DLL 编写教程

    DLL的优点 简单的说,dll有以下几个优点: 1) 节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,像dll中的全局变量这种东西是会被每个进程复制一份的)。 2) 不需编译的软件系统升级,若一个软件系统使用了dll,则该

  • DLL(基础)

    文章目录0x01 DLL简介0x02 DLL 调用0x03 与 lib 文件区别0x04 DLL 编写 0x01 DLL简介 ​ 动态链接库(Dynamic-Link-Library,缩写dll), 是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名是 .DLL、.OCX(包含 ActiveX 控制的库)或者 .DRV(旧式的系统的驱动程序)。 ​ 其中的动态链接是指,将一部分常常会共享的代码(静态链接的 OBJ 程序库)制作成 DLL 档,当可执行文件调用到 DLL 档

Global site tag (gtag.js) - Google Analytics