<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    shinewang

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      53 隨筆 :: 0 文章 :: 200 評(píng)論 :: 0 Trackbacks

    Grails 1.1 Beta 2發(fā)布了,Groovy 1.6 finalGrails 1.1 final也越來越近,不過已經(jīng)不是很感興趣了。雖然對(duì)于Java開發(fā)者來說,相比RailsGrails更容易上手,但它并不成熟的。在論證 Grails的成熟度時(shí),Graema說:你會(huì)把SpringHibernate看作風(fēng)險(xiǎn)嗎?” SpringHibernate確實(shí)不是風(fēng)險(xiǎn),但Grails對(duì)SpringHibernate的包裝卻是一個(gè)極大風(fēng)險(xiǎn),在種種危險(xiǎn)中,最主要的一點(diǎn)是我們已經(jīng)對(duì)底層框架的抽象太成功了,以至于有時(shí)會(huì)出現(xiàn)問題。具體可以看看這個(gè)例子。使用Grails,不如使用JRuby On Rails或者Play!

    ?

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

    ?

    GORM

    更好的GORM事件

    之前, GORM 只支持 beforeInsert, beforeUpdate beforeDelete 事件, 現(xiàn)增加了afterInsert, afterUpdate afterDelete 來完成圖片操作

    ?

    基本類型集的持久化

    GORM 現(xiàn)在支持基本類型比如String, Integer 等使用一個(gè)連接表的持久化。

    class ?Person?{?? ?

    static ?hasMany?=?[nicknames:String]?

    }??

    ?

    class Person {

    ?

    ?? static hasMany = [nicknames:String]

    ?

    }

    ?

    對(duì)象的只讀訪問

    現(xiàn)在,持久化實(shí)例對(duì)象可以使用read 方法以只讀狀態(tài)被加載:

    def book = Book.read(1)

    ???????????????????????

    默認(rèn)的排列順序

    現(xiàn)在,關(guān)聯(lián)可以使用一個(gè)類級(jí)別聲明的默認(rèn)的排列順序來排序:

    class Book {

    ? String title

    ? static mapping = {

    ???? sort "title"

    ? }

    }

    或在關(guān)聯(lián)級(jí)別上:

    class Author {

    ??? static hasMany = [books:Book]

    ??? static mapping = {

    ????????????? books sort:"title"

    ??? }

    }

    ?

    批處理

    現(xiàn)在GORM 支持使用ORM DSL 在類級(jí)別上配置批處理batch fetching ( 延遲加載的優(yōu)化):

    class Book {

    ? String title

    ? static mapping = {

    ???? batchSize 15

    ? }

    }

    或在關(guān)聯(lián)級(jí)別上:

    class Author {

    ??? static hasMany = [books:Book]

    ??? static mapping = {

    ????????????? books batchSize:15

    ??? }

    }

    ?

    動(dòng)態(tài)Finders的改進(jìn)

    動(dòng)態(tài)查詢器的新后綴InList 可用:

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

    現(xiàn)在,Dynamic finders 也能查詢緩存:

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

    可以使用悲觀鎖:

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

    ?

    單項(xiàng)的One-to-many遺留映射

    單項(xiàng)的One-to-many關(guān)聯(lián)關(guān)系可以使用joinTable 參數(shù)改變它們對(duì)底層數(shù)據(jù)庫(kù)的映射:

    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']

    ? }

    }

    ?

    增強(qiáng)枚舉類型的支持

    現(xiàn)在,枚舉類型使用GORM 調(diào)用的getId ()方法來持久化枚舉狀態(tài)。

    enum Country {

    ?? AUSTRIA('at'),

    ?? UNITED_STATES('us'),

    ?? GERMANY('de');

    ?? final String id

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

    }

    ?

    插件

    全局插件

    現(xiàn)在,安裝插件可以給所有的應(yīng)用程序共享:

    grails install-plugin webtest -global

    ?

    多插件倉(cāng)庫(kù)

    現(xiàn)在,Grails 支持通過提供多插件倉(cāng)庫(kù)配置的能力

    使用USER_HOME/.grails/settings.groovy 文件或包含配置好的倉(cāng)庫(kù)詳情的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會(huì)自動(dòng)使用所有設(shè)置的插件倉(cāng)庫(kù),發(fā)布一個(gè)插件到一個(gè)插件倉(cāng)庫(kù)可以是用下面的命令:

    grails release-plugin -repository=myRepository

    ?

    自動(dòng)安裝插件方案

    插件不再需要到SVN 檢出,當(dāng)應(yīng)用程序第一次加載時(shí),通過插件元數(shù)據(jù)會(huì)自動(dòng)安裝。另外,插件的依賴關(guān)系問題已經(jīng)解決了。

    ?

    插件的作用范圍和環(huán)境

    現(xiàn)在,插件可以作用于環(huán)境或預(yù)置的構(gòu)建范圍內(nèi):

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

    def scopes = [excludes:'war']

    僅在那些環(huán)境中加載使用,而不打包到WAR 文件中。這使得產(chǎn)品使用時(shí) "development-only" 的插件不會(huì)被打包

    ?

    測(cè)試

    測(cè)試框架

    現(xiàn)在,作為1.0.x 系列可用插件的新測(cè)試框架已集成到 Grails 1.1.

    該測(cè)試框架增加了模擬所以普通類型包擴(kuò)控制器,領(lǐng)域類,標(biāo)簽庫(kù)和url 映射簡(jiǎn)寫的行為,快速運(yùn)行單元測(cè)試。

    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

    ??? }

    }

    ?

    數(shù)據(jù)綁定

    屬性子集的數(shù)據(jù)綁定

    現(xiàn)在更容易對(duì)屬性的自己和進(jìn)行數(shù)據(jù)綁定。在之前的版本中你也許會(huì)使用:

    person.properties?=?params??

    ?

    這將會(huì)將request中的所有變量綁定到person中。如果你不想綁定所有的數(shù)據(jù)的話,你可以使用 bindData 方法。現(xiàn)在你可以通過使用subscript operator來綁定部分的變量:

    ?

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

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

    ?

    要取得domain中的所有屬性的一個(gè)子集也可以通過這樣的方式:

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

    ?

    集合類型的數(shù)據(jù)綁定

    Grails已經(jīng)支持集合類型的數(shù)據(jù)綁定,例如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" />

    ?

    腳手架

    模板和動(dòng)態(tài)腳手架

    現(xiàn)在,動(dòng)態(tài)腳手架使用通過install-templates 命令安裝的模板

    ?

    支持更多關(guān)聯(lián)類型

    現(xiàn)在,Scaffolding 支持 many-to-many 和單項(xiàng)的 one-to-many 關(guān)聯(lián)。



    Groovy Server Pages

    JSP中支持JSP標(biāo)簽庫(kù)

    現(xiàn)在,GSP 已經(jīng)支持JSP 標(biāo)簽庫(kù)復(fù)用的能力:

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

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

    JSP 標(biāo)簽也可以像正常的GSP 標(biāo)簽一樣調(diào)用:

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

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

    ?

    工程基本結(jié)構(gòu)

    Maven 集成?

    Grails 1.1 緣自和 Maven plugin archetype 的關(guān)聯(lián),允許你使用Maven 更容易的構(gòu)建Grails 工程。根據(jù)操作指南here或使用原型來創(chuàng)建一個(gè)新的Grails 工程, 或運(yùn)行:

    mvn grails:create-pom

    來為已有工程創(chuàng)建一個(gè)Maven POM.

    ?

    環(huán)境及元數(shù)據(jù)API??

    使用新 API 來訪問當(dāng)前環(huán)境:

    import grails.util.Environment

    ...

    switch(Environment.current) {

    ??????? case Environment.DEVELOPMENT:

    ??????? ?? configureForDevelopment()

    ??????? break

    ??????? case Environment.PRODUCTION:

    ??????? ?? configureForProduction()

    ??????? break

    }

    當(dāng)然也有一個(gè)易于訪問應(yīng)用程序元數(shù)據(jù)的新類:

    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 全部文檔。

    ?

    靈活的構(gòu)建配置

    新的 grails-app/conf/BuildConfig.groovy 文件可用,它允許你配置不同層面的Grails 構(gòu)建輸出路徑和服務(wù)器使用插件的解決方案:

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

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

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

    ?

    非交互模式?

    現(xiàn)在,Grails 支持一種--non-interactive flag ,須鍵入到命令行,目的是關(guān)閉用戶提示:

    grails run-app --non-interactive

    這對(duì)服務(wù)器持續(xù)集成是有幫助的。

    ?

    加密數(shù)據(jù)源?

    現(xiàn)在,數(shù)據(jù)源密碼可以使用已提供的編碼類來加密:

    dataSource {

    ?????? username = "foo"

    ?????? password = "438uodf9s872398783r"

    ?????? passwordEncryptionCodec="my.company.encryption.BlowfishCodec"

    }

    支持的編碼使用 Grails' 現(xiàn)存的編碼機(jī)制。

    ?

    升級(jí)備注

    Grails 1.1 有很多改變,但大多是向后兼容1.0.x 系列的。如果有問題請(qǐng)報(bào)告。升級(jí)時(shí),以下是已知需要注意的問題列表:

    Plugins 不保存在你的 USER_HOME 路徑下. 你需要重寫安裝插件或運(yùn)行:

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

    現(xiàn)在枚舉類型已經(jīng)被映射到數(shù)據(jù)庫(kù),使用字符串值而不是原始默認(rèn)的。

    jsession id 默認(rèn)已無效. 詳見GRAILS-3364

    GSP 空白符處理已經(jīng)變好很多了,比以前有更多空白符. 詳見GRAILS-3277

    grails.testing.reports.destDir 配置選項(xiàng)已被替代為grails.project.test.reports.dir

    現(xiàn)在,PreInit.groovy 改為BuildConfig.groovy

    控制器中的allowedMethod 屬性被標(biāo)識(shí)為static 。非 static 版本不推薦使用,盡管它仍然起作用并在控制臺(tái)產(chǎn)生信息。

    ?

    Grails1.0這篇文章也可以作為參考。


    posted on 2008-12-26 16:47 shinewang 閱讀(1821) 評(píng)論(4)  編輯  收藏 所屬分類: Groovy & Grails

    評(píng)論

    # re: Grails 1.1 Beta 2發(fā)布 2008-12-26 19:33 山風(fēng)小子
    任何事物都有兩面性 :)  回復(fù)  更多評(píng)論
      

    # re: Grails 1.1 Beta 2發(fā)布[未登錄] 2008-12-26 22:32 daniel
    在風(fēng)險(xiǎn)上,play!< spring+hibernate+groovy ??  回復(fù)  更多評(píng)論
      

    # re: Grails 1.1 Beta 2發(fā)布 2008-12-26 23:01 shinewang
    @daniel
    很難說play!和grails究竟哪個(gè)風(fēng)險(xiǎn)高。play!雖然還不成熟,但核心代碼很少,幾百K的Java代碼很容易搞清楚和自己擴(kuò)展。play!的風(fēng)險(xiǎn)主要是它不是建立在spring+hibernate的基礎(chǔ)上,也不能或者說不方便部署在tomcat這類常見的Java服務(wù)器上。而grails的風(fēng)險(xiǎn)其實(shí)也是不成熟產(chǎn)生的,一方面我們都知道封裝帶來易用性的同時(shí)也要付出靈活性的代價(jià),另一方面grails對(duì)spring+hibernate的包裝沒有到位,所以導(dǎo)致用spring+hibernate很容易做的,用grails反而難做了。如果play!能夠建立在spring+hibernate的基礎(chǔ)上就完美了。  回復(fù)  更多評(píng)論
      

    # re: Grails 1.1 Beta 2發(fā)布 2008-12-26 23:44 ci
    good.  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 免费大片在线观看网站| 色婷婷亚洲十月十月色天| 亚洲av午夜国产精品无码中文字| 国产一级淫片a免费播放口| AV在线播放日韩亚洲欧| 免费无码午夜福利片| 亚洲色偷偷狠狠综合网| 久久99久久成人免费播放| 亚洲一区二区三区在线网站| 在线观看亚洲精品专区| 无码国产亚洲日韩国精品视频一区二区三区 | 日韩色视频一区二区三区亚洲| 国产精品极品美女免费观看| 污污视频网站免费观看| 亚洲国产精品一区二区第一页| 亚洲成AV人片在线观看无码| 国内成人精品亚洲日本语音| 亚洲国产精品视频| 黄色片免费在线观看| 亚洲天堂一区二区三区| 鲁啊鲁在线视频免费播放| 尤物永久免费AV无码网站| 国产免费人成视频尤勿视频| 中国精品一级毛片免费播放| 亚洲Aⅴ无码一区二区二三区软件| 免费观看四虎精品成人| 久久亚洲AV无码精品色午夜麻| 18国产精品白浆在线观看免费 | 91视频免费网站| 久久精品国产亚洲av麻豆蜜芽| 国产免费黄色大片| 午夜免费啪视频在线观看| 久久亚洲国产精品123区| 91黑丝国产线观看免费| 免费人人潮人人爽一区二区| 无码久久精品国产亚洲Av影片| 毛片免费在线视频| 中文在线观看免费网站| 亚洲中文字幕无码爆乳app| 亚洲午夜久久久影院| 伊人亚洲综合青草青草久热|