Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Grails Tutorial Part 1

Grails Tutorial Part 1

Avatar for shihpeng

shihpeng

May 30, 2013
Tweet

More Decks by shihpeng

Other Decks in Technology

Transcript

  1. What is Grails? • “Groovy on Rails” • “Grails is

    an Open Source, full stack, web application framework for the JVM. “ – 「透過Groovy語言與慣例優先原則來提供一個 極具生產力並精簡的開發體驗。」 – 目標:極大地簡化企業級Java web application 的開發。 • 意思就是還是用那些企業級、受過歲月歷練的 framework,但希望能盡量的簡化使用的方式。
  2. What is Grails? • Grails不只是一個開放原始碼的web framework,他也是一個完整的開發平台。 – Grails整合了web container, database,

    build system與test framework;我們只需要透過Grails 的開發流程,就盡得它們的好處。 – 1.0版於2008年2月發佈,曾掀起討論熱潮; 2011年12月發佈2.0版,目前stable release為4月 底發佈的2.2.2版。 • 下頁中所列目前Grails版本所整合的軟體可能在未來 持續變動。
  3. Integrated Open Source • Groovy: 使用語言 • Spring Framework: J2EE

    API抽象化 • Hibernate: ORM • SiteMesh: web page layout framework • jQuery: ajax framework • Tomcat: web container • H2 Database: database • 透過mixin支援大量的test framework: 包括 JUnit 3, JUnit 4, Spock等
  4. 安裝Grails • 需求: – 已安裝JDK 1.6或以上版本; – 設置環境變數JAVA_HOME。 – 不需要額外安裝Groovy。

    • 安裝步驟: – 下載.zip檔並解壓縮到合適位置; • http://www.grails.org/download – 設置GRAILS_HOME; – 將%GRAILS_HOME%\bin加入PATH環境變數。 • 以> grails -–version確認安裝成功。
  5. 開發目標 • 透過建立一個簡單的“每日佳句” (“Quote of the Day”; qotd) application: –

    可以新增、刪除、修改,並在網頁上每次瀏覽 都看到不同的佳句。 – 實際執行Grails所建議的開發流程; – 認識Grails專案中的各個必要元件。
  6. Grails執行時期概觀 這是2008年出版書籍 “Beginning Groovy and Grails From Novice to Professional”

    中的截圖,可以看到 當時版本的Grails使用的web container還是Jetty。
  7. Grails專案的開發流程 1. 建立application。 2. 執行application。 3. 建立domain class。 3a. 實作測試程式碼。

    3b. 執行測試並修改domain class至測試通過。 4. 建立controller/view與service。 4a. 實作與進行測試,直至通過。 5. 重複步驟3. ~ 4. 直到所有元件功能完成。
  8. 建立application • > grails create-app <app-name> • 要在Grails中建立各項元件,需在命令列中以 下列格式輸入Grails目標指令(target)與參數: >

    grails <target> <args> • 第一行的create-app即是一個目標指令;會 在當前目錄下建立一個名為<app-name>的 application,並在其中建立所需目錄與檔案。
  9. 執行application • > grails run-app 或 • grails> run-app •

    也可以用server.port參數來指定要聆聽的 port number: > grails –Dserver.port=8090 run-app • 建議可以在互動模式下進行與專案操作相關的 指令,這樣指令執行的速度較快。要停止 application: grails> stop-app
  10. 建立domain class • Grails專案中的data model稱為domain;建 立data model的工作即為建立domain classes。 – Domain即MVC中的M。

    – Grails中負責ORM的部分稱為GORM;GORM透 過Hibernate來完成類別與資料庫間的mapping 與transaction。 • 要建立domain class,在專案目錄中: grails> create-domain-class <domain-class-name>
  11. 建立domain class • 在qotd專案中建立一個位於com.qotd套件, 名稱為Quote的domain class。 • 如果在建立domain class時沒有給予套件名 稱

    (例如直接輸入Quote),則Grails會將該 domain class放在一個與專案名稱相同的套 件下 (即:qotd.Quote)。
  12. 屬性限制 – 屬性名稱即成為欄位名稱 (column name),而屬性 限制成為欄位限制。 • 當然,這些資料表在建立時,GORM會自動建立如 primary key

    id及version欄位。 – 關於domain的屬性限制可參考 http://grails.org/doc/latest/guide/validation.html。 – blank代表空值不是null;屬性限制有另一項 nullable,而每個domain的nullable預設都是 false。
  13. 建立controller • Controller是用以處理頁面呈現與domain之間互動的 元件。 – 即MVC中的C,而且與其他framework相比,C很多。 – 注意,controller處理的是「UI互動」,複雜的商業邏輯 則應透過service實作。 •

    要建立controller,在專案目錄中: grails> create-controller <domain-name> 由於Grails遵守domain-driven準則,建議在透過 上述指令建立controller時,給予的名稱為一個 domain class name,代表該controller所要互動 的domain。而Grails所自動產生的controller class name 則會在後面加上Controller。
  14. 建立controller • 目前的QuoteController只有一個action method: index();action method是實際處理HTTP request 的地方。 • Domain

    controller中的action method可以理解成 「用來操作某種資料 (domain) 的動作 (action)」, Grails的URL組成也遵從此理念,因此用以呼叫 index()的URL預設上為 http://<host>/qotd/quote/index – QuoteController與quote/這個URL portion的派送 對映在建立controller時grails就幫我們已預設方式設 定好,可直接使用。
  15. Redirect user request • 加上home() action method並實作下方程式碼,讓使用者瀏覽 qotd/quote/home時會自動導到/index。 • Controller

    action可利用redirect()要求瀏覽器重發request重新 導向到另一個位置 – 可能是同一controller中的另一action、不同controller中的不同action、同 一application中的URI、其他任意URL。 – redirect()詳細用途可見 http://grails.org/doc/latest/ref/Controllers/redirect.html。
  16. 建立與controller action對應的view • Grails透過放置在grails-app/views/下的.gsp檔來 完成網頁設計與controller邏輯的分隔。 – 功能類似Django的templates,或Java web frameworks中 的.jsp檔。

    – views/中的.gsp檔也會根據所放置位置,以及命名方 式的不同而有相異的用途。 • 現在加入以下兩頁程式碼: – 在index()加入如下頁的程式碼,讓 qotd/quote/index能隨機丟出佳句資料; – 在grails-app/views/quote/中加入index.gsp頁面。
  17. QuoteController.groovy • 8行: Quote.list() 會取出database中的所有Quote 紀錄,並包裝成Quote的list。 – Groovy會檢查所撰寫的literal是否為class name;若是, 將自動將其視為該類別的class屬性,因此

    • Quote = Quote.class • Quote.list() = Quote.class.list() – Domain classes (即所有放在grails-app/domains/中的類 別) 有多個便於進行資料操作的方法,可參考 http://grails.org/doc/latest/ref/Domain%20Classes/Usage. html。 CoC得太徹底了,連繼承 或annotation都不用。
  18. 建立與controller action對應的view • 10~21行:簡單且具可讀性的程式碼,此處的程式碼 皆可透過Grails console進行測試。 • 23行:Controller action會在grails- app/views/<domain-name>/下尋找名稱與action相

    同的.gsp檔,嵌入action所給予的資料後回應給瀏覽 器。 – 雖然QuoteController中index()並沒有呼叫render或 response相關的方法,僅回傳了一個map,Grails會自動在 grails-app/views/quote/下尋找index.gsp,並在其中 嵌入map中的資料後回應給瀏覽器。
  19. 使用view layout • 當application的規模變大,所使用的頁面數也會增 加,但同一application中的頁面其結構並不會變化 太大。 – 現在的網頁都會有navigation bar、header、footer、至 少一行的sidebar,以及放置內容的container等元素。

    – 每個controller又都對應到一個頁面,重複不變的部分在 每個頁面中都是redundancy。 • Grails透過SiteMesh來支援網頁內容的decoration, 解決這個問題。
  20. 建立view layout • Grails中的layout用以代表某個頁面的主要結構。 – 當頁面中有某些部份需要改變時,只需要抽換掉那個部分的 內容。 • 要建立layout,在grails-app/views/layouts/下建 立一個.gsp檔即可。

    – 如果這個layout是給整個application用的,那應取名為 main.gsp。 • 所以grails-app/views/layouts/原本就有一個main.gsp,代 表的是網站預設頁面的layout。 – 如果這個layout只讓某個action使用,那應該命名為 <action-name>.gsp。 – 現在先製作一個quote.gsp。
  21. GSP tags • index.gsp中出現了數個<g:xxx> tag;將一些與 web相關的工作包裝起來讓.gsp檔的內容盡量不 出現複雜的程式碼。 – 官方詳細說明請見 http://grails.org/doc/latest/guide/theWebLayer.ht

    ml#tags。 • 使用GSP tag時只需要在tag中使用g前綴,Grails會 自動視其為GSP tag;其它前綴則代表其它的tags。 – GSP完全捨棄了使用JSP STL(Standard Tag Library) 時的繁 複import,同時也不建議在.gsp中使用JSP STL。
  22. GSP tags • g:layoutTitle – 輸出decorated .gsp的<title>內容。 • g:layoutBody –

    輸出decorated .gsp的<body>內容。 • 這些都是用於負責layout decoration的GSP tag,可參考 http://grails.org/doc/latest/guide/theWebLayer.html#lay outs。
  23. 使用service • 第7行:在controller中使用service最需要注意的地 方是:Grails使用了Spring的dependency injection (DI),因此我們不能明確的new出Service的實體。 – DI是一種弱化程式模組間相依性的pattern。 • 當class

    A有使用class B的需求時,只要透過某種方式讓外部知 道它有這個需求就好;當class A被執行/編譯時,外部 (某個 framework,或自己寫的工具) 會依據某些criteria選擇要注入 (inject) 的相依性類別 (dependencies)。 – 所以我們不直接new出QuoteService,而留至讓Grails 幫我們決定。 • 在這個小例子中.... 當然對功能性來說無所謂囉。
  24. Unit testing guidelines • Unit test的撰寫有幾個guideline可以遵守: – 所使用的功能來自於內建函式庫,不要測;例 如Date類別。 –

    所寫的程式碼功能來自框架要求時,不要測, 因為專案若能順利執行就代表沒有問題;例如 domain的property。 – 自訂函式或方法,必測。 – 同理,controller、service、custom tags都必測。 只要是有實作商業邏輯的部分,都要以已知的 需求進行測試。