SpringBoot:結合 SpringBoot 與 Grails 3

無敵天驕發表於2021-03-26

Grails一直都是構建於Spring、Groovy、Hibernate和其他巨人肩膀之上的高階框架。到了 Grails 3Grails已經基於 Spring Boot,帶來了令人愉悅的開發體驗。 Grails開發者和 Spring Boot開發者都能駕輕就熟。

要使用 Grails 3,首先要進行安裝。在Mac OS X和大部分Unix系統上,最簡單的安裝方法是在命令列裡使用 SDKMAN

$ sdk install grails

如果你用的是Windows,或者無法使用SDKMAN,就需要下載二進位制釋出包。解壓後要將bin 目錄新增到系統路徑裡去。

無論用哪種安裝方式,你都可以在命令列中檢視Grails的版本,驗證安裝是否成功:

$ grails -version

如果安裝成功,現在就可以建立Grails專案了。

一、建立新的 Grails 專案

在Grails專案中,你會使用grails命令列工具執行很多工,包括建立專案。要建立閱讀列表專案,可以這樣使用grails命令:

$ grails create-app readinglist

正如這個命令的名字所示, create-app建立了新的應用程式專案。這個例子裡的專案名為  readinglist

等grails工具建立完應用程式,cd到了 readinglist目錄裡,看看所建立的內容吧。下圖應該就是你看到的專案結構的概覽。

在這個專案目錄結構裡,你應該認出了一些熟悉的東西。這裡有一個Gradle的構建說明檔案和配置( build.gradlegradle.properties)。src目錄裡還有一個標準的Gradle專案結構,但是 grails-app應該是裡面最有趣的目錄。如果用過老版本的Grails,你就會知道這個目錄的作用。這裡面放的是你寫的控制器、領域類和其他構成Grails專案的程式碼。

SpringBoot:結合 SpringBoot 與 Grails 3

如果再深挖一下,開啟 build.gradle檔案,會發現一些更熟悉的東西。首先,構建說明檔案裡使用了 Spring Boot的Gradle外掛:

apply plugin: "spring-boot"

這意味著你能像使用其他Spring Boot應用程式那樣構建並執行這個Grails應用程式。

你還應該注意到,依賴裡有不少有用的Spring Boot庫:

dependencies { 
 compile 'org.springframework.boot:spring-boot-starter-logging' 
 compile("org.springframework.boot:spring-boot-starter-actuator") 
 compile "org.springframework.boot:spring-boot-autoconfigure" 
 compile "org.springframework.boot:spring-boot-starter-tomcat" 
 ... 
}

這些庫為Grails應用程式提供了Spring Boot的自動配置、日誌,還有 Actuator及嵌入式 Tomcat。 把應用當作可執行JAR執行時,這個Tomcat可以提供服務。

實際上,這是一個Spring Boot專案,同時也是Grails專案,因為Grails 3就是構建在Spring Boot 的基礎上的。

執行應用程式

執行Grails應用程式最直接的方式是在命令列裡使用grails工具的 run-app命令:

$ grails run-app

就算一行程式碼都還沒寫,我們也能執行應用程式,在瀏覽器裡進行訪問。一旦應用程式啟動,就可以在瀏覽器裡訪問。你應該能看到類似下圖的頁面。

SpringBoot:結合 SpringBoot 與 Grails 3

在Grails裡執行應用程式要使用 run-app命令,這種方式已經用了很多年,上個版本的Grails也是這樣。Grails 3專案的Gradle說明裡使用了Spring Boot的Gradle外掛,你還可以用各種執行Spring Boot專案的方式來執行這個應用程式。此處透過Gradle引入了 bootRun任務:

$ gradle bootRun

你還可以構建專案,執行生成的可執行JAR檔案:

$ gradle build ... $ java -jar build/lib/readingList-0.1.jar

當然,構建產生的WAR檔案可以部署到你喜歡的各種Servlet 3.0容器裡。

在開發早期就能執行應用程式,這一點十分方便,能幫你確認應用程式已正確初始化。但是這時應用程式還沒做什麼有意思的事情,在初始化後的專案上做什麼完全取決於我們。接下來,開始定義領域模型吧。

二、定義領域模型

閱讀列表應用程式裡的核心領域模型是Book類。雖然我們可以手工建立 Book.groovy檔案,但通常還是用grails工具來建立領域模型類比較好。因為它知道該把檔案放到哪裡,並且能在同一時間生成各種相關內容。

要建立Book類,我們會使用grails工具的 create-domain-class命令:

$ grails create-domain-class Book

這條命令會生成兩個原始檔:一個 Book.groovy檔案和一個 BookSpec.groovy檔案。後者是一個 Spock說明,用來測試Book類。一開始這個檔案是空的,你可以填入各種測試內容來驗證Book的各種功能。

Book.groovy檔案裡定義了Book類,你可以在 grails-app/domain/readingList裡找到這個檔案。它一開始基本沒什麼內容:

package readinglist class Book { 
 static constraints = { 
 } 
}

我們需要新增一些欄位來定義一本書,比如書名、作者和ISBN。在新增了這些欄位後, Book.groovy看起來是這樣的:

package readinglist class Book { 
 static constraints = { 
 }
 String reader 
 String isbn 
 String title 
 String author 
 String description 
}

