阅读更多

39顶
2踩

编程语言

原创新闻 Grails 1.1 正式版发布

2009-03-11 08:34 by 正式记者 agile_boy 评论(28) 有17566人浏览
  在比较漫长的期待之后(期间经历了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 has a number of changes, but should be mostly backwards compatible with 1.0.x series applications. If you have issues please report them. The following is a list of known issues that need to be considered when upgrading

    * Plugins are now stored in your USER_HOME directory. You will need to re-install your plugins or run:

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

    * Enums are now mapped onto the database with String values instead of ordinals by default
    * jsession id is now disabled by default. See GRAILS-3364
    * GSP whitespace handling has been changed for the better, you may have more whitespace than before. See GRAILS-3277
    * The The grails.testing.reports.destDir config option has been replaced by grails.project.test.reports.dir
    * PreInit.groovy is now BuildConfig.groovy
    * The allowedMethods property in a controller should now be marked static. Non static version is deprecated but still works and will result in messages on the console.

39
2
评论 共 28 条 请登录后发表评论
28 楼 maming2000 2009-03-12 23:59
部分plugin不兼容也是正常的,很多plugin明确说明了支持到1.04。
1.1的控制器里生成了DataIntegrityViolationException处理,但总是处理不过去
i18n还好都tmd是我手写的,听楼上有人说插件有问题,还好没用
rest传入控制器的时候是没啥问题,传出到视图的时候又都变成问号参数了,不过也不太要紧
生成的标题连接太麻烦,应该学学seam都生成到模板页标题栏里,不过这个能自定义,也就不算它是问题了
更期待java把它拿来主义,从本质上支持这些特性而不是依靠外部扩展。
27 楼 Arden 2009-03-12 13:55
biaoming 写道

没提到Controller分包问题吗?现在开发Controller多了,就不好管理,必须用urlmapping,很不方便。

分包是可以的,只是分包后这个URL的映射比较麻烦。假设我有:
com.tujiao.mobile.controller.HomeController
com.tujiao.sns.controller.HomeController
这两个控制器,那么在Grails里就不知道怎么映射了,都会把我映射成/home这很头痛~~
26 楼 springhill 2009-03-12 09:23
嗯,这才叫新闻,言之有物呀
25 楼 biaoming 2009-03-11 22:24
没提到Controller分包问题吗?现在开发Controller多了,就不好管理,必须用urlmapping,很不方便。
24 楼 allenny 2009-03-11 21:48
fuwang 写道

用了Grails后,开发省力了一点点,工期却缩短了一半。程序员摆脱不了被当作民工来使用的命。

不要告诉领导,偷偷的用,然后说用的是SSH
23 楼 tongyi121 2009-03-11 20:29
当然用过,没用过睡会瞎说呀,beta版出问题那是很正常的事情,再说多数据源的问题,本来Grails也没说支持呀,我只知道有插件支持。
22 楼 Craft 2009-03-11 20:06
corbe 写道

太期待了,grails 1.1 终于发布。性能和稳定新都有提高,以及netbeans6.7 IDE对GRAILS更好的支持。我们公司已经决定在项目中使用gails/groovy.同时期待grails 1.2的发布。

大家不要动不动就性能提高稳定提高,你们到底用过和评测过没有?!
据我目前的使用情况,1.1和很多插件都出现了不兼容,导致一些必要的功能无法快速实现,得自行集成其他框架进去。另外1.1的发布太快,beta3发布还没几天,RC1就来了,同时带来了严重的资源文件国际化错误问题,没两天就跟上RC2来解决这些严重bug。RC2才用几天,这正式版就出了。发布太快,太多潜在问题了。
另外一个非常重要的功能,配置多数据源以及对多数据源的GROM目前没法实现,规划在了1.2中。如果系统需要同时操作几个数据库,目前的版本不支持,所以对于正式项目的技术选择慎重点。
21 楼 fuwang 2009-03-11 19:44
用了Grails后,开发省力了一点点,工期却缩短了一半。
程序员摆脱不了被当作民工来使用的命。
20 楼 tongyi121 2009-03-11 18:21
Arden 写道

那公主在哪啊?

Grails刚被收养,房子都买不起,哪里的公主。
19 楼 Arden 2009-03-11 18:04
corbe 写道

太期待了,grails 1.1 终于发布。性能和稳定新都有提高,以及netbeans6.7 IDE对GRAILS更好的支持。我们公司已经决定在项目中使用gails/groovy.同时期待grails 1.2的发布。

netbeans 6.7对grails的支持还是不行,idea 8.1目前是最好的grails开发工具。
18 楼 corbe 2009-03-11 17:55
太期待了,grails 1.1 终于发布。性能和稳定新都有提高,以及netbeans6.7 IDE对GRAILS更好的支持。我们公司已经决定在项目中使用gails/groovy.

同时期待grails 1.2的发布。
17 楼 Arden 2009-03-11 17:07
tongyi121 写道

很强大,新版无论是在可用性和性能上都有了很大的进去,希望各个插件能够尽快赶上。我想Grials1.1的发布是预示着“王子归来”的时刻到了。

那公主在哪啊?
16 楼 phlsbg 2009-03-11 16:19
Grails新手。我想知道对原生sql支持的怎么样?
15 楼 chenlb 2009-03-11 15:54
DSL 取代 xml 配置强大
14 楼 SSailYang 2009-03-11 14:31
试用了 Grails 1.1 的新特性,感觉很不错
13 楼 hongkong 2009-03-11 14:31
mshijie 写道

sword721 写道ruby on rails可以进入博物馆了非java社区的为什么要选择grail?

这是为什么捏
12 楼 mshijie 2009-03-11 14:28
sword721 写道

ruby on rails可以进入博物馆了

非java社区的为什么要选择grail?
11 楼 天机老人 2009-03-11 14:15
哈哈Grails 快点快点……
让我们开发更省力一点……
10 楼 lggege 2009-03-11 12:08
插件, 插件, 终于有全局插件了. 

原来烦躁死了, 居然一个项目下载一次插件.
9 楼 agile_boy 2009-03-11 11:26
呵呵,正在做从1.0.4到1.1的升级。

发表评论

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

相关推荐

  • VC++实现系统托盘功能(附源码)

    VC++开发常用功能一系列文章(欢迎订阅,持续更新...) Windows桌面的系统托盘位于任务栏的右侧,即Windows桌面的右下方,它常用来显示一些系统的状态。如系统时间,音量控制以及其他的一些图标。 常常能见到一些优秀的软件在运行后会将其应用程序图标加入到系统托盘中,如金山词霸。如果能将自己编写的应用程序的图样也加入到系统托盘中,将会使程序显得很有专业水准。 如下图: 这些应用都是应用程序的托盘功能: 其实这个功能要实现比较简单,把图准备好,主要用到 Shell_N...

  • EXCEL最小化到系统托盘(XLA)

    EXCEL最小化到系统托盘之可加载宏,VBA代码

  • win10开启最小化托盘/系统托盘

    通过设置&gt;&gt;个性化&gt;&gt;任务栏&gt;&gt;“选择哪些图标显示在任务栏上”,查看下图中的设置是否是关闭状态: 不是的话,设为关闭状态

  • VC托盘程序的简单实现

    以下是网上看到的一个实现VC托盘的程序,好像只适用于对话框程序。经本人简单整理。 一、托盘简介      所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起,但又不希望占据任务栏的时候,就可以把程序放到托盘区。其实,托盘区的编程很简单,下面简要阐述一下子喽^_^  二、托盘编程相关函数      其实呢,把

  • C++ 隐藏系统托盘图标(支持XP-Win10)

    #include "stdafx.h" #include #include #include BOOL IsWow64() { BOOL bIsWow64 = FALSE; //IsWow64Process is not available on all supported versions of Windows. //Use GetModuleHandle to get a han

  • GRAILS 1.1 Datasources 多数据源支持

    grails版本为1.1正式版 数据库是oracle JDBC驱动是ojdbc.jar 附件1:GRAILS1.1_多数据源.rar 是PPT教程 附件2:grails_datasources-0.3.zip 是插件的安装程序 附件3:mds.rar 是测试项目代码...

  • grails 1.1 Gorm 部分新特性提前知道

    具:nabble forum 消息:grails 1.1beta1 将会在 11月下旬发布,beta2版本计划 12月底,rc正式版本要到 2009-1月份   1)支持 hibernate 的dynaimc-update 就是只对修改过的数据进行更新,通过下面方法 static ma.....

  • grails安装部署_Grails 配置

    由于Grails提供了默认设置,你确实可以在不做任何配置的情况下进行开发和应用。Grails也内嵌了一个Web容器和一个称为HSQLDB的内存数据库,这意味着你甚至都不用安装数据库了。不过,在将来某些情况下你还是会想要...

  • Griffon 1.1 发布,Groovy 开发框架

    Griffon开发团队今天发布了Griffon 1.1.0正式版本。 Griffon 是Swing开发者的一个Groovy框架。Griffon期望提供一个稳定代码结构给Swing应用,就像Grails给web开发带来的优势一样。同 时,Griffon也可能提供一个替代...

  • VB.net怎么最小化到系统托盘

    小孩放假了,天天在电脑上看动画片,时间有点长,对小孩视力和身体都不好,准备自己写个有个性的保护程序,就是固定时间直接播放声音,并锁定屏幕一定间隔,过后程序自动最小化到托盘。现在遇到问题,不知道vb.net程序怎么最小化到系统托盘,百度到一篇资料CP过来参考。新浪微博对代码支持不好,排序有问题,可以直接查阅:http://oteman.blog.sohu.com/47614796.html 所谓静态

  • c++实现系统托盘图标

     自从微软公司推出Windows 95操作系统以来,系统托盘应用作为一种极具吸引力的用户界面设计深受广大用户的喜爱。使用系统托盘作为用户界面的Windows应用程序数不胜数,比如"金山词霸"、"Winamp"、"RealPlayer"等等。这些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,程序开发人员有时也需要编制一些仅在后台运行的类

  • 利用Visual C++实现系统托盘程序

    自从微软公司推出Windows 95操作系统以来,系统托盘应用作为一种极具吸引力的用户界面设计深受广大用户的喜爱。使用系统托盘作为用户界面的Windows应用程序数不胜数,比如"金山词霸"、"Winamp"、"RealPlayer"等等。这些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,程序开发人员有时也需要编制一些仅在后台运行的类似程序

  • VC++任务栏托盘图标及右键菜单实现

    Windows 95以及后来的Windows版本允许你将程序图标放入系统托盘。所谓系统托盘,通常指的是屏幕右下方显示时间,音量等图标的那个区域。托盘图标通常可以执行一些快捷操作,如窗口隐藏时通常最小化到托盘区域,用户可以单击鼠标左键显示程序窗口界面,右键单击托盘图标通常会弹出快捷菜单进行一些快捷操作。       在MFC中访问托盘图标是通过Shell_NotifyIcon函数和NOTIFY

  • 精通 Grails: 创建自定义插件

    某人提交一个长 URL 请求缩短后,它将针对后续请求在后台将其存储为一个正式的缩短 URL。例如,访问该站点,输入 http://www.grails.org/The+Plug-in+Developers+Guide ,然后单击 Make TinyURL! 按钮。...

  • amqp 1.0协议_Spring AMQP和IronRuby 1.1的第一个里程碑发布

    IronRuby 1.1现已发布。 IronRuby是.NET和Silverlight的Ruby编程语言的开源实现。 此版本增加了对IronRuby中.NET扩展方法的支持,并且现已获得Apache许可(版本2)的许可,而不是Microsoft公共许可。 还有一个...

  • InfoQ中文站正式发布1.5版

    从2007年3月28日InfoQ中文站预启动测试版上线,到今天也走过了一段艰辛而骄傲的路程。和InfoQ.com网站一样,InfoQ中文站的使命是成为国内关注企业软件开发领域变化和创新的源泉之地,向中文读者提供有深度的内容,...

  • 精通 Grails: RESTful Grails

    精通 Grails: RESTful Grails构建一个面向资源的架构文档选项打印本页将此页作为电子邮件发送英文原文级别:

  • GRAILS ID GENERATOR 可以自己设置ID字段的值

    [b]这个bug已经在1.1正式版本修复,可以用insert:true来指定是新建对象。[/b] 必须在mapping里面指定: id generator:'assigned', params:[type:'Integer'] 不然会提示,没有找到此ID的对象。 有个问题...

Global site tag (gtag.js) - Google Analytics