Groovy和Grails簡介
摘要Java Web應(yīng)用程序框架是企業(yè)Java得以成功的重要原因之一。人們懷疑如果沒有Apache Struts框架Java EE是否能夠如此成功。雖然底層編程語言很重要,但通常是框架使編程語言成為引人注目的中心的。如果您經(jīng)常訪問討論論壇,就會(huì)注意到Ruby語言和 Ruby On Rails框架之間也是這種情況。Ruby已經(jīng)出現(xiàn)十多年了,然而只是在Ruby On Rails框架流行之后,開發(fā)人員才開始注意到Ruby語言。 諸如Ruby、PHP和Python之類的腳本語言最近幾年越來越流行,因此,需要開發(fā)一個(gè)Java腳本備選語言和類似Rails的針對(duì)Java環(huán)境的框架。Groovy就是這個(gè)腳本語言,而Grails就是這個(gè)框架。 在本文中我將討論Groovy的Web開發(fā)功能,然后繼續(xù)討論Grails框架。我將開發(fā)一個(gè)示例Grails Web應(yīng)用程序,并討論此框架的各種特性。 Groovy是什么?Groovy是一種 語言,其語法類似于Java,但比Java更簡單。它通常被視為腳本/靈活/動(dòng)態(tài)的語言,但是我不喜歡這類形容詞,因?yàn)槲艺J(rèn)為它們只會(huì)令人困惑。如果說 Java是一位明智的中年男子,那么Groovy就是他十幾歲的兒子。Groovy具有父親的許多特點(diǎn),但是更為狂野且更為有趣。他們也可以很好地合作。 Groovy的規(guī)則比Java少得多。例如,要在Java中獲得標(biāo)準(zhǔn)的"Hello World"輸出,您需要編寫一個(gè)類、一個(gè)具有合適參數(shù)的主方法,等等。但是在Groovy中,如果不想編寫所有樣板代碼,您可以拋開類定義和主方法,僅 編寫一行代碼即可打印出"Hello World"。 以下是打印Hello World的文件 Hello.groovy 的內(nèi)容: println "Hello World" Java平臺(tái)僅關(guān)心使字節(jié)碼得到執(zhí)行。同樣,此平臺(tái)不強(qiáng)迫您使用Java語言。只要提供了字節(jié)碼,工作就會(huì)進(jìn)行。Groovy代碼會(huì)被編譯為字節(jié)碼,而對(duì)于Java平臺(tái)來說,字節(jié)碼是從Java代碼還是Groovy代碼生成的并沒有任何區(qū)別。 以下是一個(gè)Groovy例子,它顯示了Groovy對(duì)清單、映射和范圍的內(nèi)置支持,并證明了Groovy的簡單性及其利用Java的強(qiáng)大功能的能力: // Print Date 請(qǐng)注意以上代碼直接使用java.util.Date ,對(duì)收集的內(nèi)置支持減少了使用清單、映射和范圍所需的代碼。還有許多其他有趣的Groovy特性,例如閉包和簡化的XML處理。您可以在groovy.上找到詳細(xì)清單。 現(xiàn)在讓我們來討論如何將Groovy用于Web開發(fā)。 使用Groovy進(jìn)行Web開發(fā)大多數(shù)Java EE教程都從一個(gè)基本servlet例子開始。對(duì)于Groovy Web開發(fā)來說,您將從groovlet(在groovy中servlet的對(duì)應(yīng)概念)開始。如果您在servlet中擺脫了類和doXX() 方法聲明,那么剩下的內(nèi)容就與groovlet很像了。以下是一個(gè)名為 Login.groovy 的groovlet例子,您需要將它置于Web應(yīng)用程序的最高級(jí)目錄: def username= request.getParameter("username") 您可以僅創(chuàng)建一個(gè)簡單的HTML表單,然后將此表單的行為屬性發(fā)送到 action="Login.groovy"。然后將以下標(biāo)簽添加到web.xml: <servlet> 現(xiàn)在只需將要求的Groovy jar 文件添加到WEB-INF/lib 目錄,您的Groovy Web應(yīng)用程序就準(zhǔn)備好在任意Java EE應(yīng)用服務(wù)器上運(yùn)行了。 您應(yīng)該已經(jīng)注意到代碼中沒有分號(hào),而且使用了隱式變量如request和response。其他隱式變量有context、application、session、out、sout和 html。 GSP是JSP在groovy中的對(duì)應(yīng)概念。您無需使用println生成HTML;只需將Groovy代碼嵌入HTML頁面。本文中的例子將在提到Grails時(shí)使用GSP。 請(qǐng)注意,因?yàn)樗写a最終都要轉(zhuǎn)換為字節(jié)碼,所以groovlet和GSP能夠與servlet和JSP輕松協(xié)作。因此您無需區(qū)分groovlet和GSP或者servlet和JSP。 現(xiàn)在讓我們討論前途無量的Grails框架。如果成功的話,Grails能夠極大地改變開發(fā)Java Web應(yīng)用程序的方式。Ruby on Rails對(duì)Ruby的影響,Grails也能夠?qū)roovy實(shí)現(xiàn)。 Grails特性和架構(gòu)Grails試圖使用Ruby On Rails的“規(guī)約編程”(coding by convention)范例來降低對(duì)配置文件和其他樣板代碼的需求。使用“規(guī)約編程” ,如果文件的名稱本身就能說明此文件的用途,那么您就不需要在配置文件中再次聲明這些內(nèi)容了。此框架會(huì)查看文件名,并自己弄清文件用途。通過使用“規(guī)約編 程” ,Grails還將自動(dòng)生成Web應(yīng)用程序中需要的許多內(nèi)容。通過使用Grails,您將能夠在很短的時(shí)間內(nèi)、以最小的復(fù)雜性使Web應(yīng)用程序就緒。請(qǐng)看 以下例子。 Grails基于開源技術(shù),例如Spring、Hibernate和SiteMesh。如果您已經(jīng)擅長這些技術(shù),那么這是件好事;但是如果您由 于某種原因不喜歡這些技術(shù),或者您認(rèn)為不僅需要學(xué)習(xí)Grails,還需要學(xué)習(xí)其他三種框架,那么這就不是件好事了。雖然這些技術(shù)能夠幫助Grails執(zhí)行 得更好,但是學(xué)習(xí)四種框架對(duì)于大多數(shù)人來說是一個(gè)很高的門檻。Grails文檔目前主要關(guān)注它與Spring、Hibernate和其他程序的集成,然而 我認(rèn)為它需要采用相反的方法,將Grails推行為一個(gè)簡單快速的Web應(yīng)用程序開發(fā)框架。開發(fā)人員無需擔(dān)心或考慮底層發(fā)生了什么。 幸運(yùn)的是,一旦您開始使用Grails,您將發(fā)現(xiàn)Grails隱藏了這些框架的大多數(shù)底層復(fù)雜性。如果您忘掉在底層運(yùn)行的是Spring、Hibernate和其他程序,那么事情就會(huì)變得簡單。
大多數(shù)框架都有數(shù)十種特性,其中只有很少幾種得到了廣泛使用。對(duì)于Grails來說,這種關(guān)鍵特性是指“規(guī)則編程”(coding by convention)范例和構(gòu)件的自動(dòng)生成。 Grails的其他特性包括對(duì)Ajax、驗(yàn)證、單元測試和功能測試的內(nèi)置支持。它使用免費(fèi)的開源Canoo WebTest項(xiàng)目來實(shí)現(xiàn)Web應(yīng)用程序的功能測試。Grails還提供與Quartz Scheduler的集成。 現(xiàn)在是時(shí)候安裝Grails框架并且編寫您的第一個(gè)應(yīng)用程序了。 Grails安裝安裝過程非常簡單。以下是Grails下載頁面:http:///Download。您可以從http://dist./grails/grails-bin-0.2.1.zip下載version 0.2.1。請(qǐng)注意Grails源代碼和文檔作為單獨(dú)的下載提供。下載zip文件之后,只需將其內(nèi)容解壓縮到一個(gè)目錄即可,在我的案例中此目錄是 C:\groovy\grails-0.2.1\。 創(chuàng)建一個(gè)名為GRAILS_HOME 的新環(huán)境變量,并將其值設(shè)為 C:\groovy\grails-0.2.1\。接下來將GRAILS_HOME\bin 添加到PATH 環(huán)境變量。這樣安裝就完成了。通過在命令提示符界面中運(yùn)行g(shù)rails 命令您可以檢查安裝是否成功。您應(yīng)該獲得此命令的使用信息。 既然您有了一個(gè)運(yùn)行中的Grails安裝,那么您已經(jīng)為創(chuàng)建Grails Web應(yīng)用程序做好了準(zhǔn)備。 開發(fā)Grails應(yīng)用程序:應(yīng)用程序結(jié)構(gòu)多年來我一直計(jì)劃開發(fā)一個(gè)可以幫助我管理衣服的應(yīng)用程序——這個(gè)應(yīng)用程序應(yīng)該能夠告訴我我最喜歡的T恤衫放在哪里、是否洗過、是否熨過,等等。總有一天我會(huì)靠銷售這個(gè)應(yīng)用程序掙上幾百萬,但是現(xiàn)在我將把它用作Grails例子。 第一步是創(chuàng)建一個(gè)Grails項(xiàng)目目錄結(jié)構(gòu)。在這一步我將在C:\groovy\grailsapps 創(chuàng)建一個(gè)新目錄,并在此級(jí)別打開一個(gè)命令提示符窗口。在此窗口中,執(zhí)行命令grails create-app。要求您輸入應(yīng)用程序名稱。輸入 ClothesMgt。Grails將顯示它為您創(chuàng)建的全部目錄和文件。圖1顯示了最后得到的命令結(jié)構(gòu)。 圖1:Grails項(xiàng)目目錄結(jié)構(gòu) 此命令將創(chuàng)建約800 KB大小的文件和目錄。這里的想法是此框架遵循已經(jīng)建立的Web應(yīng)用程序開發(fā)慣例,因此它創(chuàng)建的文件和目錄在大多數(shù)Web應(yīng)用程序中是有用的。雖然有些人 可能不喜歡這種強(qiáng)制使用某種結(jié)構(gòu)的想法,但是這種基于慣例的自動(dòng)生成正是Grails的RAD特性的基礎(chǔ)。 如果更仔細(xì)地看一下這些目錄,您就會(huì)發(fā)現(xiàn)存在用于諸如控制器、視圖、測試、配置文件和標(biāo)簽庫之類東西的目錄。您還會(huì)發(fā)現(xiàn)存在一些基本JavaScript和CSS文件。那么現(xiàn)在應(yīng)用程序的基本結(jié)構(gòu)已經(jīng)有了。您只需做些填空,應(yīng)用程序即可就緒。 請(qǐng)注意自動(dòng)生成目錄和文件的命令是可選的。您可以手動(dòng)創(chuàng)建全部文件和目錄。如果熟悉Apache Ant,那么您甚至可以打開GRAILS_HOME 目錄中的\src\grails\build.xml 文件,來仔細(xì)查看每個(gè)Grails命令的用途。 數(shù)據(jù)庫在此例中我將使用一個(gè) 運(yùn)行于localhost的名為Clothes_Grails的MySQL數(shù)據(jù)庫。Grails內(nèi)置一個(gè)HSQL數(shù)據(jù)庫,這對(duì)測試簡單的應(yīng)用程序或僅試用 Grails非常有用。如果您使用HSQL DB,那么無需執(zhí)行以下幾步。我將使用MySQL來證明您能夠非常輕松地使用HSQL之外的數(shù)據(jù)庫。 從http://www./products/connector/j/ 下載MySQL驅(qū)動(dòng)器,并將mysql-connector-java-<version number>-stable-bin.jar 文件放置在ClothesMgt\lib 目錄中。接下來您需要編輯 ClothesMgt\grails-app\conf\ApplicationDataSource.groovy文件。 現(xiàn)在此文件的內(nèi)容應(yīng)該類似以下內(nèi)容: class ApplicationDataSource { 現(xiàn)在讓我們看一下如何使用此數(shù)據(jù)庫和對(duì)象關(guān)系映射。 域類Grails的對(duì)象關(guān)系映射(GORM)功能在內(nèi)部使用Hibernate 3,但是您無需了解或更改任何Hibernate設(shè)置。Grails具有稱為“域類”的東西,這些域類的對(duì)象被映射到數(shù)據(jù)庫。您可以使用關(guān)系來鏈接域類, 它們也提供用于CRUD(創(chuàng)建/讀取/更新/刪除)操作的功能非常強(qiáng)大的動(dòng)態(tài)方法。 在此例中,我們將創(chuàng)建三個(gè)域類,其名稱分別是Shirt、Trouser和Cabinet。要?jiǎng)?chuàng)建域類,只需運(yùn)行命令 grails create-domain-class。請(qǐng)記住在您的項(xiàng)目目錄(而不是它的上級(jí)目錄)內(nèi)運(yùn)行此命令。這是一個(gè)常見錯(cuò)誤,雖然我已經(jīng)提醒了您,您還是會(huì)犯 至少一次這樣的錯(cuò)誤。 您必須提供給create-domain-class 命令的唯一輸入是類的名稱。運(yùn)行此命令三次,將Shirt、Trouser和Cabinet作為三個(gè)域類的名稱。Grails現(xiàn)在將在目錄 grails-app/domain/中創(chuàng)建這些域類。它們將僅具有兩個(gè)屬性id 和 version。我將為這些類添加屬性,以便使它們更能代表襯衫、褲子和衣櫥。 清單1:Cabinet.groovy class Cabinet { 清單2: Trouser.groovy class Trouser { 清單3: Shirt.groovy class Shirt { 我添加的僅有的幾行聲明了字段名稱和顏色,然后聲明了Cabinet、Shirt和Trouser之間的關(guān)系。每個(gè)Shirt和Trouser 都屬于Cabinet,而Cabinet具有shirt和trouser的集合。belongsTo 屬性在此案例中是可選的,因?yàn)樵谝粚?duì)多關(guān)系中,Grails會(huì)將“一”這一方視為所有者。因此您就無需顯式聲明了。在這里我進(jìn)行顯式聲明只是為了使這種關(guān) 系更明顯。 接下來我們將討論Grails應(yīng)用程序的控制器和視圖部分。 控制器和視圖既然域類已經(jīng)就緒,讓我們使用generate-all命令自動(dòng)生成基本CRUD Web應(yīng)用程序。運(yùn)行g(shù)rails generate-all 命令三次,當(dāng)被詢問時(shí)提供域類名稱。generate-all 命令的目的是生成每個(gè)域類的控制器和視圖,但是由于bug-245,Grails 0.2.1不能生成控制器。您必須手動(dòng)生成控制器,其方法是對(duì)每個(gè)域類使用generate-controller 命令。 現(xiàn)在您應(yīng)該在grails-app\controllers 目錄中看到三個(gè)控制器。這些控制器負(fù)責(zé)處理Web應(yīng)用程序中針對(duì)特定域類的請(qǐng)求。因此ShirtController.groovy 將處理Web應(yīng)用程序中與Shirt域類相關(guān)的CRUD請(qǐng)求,等等?,F(xiàn)在控制器具有多個(gè)閉包,每個(gè)閉包映射到一個(gè)URI。閉包是Groovy語言很好的一個(gè)特性,然而要習(xí)慣它還是需要一些時(shí)間的。清單4顯示了Shirtcontroller.groovy的一段摘錄。 清單4:ShirtController.groovy 摘錄 class ShirtController { 在此例中,ShirtController 中的list閉包將處理URI是/shirt/list的請(qǐng)求,等等。您可在控制器中使用您習(xí)慣在Java Web應(yīng)用程序中使用的東西,例如請(qǐng)求、會(huì)話和servletContext。 請(qǐng)注意:閉包也將值作為顯式返回語句返回,或者作為閉包體中的最后一個(gè)語句的值返回。不要因?yàn)镚rails生成的代碼中沒有return 而困惑。 一旦控制器完成了對(duì)請(qǐng)求的處理,它必須委托給合適的視圖。Grails使用慣例機(jī)制實(shí)現(xiàn)此操作。因此ShirtController 中的list閉包將委托給視圖 /grails-app/views/shirt/list.gsp 或 /grails-app/views/shirt/list.jsp。 盡管您在使用Grails,全部視圖可以是JSP文件而不是GSP。我?guī)缀鯖]有編寫任何代碼,但是我已經(jīng)準(zhǔn)備好了一個(gè)Web應(yīng)用程序。 讓我們嘗試部署和運(yùn)行我們的應(yīng)用程序。 在Java EE Server上部署和運(yùn)行GrailsGrails具有一個(gè)內(nèi)置Resin服務(wù)器,您可使用grails run-app 命令運(yùn)行應(yīng)用程序。此命令會(huì)將應(yīng)用程序部署到Resin服務(wù)器并啟動(dòng)服務(wù)器。因此您現(xiàn)在可以在http://localhost:8080/ClothesMgt 訪問此應(yīng)用程序。您還可以同樣輕松地將應(yīng)用程序部署到任意JavaEE服務(wù)器。我嘗試將它部署到Tomcat。要實(shí)現(xiàn)此操作,我所需要做的是運(yùn)行g(shù)rails war 命令,將生成的war文件復(fù)制到Tomcat中的webapps目錄! 在此案例中生成的war文件的名稱為 ClothesMgt.war。一旦部署到Tomcat,您就應(yīng)該能夠在http://localhost:8080/ClothesMgt/ 上訪問它,并看到如圖2所示的屏幕。 圖2:Grails 應(yīng)用程序 通過此應(yīng)用程序,能夠獲得Shirt、Trouser和Cabinet的全部CRUD功能??梢燥@示衣櫥的全部數(shù)據(jù)、向衣櫥添加新襯衫和褲子、 編輯它們的值和刪除記錄——實(shí)現(xiàn)這些操作都無需編寫任何業(yè)務(wù)邏輯、視圖或數(shù)據(jù)訪問代碼。僅在幾分鐘內(nèi)您就在JavaEE服務(wù)器上部署好了一個(gè)合適的Web 應(yīng)用程序。很酷吧?! 讓我們更進(jìn)一步來定制Grails。 創(chuàng)建自定義控制器我現(xiàn)在將把新功能和頁面添加到Web應(yīng)用程序,同時(shí)重用已經(jīng)存在的域類。shirt/list 和 trouser/list 會(huì)分別顯示襯衫和褲子的清單,現(xiàn)在讓我們添加一個(gè)新的顯示,來同時(shí)顯示襯衫和褲子的清單。要?jiǎng)?chuàng)建一個(gè)新的顯示,您需要一個(gè)新的控制器和視圖。 使用 generate-controller 和 generate-views 命令,可以輕松實(shí)現(xiàn)使用域類自動(dòng)生成視圖和控制器。然而,在此案例中我希望創(chuàng)建一個(gè)與域類不直接關(guān)聯(lián)的控制器。因此我將使用grails create-controller命令。當(dāng)被提示輸入控制器名稱時(shí),聲明Display。Grails將在grails- app/controllers/ 目錄創(chuàng)建一個(gè)名為DisplayController.groovy 的控制器,在grails-tests 目錄創(chuàng)建一個(gè)測試套件。如清單5所示編輯控制器。 清單5:DisplayController.groovy class DisplayController { index 閉包將請(qǐng)求重定向到清單。在list 閉包中我將最大參數(shù)設(shè)為10,然后使用動(dòng)態(tài)方法Shirt.list 和 Trouser.list。然后返回Groovy Map,它有兩個(gè)清單——襯衫清單和褲子清單。 作為Java開發(fā)人員,當(dāng)看到Shirt.list()時(shí)會(huì)自然認(rèn)為是在Shirt域類中的list 方法。然而,如果打開Shirt.groovy,會(huì)發(fā)現(xiàn)并沒有此方法。對(duì)于Java開發(fā)人員來說,不了解Groovy的特性就使用Grails不僅是令人 困惑的,而且是死胡同。動(dòng)態(tài)方法是Grails的特殊特性,它是構(gòu)建于Groovy語言的一個(gè)非常特殊的特性元對(duì)象協(xié)議 (MOP)之上的。如此證明可以使用動(dòng)態(tài)方法查詢域類。因此,在控制器中,您將注意到在域類上調(diào)用的方法似乎在域類中不存在。您可以在這里閱讀關(guān)于使用動(dòng)態(tài)方法查詢的更多信息。可以在這里找到對(duì)Grails控制器和域類中可用的動(dòng)態(tài)方法的參考資料。 既然控制器能夠處理請(qǐng)求、獲取清單并轉(zhuǎn)發(fā)到視圖,我需要?jiǎng)?chuàng)建相應(yīng)視圖。 創(chuàng)建自定義視圖當(dāng)創(chuàng)建控制器時(shí),Grails還在grails-app\views 目錄創(chuàng)建了一個(gè)新的顯示目錄,并將以下映射添加到web.xml 文件中。 <servlet-mapping> 目前Grails有一個(gè)generate-views 命令,此命令能夠生成基于域類的視圖,然而沒有能夠自動(dòng)生成視圖的create-view 命令。請(qǐng)看圖3中的例子。 圖3:一個(gè)顯示Trousers的默認(rèn)視圖 因?yàn)槲蚁M麆?chuàng)建一個(gè)獨(dú)立于域類的視圖,所以讓我們手動(dòng)創(chuàng)建視圖文件。在目錄grails-app\views\display\中,創(chuàng)建一個(gè)名為 list.gsp的文件,如清單6所示。 清單6:list.gsp <html> 與我之前使用的方式類似,您現(xiàn)在也可以使用run-app 命令運(yùn)行應(yīng)用程序,或者創(chuàng)建一個(gè)war文件并將其部署到Tomcat。您應(yīng)該在http://localhost:8080/ClothesMgt/display/下看到新的視圖,如圖4所示。 圖4:新創(chuàng)建的列出襯衫和褲子清單的視圖 現(xiàn)在讓我們快速討論一下Grails服務(wù)。 服務(wù)如果您想知道如何分開業(yè)務(wù)邏輯以及放置業(yè)務(wù)邏輯的位置,答案在Grails 服務(wù)中。服務(wù)以SomeNameService.groovy 格式命名,且被置于 /grails-app/services/目錄。服務(wù)可利用依賴注入特性,您能夠輕松地從控制器內(nèi)部調(diào)用這些服務(wù)。 讓我們來看一個(gè)使用服務(wù)的例子。首先,使用create-service 命令創(chuàng)建新服務(wù)。運(yùn)行此命令并命名服務(wù)Order。Grails將創(chuàng)建兩個(gè)文件——grails- app/services/OrderService.groovy 和 grails-tests/OrderTests.groovy。 現(xiàn)在編輯OrderService.groovy,如清單7所示。當(dāng)引入新的orderGoods() 方法時(shí)會(huì)自動(dòng)生成serviceMethod() 。 清單7:OrderService.groovy class OrderService { 現(xiàn)在編輯DisplayController,如清單8所示。引入使用OrderService的重排閉包。請(qǐng)注意服務(wù)將由Groovy注入。 清單8:DisplayController.groovy class DisplayController { 現(xiàn)在當(dāng)您訪問URL http://localhost:8080/ClothesMgt/display/reorder時(shí),重排閉包將調(diào)用 OrderService,響應(yīng)會(huì)被發(fā)回到瀏覽器。您能夠以類似方式將全部業(yè)務(wù)邏輯移入服務(wù),然后使用Grails的注入功能非常輕松地使用它們。 動(dòng)態(tài)方法和屬性正如之前提到的,域類沒有能夠從數(shù)據(jù)庫獲取數(shù)據(jù)或更新/刪除現(xiàn)有數(shù)據(jù)的任何方法,例如find()、 findAll() 或 save() 。在控制器中您也沒有編寫諸如 redirect() 或 render() 之類的方法。但是域類和控制器有它們的計(jì)劃目的,且允許所有要求的操作。原因是Grails中動(dòng)態(tài)方法和屬性的存在。動(dòng)態(tài)方法被動(dòng)態(tài)添加到類,就好像功能是在程序中編譯的一樣。 這些是可用的方法和屬性,無需編寫。這些動(dòng)態(tài)方法涵蓋了大多數(shù)Web應(yīng)用程序開發(fā)中會(huì)碰到的常見情況。對(duì)于域類來說,存在諸如find()、 findAll()、list()、executeQuery()、save()和 delete()之類的動(dòng)態(tài)方法??刂破骶哂兄T如session、request和response之類的動(dòng)態(tài)屬性,以及諸如chain()、 render()和 redirect()之類的方法。要真正利用Grails的強(qiáng)大功能,您需要了解所有這些動(dòng)態(tài)方法和屬性的功能。 順便介紹一下:自動(dòng)重載和@PropertyGrails的一個(gè)重要特性是能夠在開發(fā)過程中進(jìn)行了更改時(shí)自動(dòng)重載文件。因此只需編輯和保存gsp文件,就會(huì)自動(dòng)重載新文件。然而這里創(chuàng)建的類似OrderService 的事務(wù)服務(wù)不會(huì)被重載。您會(huì)在服務(wù)器控制臺(tái)看到以下消息"[groovy] Cannot reload class [class OrderService] reloading of transactional service classes is not currently possible. Set class to non-transactional first. "。 Grails的自動(dòng)重載功能會(huì)為您節(jié)省許多時(shí)間,您就無需浪費(fèi)時(shí)間來重啟服務(wù)器了。我碰到過一些Grails不能自動(dòng)重載的案例,例如將一個(gè)jsp文件重命名到gsp。然而,Grails的這項(xiàng)功能有望在未來版本中得到進(jìn)一步改進(jìn)。 在Groovy JSR 06 的之前版本中,您必須使用@Property 來定義Groovy中的新屬性。因此您會(huì)在線看到許多使用@Property的舊的Groovy例子。然而請(qǐng)注意,@Property已經(jīng)從Groovy JSR 06中移除,在Grails 0.2和之后的版本中也不會(huì)再需要它。請(qǐng)參閱@Property 建議來獲得更多細(xì)節(jié)。 結(jié)束語在本文中,我介紹了Grails框架的基本特性,并使用Grails創(chuàng)建了一個(gè)應(yīng)用程序。Groovy和Grails最大的好處是一切都運(yùn)行在 優(yōu)秀的舊Java和Java EE上——因此您能夠使用Groovy和Grails的RAD特性快速開發(fā)應(yīng)用程序,然后將應(yīng)用程序部署到可靠的Java EE服務(wù)器上??紤]到關(guān)于Ruby和Rails的宣傳噪音,顯然需要一個(gè)Java備選方案。Groovy和Grails看起來非常適合這個(gè)角色。 下載下載本文中的代碼: 參考資料
|
|