靜態的 constraints變數裡可以定義各種附加在Book例項上的驗證約束。本章中,我們主要 關注閱讀列表應用程式的構建,看看如何基於Spring Boot構建應用程式,不會太關注驗證的問題。 因此,這裡的 constraints內容為空。當然,如果有需要的話,你可以隨意新增約束。可以參考 一下 Grails in Action Second Edition,作者是Glen Smith和Peter Ledbrook。

為了使用Grails,我們要保持閱讀列表應用程式的簡潔,要和之前寫的程式一致。因此,接下來我們要建立Reader領域模型,還有控制器。

三、開發 Grails 控制器

有了領域模型,透過grails工具建立出控制器就很容易了。關於控制器,有幾個命令可供選擇。

  • create-controller:建立空控制器,讓開發者來編寫控制器的功能。
  • generate-controller:生成一個控制器,其中包含特定領域模型類的基本CRUD操作。
  • generate-all:生成針對特定領域模型類的基本CRUD控制器,及其檢視。

腳手架控制器很好用,也是Grails中比較知名的特性,但我們仍然會保持簡潔,寫一個僅包含必要功能的控制器,能匹配之前寫的應用程式功能就好。因此,我們用 create-controller命令來建立原始的控制器,然後填入所需的方法。

$ grails create-controller ReadingList

這個命令會在 grails-app/controllers/readingList裡建立一個名為 ReadingListController的控制器:

package readinglist class ReadingListController { 
 def index() { 
 } 
}

一行程式碼都不用改,這個控制器就能執行了,雖然它幹不成什麼事。此時,它能處理發往  /readingList的請求,將請求轉給 grails-app/views/readingList/index.gsp裡定義的檢視(現在還沒有,我們稍後會建立的)。

我們需要控制器來顯示圖書列表,還有新增新書的表單。我們還需要提交表單,將新書儲存到資料庫裡的功能。下面的程式碼就是我們所需要的 ReadingListController

package readinglist import static org.springframework.http.HttpStatus.* import grails.transaction.Transactional class ReadingListController { 
 def index() { 
 respond Book.list(params), model:[book: new Book()] 
 } 
 @Transactional 
 def save(Book book) { 
 book.reader = 'Craig' 
 book.save flush:true
 redirect(action: "index") 
 } }

雖然相比等效的Java控制器,程式碼長度大幅縮短,但這個版本的 ReadingListController功能已經基本完整。它可以處理發往 /readingList的GET請求,獲取並展示圖書列表。在表單提交後,它還會處理POST請求,儲存圖書,隨後重定向回index動作(由 index()方法來處理)。

太不可思議了,我們已經基本完成了Grails版本的閱讀列表應用程式。剩下的就是建立一個檢視,顯示圖書列表和表單。

四、建立檢視

Grails應用程式通常都用GSP模板來做檢視。

我們要做的是,利用Grails提供的佈局設施,將公共的設計風格運用到整個應用程式裡。

<!DOCTYPE html> <html> 
 <head> 
 <meta name="layout" content="main"/>
 <title>Reading List</title> 
 <link rel="stylesheet" 
 href="/assets/main.css?compile=false" /> 
 <link rel="stylesheet" 
 href="/assets/mobile.css?compile=false" /> 
 <link rel="stylesheet" 
 href="/assets/application.css?compile=false" /> 
 </head> <body>
 <h2>Your Reading List</h2> 
 <g:if test="${bookList && !bookList.isEmpty()}"> 
 <g:each in="${bookList}" var="book"> 
 <dl> 
 <dt class="bookHeadline"> 
 ${book.title}</span> by ${book.author} 
 (ISBN: ${book.isbn}") 
 </dt> 
 <dd class="bookDescription"> 
 <g:if test="${book.description}"> 
 ${book.description} 
 </g:if> 
 <g:else> 
 No description available 
 </g:else> 
 </dd> 
 </dl> 
 </g:each> 
 </g:if> 
 <g:else> 
 <p>You have no books in your book list</p> 
 </g:else> 
 <hr/> 
 <h3>Add a book</h3> 
 <g:form action="save">
 <fieldset class="form"> 
 <label for="title">Title:</label> 
 <g:field type="text" name="title" value="${book?.title}"/><br/> 
 <label for="author">Author:</label> 
 <g:field type="text" name="author" 
 value="${book?.author}"/><br/> 
 <label for="isbn">ISBN:</label> 
 <g:field type="text" name="isbn" value="${book?.isbn}"/><br/> 
 <label for="description">Description:</label><br/> 
 <g:textArea name="description" value="${book?.description}" 
 rows="5" cols="80"/> 
 </fieldset> 
 <fieldset class="buttons"> 
 <g:submitButton name="create" class="save" 
 value="${message(code: 'default.button.create.label', 
 default: 'Create')}" /> 
 </fieldset> 
 </g:form> 
 </body> </html>

<head>元素裡移除了引用樣式表的 <link>標籤。這裡放了一個 <meta>標籤,引入了Grails 應用程式的 main佈局。這樣一來,應用程式就能用上Grails的外觀了,執行效果如下圖所示。

SpringBoot:結合 SpringBoot 與 Grails 3

雖然Grails風格比之前用的簡單的樣式表更吸引眼球。但很顯然的是,要讓閱讀列表應用程式更好看,還有一些工作要做。首先要讓應用程式和Grails不那麼像,和我們的想象更接近一點。 修改應用程式的樣式表在本書的討論範圍之外,但如果你對樣式微調感興趣,可以在 grails-app/assets/stylesheets目錄裡找到樣式表檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2765137/,如需轉載,請註明出處,否則將追究法律責任。

相關文章