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

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

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

    cAng^Er

    不懂我的人 , 離不了我 , 該了解了解我 !而懂我的人 , 更離不了我 , 因為他們愛我 。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 16 文章 :: 18 評論 :: 0 Trackbacks

    轉載:原文地址 http://dev2dev.bea.com.cn/techdoc/200601194089.html

    摘要

      Java Web應用程序框架是企業Java得以成功的重要原因之一。人們懷疑如果沒有Apache Struts框架Java EE是否能夠如此成功。雖然底層編程語言很重要,但通常是框架使編程語言成為引人注目的中心的。如果您經常訪問討論論壇,就會注意到Ruby語言和Ruby On Rails框架之間也是這種情況。Ruby已經出現十多年了,然而只是在Ruby On Rails框架流行之后,開發人員才開始注意到Ruby語言。

      諸如Ruby、PHP和Python之類的腳本語言最近幾年越來越流行,因此,需要開發一個Java腳本備選語言和類似Rails的針對Java環境的框架。Groovy就是這個腳本語言,而Grails就是這個框架。

      在本文中我將討論Groovy的Web開發功能,然后繼續討論Grails框架。我將開發一個示例Grails Web應用程序,并討論此框架的各種特性。

    Groovy是什么?

      Groovy是一種語言,其語法類似于Java,但比Java更簡單。它通常被視為腳本/靈活/動態的語言,但是我不喜歡這類形容詞,因為我認為它們只會令人困惑。如果說Java是一位明智的中年男子,那么Groovy就是他十幾歲的兒子。Groovy具有父親的許多特點,但是更為狂野且更為有趣。他們也可以很好地合作。

      Groovy的規則比Java少得多。例如,要在Java中獲得標準的"Hello World"輸出,您需要編寫一個類、一個具有合適參數的主方法,等等。但是在Groovy中,如果不想編寫所有樣板代碼,您可以拋開類定義和主方法,僅編寫一行代碼即可打印出"Hello World"。

      以下是打印Hello World的文件 Hello.groovy 的內容:

    println "Hello World" 

      Java平臺僅關心使字節碼得到執行。同樣,此平臺不強迫您使用Java語言。只要提供了字節碼,工作就會進行。Groovy代碼會被編譯為字節碼,而對于Java平臺來說,字節碼是從Java代碼還是Groovy代碼生成的并沒有任何區別。

      以下是一個Groovy例子,它顯示了Groovy對清單、映射和范圍的內置支持,并證明了Groovy的簡單性及其利用Java的強大功能的能力:

    // Print Date
    def mydate = new java.util.Date()
    println mydate
    //Iterate through a map
    def numbersMAP = ['1':'ONE', '2':'TWO']
    for (entry in numbersMAP) {
    println "${entry.key} = ${entry.value}"
    }
    //Introducing the range
    def range = 'a'..'d'
    //Lists
    def numberlist = [1, 2, 3, 4, 5, 6, 7, 8]
    println numberlist;
    println "Maximum value: ${numberlist.max()}"
    

      請注意以上代碼直接使用java.util.Date ,對收集的內置支持減少了使用清單、映射和范圍所需的代碼。還有許多其他有趣的Groovy特性,例如閉包和簡化的XML處理。您可以在groovy.codehaus.org上找到詳細清單。

      現在讓我們來討論如何將Groovy用于Web開發。

    使用Groovy進行Web開發

      大多數Java EE教程都從一個基本servlet例子開始。對于Groovy Web開發來說,您將從groovlet(在groovy中servlet的對應概念)開始。如果您在servlet中擺脫了類和doXX() 方法聲明,那么剩下的內容就與groovlet很像了。以下是一個名為 Login.groovy 的groovlet例子,您需要將它置于Web應用程序的最高級目錄:

    def username= request.getParameter("username")
    def password= request.getParameter("password")
    if (username == "java" && password == "developer") {
    response.sendRedirect("home.jsp")
    session = request.getSession(true);
    session.setAttribute("name", username)
    }
    else {
    println """
    <h1>Login Invalid</h1>
    <p>Your IP has been logged > ${request.remoteHost}</p>
    """
    paramMap = request.getParameterMap()
    println "<p>You Submitted:</p>"
    for (entry in paramMap) {
    println "${entry.key} = ${entry.value}<br/>"
    }
    }
    

      您可以僅創建一個簡單的HTML表單,然后將此表單的行為屬性發送到 action="Login.groovy"。然后將以下標簽添加到web.xml:

    <servlet>
    <servlet-name>Groovy</servlet-name>
    <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>Groovy</servlet-name>
    <url-pattern>*.groovy</url-pattern>
    </servlet-mapping>
    

      現在只需將要求的Groovy jar 文件添加到WEB-INF/lib 目錄,您的Groovy Web應用程序就準備好在任意Java EE應用服務器上運行了。

      您應該已經注意到代碼中沒有分號,而且使用了隱式變量如request和response。其他隱式變量有context、application、session、out、sout和 html。

      GSP是JSP在groovy中的對應概念。您無需使用println生成HTML;只需將Groovy代碼嵌入HTML頁面。本文中的例子將在提到Grails時使用GSP。

      請注意,因為所有代碼最終都要轉換為字節碼,所以groovlet和GSP能夠與servlet和JSP輕松協作。因此您無需區分groovlet和GSP或者servlet和JSP。

      現在讓我們討論前途無量的Grails框架。如果成功的話,Grails能夠極大地改變開發Java Web應用程序的方式。Ruby on Rails對Ruby的影響,Grails也能夠對Groovy實現。

    Grails特性和架構

      Grails試圖使用Ruby On Rails的“規約編程”(coding by convention)范例來降低對配置文件和其他樣板代碼的需求。使用“規約編程” ,如果文件的名稱本身就能說明此文件的用途,那么您就不需要在配置文件中再次聲明這些內容了。此框架會查看文件名,并自己弄清文件用途。通過使用“規約編程” ,Grails還將自動生成Web應用程序中需要的許多內容。通過使用Grails,您將能夠在很短的時間內、以最小的復雜性使Web應用程序就緒。請看以下例子。

      Grails基于開源技術,例如Spring、Hibernate和SiteMesh。如果您已經擅長這些技術,那么這是件好事;但是如果您由于某種原因不喜歡這些技術,或者您認為不僅需要學習Grails,還需要學習其他三種框架,那么這就不是件好事了。雖然這些技術能夠幫助Grails執行得更好,但是學習四種框架對于大多數人來說是一個很高的門檻。Grails文檔目前主要關注它與Spring、Hibernate和其他程序的集成,然而我認為它需要采用相反的方法,將Grails推行為一個簡單快速的Web應用程序開發框架。開發人員無需擔心或考慮底層發生了什么。

      幸運的是,一旦您開始使用Grails,您將發現Grails隱藏了這些框架的大多數底層復雜性。如果您忘掉在底層運行的是Spring、Hibernate和其他程序,那么事情就會變得簡單。

      Grails應用程序的三個層是:

    1. 由視圖和控制器組成的Web層
    2. 由域類和服務組成的業務邏輯層
    3. 由域類和數據源組成的持久層

      大多數框架都有數十種特性,其中只有很少幾種得到了廣泛使用。對于Grails來說,這種關鍵特性是指“規則編程”(coding by convention)范例和構件的自動生成。

      Grails的其他特性包括對Ajax、驗證、單元測試和功能測試的內置支持。它使用免費的開源Canoo WebTest項目來實現Web應用程序的功能測試。Grails還提供與Quartz Scheduler的集成。

      現在是時候安裝Grails框架并且編寫您的第一個應用程序了。

    Grails安裝

      安裝過程非常簡單。以下是Grails下載頁面:http://grails.org/Download。您可以從http://dist.codehaus.org/grails/grails-bin-0.2.1.zip下載version 0.2.1。請注意Grails源代碼和文檔作為單獨的下載提供。下載zip文件之后,只需將其內容解壓縮到一個目錄即可,在我的案例中此目錄是 C:\groovy\grails-0.2.1\。

      創建一個名為GRAILS_HOME 的新環境變量,并將其值設為 C:\groovy\grails-0.2.1\。接下來將GRAILS_HOME\bin 添加到PATH 環境變量。這樣安裝就完成了。通過在命令提示符界面中運行grails 命令您可以檢查安裝是否成功。您應該獲得此命令的使用信息。

      既然您有了一個運行中的Grails安裝,那么您已經為創建Grails Web應用程序做好了準備。

    開發Grails應用程序:應用程序結構

      多年來我一直計劃開發一個可以幫助我管理衣服的應用程序——這個應用程序應該能夠告訴我我最喜歡的T恤衫放在哪里、是否洗過、是否熨過,等等。總有一天我會靠銷售這個應用程序掙上幾百萬,但是現在我將把它用作Grails例子。

      第一步是創建一個Grails項目目錄結構。在這一步我將在C:\groovy\grailsapps 創建一個新目錄,并在此級別打開一個命令提示符窗口。在此窗口中,執行命令grails create-app。要求您輸入應用程序名稱。輸入 ClothesMgt。Grails將顯示它為您創建的全部目錄和文件。圖1顯示了最后得到的命令結構。

    Groovy和Grails簡介圖-1

      圖1:Grails項目目錄結構

      此命令將創建約800 KB大小的文件和目錄。這里的想法是此框架遵循已經建立的Web應用程序開發慣例,因此它創建的文件和目錄在大多數Web應用程序中是有用的。雖然有些人可能不喜歡這種強制使用某種結構的想法,但是這種基于慣例的自動生成正是Grails的RAD特性的基礎。

      如果更仔細地看一下這些目錄,您就會發現存在用于諸如控制器、視圖、測試、配置文件和標簽庫之類東西的目錄。您還會發現存在一些基本JavaScript和CSS文件。那么現在應用程序的基本結構已經有了。您只需做些填空,應用程序即可就緒。

      請注意自動生成目錄和文件的命令是可選的。您可以手動創建全部文件和目錄。如果熟悉Apache Ant,那么您甚至可以打開GRAILS_HOME 目錄中的\src\grails\build.xml 文件,來仔細查看每個Grails命令的用途。

    數據庫

      在此例中我將使用一個 運行于localhost的名為Clothes_Grails的MySQL數據庫。Grails內置一個HSQL數據庫,這對測試簡單的應用程序或僅試用Grails非常有用。如果您使用HSQL DB,那么無需執行以下幾步。我將使用MySQL來證明您能夠非常輕松地使用HSQL之外的數據庫。

      從http://www.mysql.com/products/connector/j/ 下載MySQL驅動器,并將mysql-connector-java-<version number>-stable-bin.jar 文件放置在ClothesMgt\lib 目錄中。接下來您需要編輯 ClothesMgt\grails-app\conf\ApplicationDataSource.groovy文件。

      現在此文件的內容應該類似以下內容:

    class ApplicationDataSource {
    boolean pooling = true
    String dbCreate = "create-drop"
    String url = "jdbc:mysql://localhost/Clothes_Grails"
    String driverClassName = "com.mysql.jdbc.Driver"
    String username = "grails"
    String password = "groovy"
    }
    

      現在讓我們看一下如何使用此數據庫和對象關系映射。

    域類

      Grails的對象關系映射(GORM)功能在內部使用Hibernate 3,但是您無需了解或更改任何Hibernate設置。Grails具有稱為“域類”的東西,這些域類的對象被映射到數據庫。您可以使用關系來鏈接域類,它們也提供用于CRUD(創建/讀取/更新/刪除)操作的功能非常強大的動態方法。

      在此例中,我們將創建三個域類,其名稱分別是Shirt、Trouser和Cabinet。要創建域類,只需運行命令 grails create-domain-class。請記住在您的項目目錄(而不是它的上級目錄)內運行此命令。這是一個常見錯誤,雖然我已經提醒了您,您還是會犯至少一次這樣的錯誤。

      您必須提供給create-domain-class 命令的唯一輸入是類的名稱。運行此命令三次,將Shirt、Trouser和Cabinet作為三個域類的名稱。Grails現在將在目錄 grails-app/domain/中創建這些域類。它們將僅具有兩個屬性id 和 version。我將為這些類添加屬性,以便使它們更能代表襯衫、褲子和衣櫥。

      清單1:Cabinet.groovy

    class Cabinet {
    Long id
    Long version
    String name
    String location
    def relatesToMany = [ shirts : Shirt, trousers : Trouser ]
    Set shirts = new HashSet()
    Set trousers = new HashSet()
    String toString() { "${this.class.name} :  $id" }
    boolean equals(other) {
    if(other?.is(this))return true
    if(!(other instanceof Cabinet)) return false
    if(!id || !other?.id || id!=other?.id) return false
    return true
    }
    int hashCode() {
    int hashCode = 0
    hashCode = 29 * (hashCode + ( !id ? 0 : id ^ (id >>> 32)) )
    }
    }
    

      清單2: Trouser.groovy

    class Trouser {
    Long id
    Long version
    String name
    String color
    Cabinet cabinet
    def belongsTo = Cabinet
    String toString() { "${this.class.name} :  $id" }
    boolean equals(other) {
    if(other?.is(this))return true
    if(!(other instanceof Trouser)) return false
    if(!id || !other?.id || id!=other?.id) return false
    return true
    }
    int hashCode() {
    int hashCode = 0
    hashCode = 29 * (hashCode + ( !id ? 0 : id ^ (id >>> 32) ) )
    }
    }
    

      清單3: Shirt.groovy

    class Shirt {
    Long id
    Long version
    String name
    String color
    Cabinet cabinet
    def belongsTo = Cabinet
    String toString() { "${this.class.name} :  $id" }
    boolean equals(other) {
    if(other?.is(this))return true
    if(!(other instanceof Shirt)) return false
    if(!id || !other?.id || id!=other?.id) return false
    return true
    }
    int hashCode() {
    int hashCode = 0
    hashCode = 29 * (hashCode + ( !id ? 0 : id ^ (id >>> 32)))
    }
    }
    

      我添加的僅有的幾行聲明了字段名稱和顏色,然后聲明了Cabinet、Shirt和Trouser之間的關系。每個Shirt和Trouser都屬于Cabinet,而Cabinet具有shirt和trouser的集合。belongsTo 屬性在此案例中是可選的,因為在一對多關系中,Grails會將“一”這一方視為所有者。因此您就無需顯式聲明了。在這里我進行顯式聲明只是為了使這種關系更明顯。

      接下來我們將討論Grails應用程序的控制器和視圖部分。

    控制器和視圖

      既然域類已經就緒,讓我們使用generate-all命令自動生成基本CRUD Web應用程序。運行grails generate-all 命令三次,當被詢問時提供域類名稱。generate-all 命令的目的是生成每個域類的控制器和視圖,但是由于bug-245,Grails 0.2.1不能生成控制器。您必須手動生成控制器,其方法是對每個域類使用generate-controller 命令。

      現在您應該在grails-app\controllers 目錄中看到三個控制器。這些控制器負責處理Web應用程序中針對特定域類的請求。因此ShirtController.groovy 將處理Web應用程序中與Shirt域類相關的CRUD請求,等等。現在控制器具有多個閉包,每個閉包映射到一個URI。閉包是Groovy語言很好的一個特性,然而要習慣它還是需要一些時間的。清單4顯示了Shirtcontroller.groovy的一段摘錄。

      清單4:ShirtController.groovy 摘錄

    class ShirtController {
    def index = { redirect(action:list,params:params) }
    def list = {
    [ shirtList: Shirt.list( params ) ]
    }
    def show = {
    [ shirt : Shirt.get( params.id ) ]
    }
    def delete = {
    def shirt = Shirt.get( params.id )
    if(shirt) {
    shirt.delete()
    flash.message = "Shirt ${params.id} deleted."
    redirect(action:list)
    }
    else {
    flash.message = "Shirt not found with id ${params.id}"
    redirect(action:list)
    }
    }
    // ...
    }
    

      在此例中,ShirtController 中的list閉包將處理URI是/shirt/list的請求,等等。您可在控制器中使用您習慣在Java Web應用程序中使用的東西,例如請求、會話和servletContext。

      請注意:閉包也將值作為顯式返回語句返回,或者作為閉包體中的最后一個語句的值返回。不要因為Grails生成的代碼中沒有return 而困惑。

      一旦控制器完成了對請求的處理,它必須委托給合適的視圖。Grails使用慣例機制實現此操作。因此ShirtController 中的list閉包將委托給視圖 /grails-app/views/shirt/list.gsp 或 /grails-app/views/shirt/list.jsp。 盡管您在使用Grails,全部視圖可以是JSP文件而不是GSP。我幾乎沒有編寫任何代碼,但是我已經準備好了一個Web應用程序。

      讓我們嘗試部署和運行我們的應用程序。

    在Java EE Server上部署和運行Grails

      Grails具有一個內置Resin服務器,您可使用grails run-app 命令運行應用程序。此命令會將應用程序部署到Resin服務器并啟動服務器。因此您現在可以在http://localhost:8080/ClothesMgt 訪問此應用程序。您還可以同樣輕松地將應用程序部署到任意JavaEE服務器。我嘗試將它部署到Tomcat。要實現此操作,我所需要做的是運行grails war 命令,將生成的war文件復制到Tomcat中的webapps目錄!

      在此案例中生成的war文件的名稱為 ClothesMgt.war。一旦部署到Tomcat,您就應該能夠在http://localhost:8080/ClothesMgt/ 上訪問它,并看到如圖2所示的屏幕。

    Groovy和Grails簡介圖-2

      圖2:Grails 應用程序

      通過此應用程序,能夠獲得Shirt、Trouser和Cabinet的全部CRUD功能。可以顯示衣櫥的全部數據、向衣櫥添加新襯衫和褲子、編輯它們的值和刪除記錄——實現這些操作都無需編寫任何業務邏輯、視圖或數據訪問代碼。僅在幾分鐘內您就在JavaEE服務器上部署好了一個合適的Web應用程序。很酷吧?!

      讓我們更進一步來定制Grails。

    創建自定義控制器

      我現在將把新功能和頁面添加到Web應用程序,同時重用已經存在的域類。shirt/list 和 trouser/list 會分別顯示襯衫和褲子的清單,現在讓我們添加一個新的顯示,來同時顯示襯衫和褲子的清單。要創建一個新的顯示,您需要一個新的控制器和視圖。

      使用 generate-controller 和 generate-views 命令,可以輕松實現使用域類自動生成視圖和控制器。然而,在此案例中我希望創建一個與域類不直接關聯的控制器。因此我將使用grails create-controller命令。當被提示輸入控制器名稱時,聲明Display。Grails將在grails-app/controllers/ 目錄創建一個名為DisplayController.groovy 的控制器,在grails-tests 目錄創建一個測試套件。如清單5所示編輯控制器。

      清單5:DisplayController.groovy

    class DisplayController {
    def index = {redirect(action:list,params:params)}
    def list = {
    params['max'] = 10
    return [ shirtList: Shirt.list( params ),
    trouserList: Trouser.list( params )]
    }
    }
    

      index 閉包將請求重定向到清單。在list 閉包中我將最大參數設為10,然后使用動態方法Shirt.list 和 Trouser.list。然后返回Groovy Map,它有兩個清單——襯衫清單和褲子清單。

      作為Java開發人員,當看到Shirt.list()時會自然認為是在Shirt域類中的list 方法。然而,如果打開Shirt.groovy,會發現并沒有此方法。對于Java開發人員來說,不了解Groovy的特性就使用Grails不僅是令人困惑的,而且是死胡同。動態方法是Grails的特殊特性,它是構建于Groovy語言的一個非常特殊的特性元對象協議 (MOP)之上的。如此證明可以使用動態方法查詢域類。因此,在控制器中,您將注意到在域類上調用的方法似乎在域類中不存在。您可以在這里閱讀關于使用動態方法查詢的更多信息。可以在這里找到對Grails控制器和域類中可用的動態方法的參考資料。

      既然控制器能夠處理請求、獲取清單并轉發到視圖,我需要創建相應視圖。

    創建自定義視圖

      當創建控制器時,Grails還在grails-app\views 目錄創建了一個新的顯示目錄,并將以下映射添加到web.xml 文件中。

    <servlet-mapping>
    <servlet-name>grails</servlet-name>
    <url-pattern>/display/*</url-pattern>
    </servlet-mapping>
    

      目前Grails有一個generate-views 命令,此命令能夠生成基于域類的視圖,然而沒有能夠自動生成視圖的create-view 命令。請看圖3中的例子。

    Groovy和Grails簡介圖-3

      圖3:一個顯示Trousers的默認視圖

      因為我希望創建一個獨立于域類的視圖,所以讓我們手動創建視圖文件。在目錄grails-app\views\display\中,創建一個名為 list.gsp的文件,如清單6所示。

      清單6:list.gsp

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>Display Shirt And Trouser List</title>
    <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}"></link>
    </head>
    <body>
    <div class="nav">
    <span class="menuButton"><a href="${createLinkTo(dir:'')}">Home</a></span>
    </div>
    <div class="body">
    <h1>Shirt List</h1>
    <table>
    <tr>
    <th>Id</th><th>Cabinet</th> <th>Color</th><th>Name</th>
    </tr>
    <g:each in="${shirtList}">
    <tr>
    <td>${it.id}</td> <td>${it.cabinet.name}</td>
    <td>${it.color}</td> <td>${it.name}</td>
    </tr>
    </g:each>
    </table>
    <h1>Trouser List</h1>
    <table>
    <tr>
    <th>Id</th> <th>Cabinet</th>
    <th>Color</th> <th>Name</th>
    </tr>
    <g:each in="${trouserList}">
    <tr>
    <td>${it.id}</td> <td>${it.cabinet.name}</td>
    <td>${it.color}</td> <td>${it.name}</td>
    </tr>
    </g:each>
    </table>
    </div>
    </body>
    </html>
    

      與我之前使用的方式類似,您現在也可以使用run-app 命令運行應用程序,或者創建一個war文件并將其部署到Tomcat。您應該在http://localhost:8080/ClothesMgt/display/下看到新的視圖,如圖4所示。

    Groovy和Grails簡介圖-4

      圖4:新創建的列出襯衫和褲子清單的視圖

      現在讓我們快速討論一下Grails服務。

    服務

      如果您想知道如何分開業務邏輯以及放置業務邏輯的位置,答案在Grails 服務中。服務以SomeNameService.groovy 格式命名,且被置于 /grails-app/services/目錄。服務可利用依賴注入特性,您能夠輕松地從控制器內部調用這些服務。

      讓我們來看一個使用服務的例子。首先,使用create-service 命令創建新服務。運行此命令并命名服務Order。Grails將創建兩個文件——grails-app/services/OrderService.groovy 和 grails-tests/OrderTests.groovy。

      現在編輯OrderService.groovy,如清單7所示。當引入新的orderGoods() 方法時會自動生成serviceMethod() 。

      清單7:OrderService.groovy

    class OrderService {
    boolean transactional = true
    def serviceMethod() {
    // TODO
    }
    def orderGoods() {
    return "Order Placed - New shirts and trousers \
    will be sent shortly."
    }
    }
    

      現在編輯DisplayController,如清單8所示。引入使用OrderService的重排閉包。請注意服務將由Groovy注入。

      清單8:DisplayController.groovy

    class DisplayController {
    OrderService orderService
    def index = {redirect(action:list,params:params)}
    def list = {
    params['max'] = 10
    return [ shirtList: Shirt.list( params )
    , trouserList: Trouser.list( params )]
    }
    def reorder = {
    render(orderService.orderGoods())
    }
    }
    

      現在當您訪問URL http://localhost:8080/ClothesMgt/display/reorder時,重排閉包將調用 OrderService,響應會被發回到瀏覽器。您能夠以類似方式將全部業務邏輯移入服務,然后使用Grails的注入功能非常輕松地使用它們。

    動態方法和屬性

      正如之前提到的,域類沒有能夠從數據庫獲取數據或更新/刪除現有數據的任何方法,例如find()、 findAll() 或 save() 。在控制器中您也沒有編寫諸如 redirect() 或 render() 之類的方法。但是域類和控制器有它們的計劃目的,且允許所有要求的操作。原因是Grails中動態方法和屬性的存在。動態方法被動態添加到類,就好像功能是在程序中編譯的一樣。

      這些是可用的方法和屬性,無需編寫。這些動態方法涵蓋了大多數Web應用程序開發中會碰到的常見情況。對于域類來說,存在諸如find()、findAll()、list()、executeQuery()、save()和 delete()之類的動態方法。控制器具有諸如session、request和response之類的動態屬性,以及諸如chain()、render()和 redirect()之類的方法。要真正利用Grails的強大功能,您需要了解所有這些動態方法和屬性的功能。

    順便介紹一下:自動重載和@Property

      Grails的一個重要特性是能夠在開發過程中進行了更改時自動重載文件。因此只需編輯和保存gsp文件,就會自動重載新文件。然而這里創建的類似OrderService 的事務服務不會被重載。您會在服務器控制臺看到以下消息"[groovy] Cannot reload class [class OrderService] reloading of transactional service classes is not currently possible. Set class to non-transactional first. "

      Grails的自動重載功能會為您節省許多時間,您就無需浪費時間來重啟服務器了。我碰到過一些Grails不能自動重載的案例,例如將一個jsp文件重命名到gsp。然而,Grails的這項功能有望在未來版本中得到進一步改進。

      在Groovy JSR 06 的之前版本中,您必須使用@Property 來定義Groovy中的新屬性。因此您會在線看到許多使用@Property的舊的Groovy例子。然而請注意,@Property已經從Groovy JSR 06中移除,在Grails 0.2和之后的版本中也不會再需要它。請參閱@Property 建議來獲得更多細節。

    結束語

      在本文中,我介紹了Grails框架的基本特性,并使用Grails創建了一個應用程序。Groovy和Grails最大的好處是一切都運行在優秀的舊Java和Java EE上——因此您能夠使用Groovy和Grails的RAD特性快速開發應用程序,然后將應用程序部署到可靠的Java EE服務器上。考慮到關于Ruby和Rails的宣傳噪音,顯然需要一個Java備選方案。Groovy和Grails看起來非常適合這個角色。

    下載

      下載本文中的代碼:

    參考資料

    posted on 2008-02-21 12:40 cAng^Er 閱讀(712) 評論(0)  編輯  收藏 所屬分類: |:開源框架:|

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲午夜福利在线观看| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 噜噜噜亚洲色成人网站∨| 伊人久久大香线蕉免费视频| 91麻豆精品国产自产在线观看亚洲 | 免费观看国产小粉嫩喷水| 国产成人亚洲午夜电影| 国产成人免费a在线视频app| 337P日本欧洲亚洲大胆艺术图 | 国产亚洲精品自在线观看| a级毛片毛片免费观看久潮| 国产亚洲婷婷香蕉久久精品 | 久久亚洲精品国产精品| 麻豆最新国产剧情AV原创免费| 亚洲国产韩国一区二区| 91在线视频免费91| 免费在线观看亚洲| 亚洲午夜久久久久久噜噜噜| 久久aⅴ免费观看| 亚洲av一本岛在线播放| 成人毛片18女人毛片免费| 国产精品亚洲精品爽爽| 亚洲人成网站观看在线播放 | 成人免费激情视频| 亚洲变态另类一区二区三区| 亚洲综合色视频在线观看| 无码av免费一区二区三区试看| 亚洲人成综合在线播放| 国产禁女女网站免费看| 最新久久免费视频| 亚洲人成电影网站| 亚洲国产精品成人AV无码久久综合影院 | 亚洲精品9999久久久久无码| 亚洲国产综合精品一区在线播放| eeuss影院免费直达入口| 亚洲性色高清完整版在线观看| 国产公开免费人成视频| 秋霞人成在线观看免费视频| 亚洲日韩国产二区无码| 日韩va亚洲va欧洲va国产| 午夜精品在线免费观看|