SpringBoot:結合 SpringBoot 與 Grails 3
Grails一直都是構建於Spring、Groovy、Hibernate和其他巨人肩膀之上的高階框架。到了
Grails 3
,
Grails
已經基於
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.gradle
和
gradle.properties
)。src目錄裡還有一個標準的Gradle專案結構,但是
grails-app
應該是裡面最有趣的目錄。如果用過老版本的Grails,你就會知道這個目錄的作用。這裡面放的是你寫的控制器、領域類和其他構成Grails專案的程式碼。
如果再深挖一下,開啟
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
就算一行程式碼都還沒寫,我們也能執行應用程式,在瀏覽器裡進行訪問。一旦應用程式啟動,就可以在瀏覽器裡訪問。你應該能看到類似下圖的頁面。
在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的外觀了,執行效果如下圖所示。
雖然Grails風格比之前用的簡單的樣式表更吸引眼球。但很顯然的是,要讓閱讀列表應用程式更好看,還有一些工作要做。首先要讓應用程式和Grails不那麼像,和我們的想象更接近一點。 修改應用程式的樣式表在本書的討論範圍之外,但如果你對樣式微調感興趣,可以在
grails-app/assets/stylesheets
目錄裡找到樣式表檔案。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2765137/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringBoot與mongodb的結合Spring BootMongoDB
- SpringBoot與單元測試JUnit的結合Spring Boot
- SpringBoot基礎教程(十六)——與docker的結合Spring BootDocker
- flutter+Springboot的結合FlutterSpring Boot
- SpringBoot--SpringBoot 讀取Properties檔案(結合JDBC)Spring BootJDBC
- springboot結合Redis實現工具類Spring BootRedis
- springboot 結合jackson資料脫敏Spring Boot
- 【SpringBoot】結合Redis實現快取Spring BootRedis快取
- ES[7.6.x]學習筆記(十一)與SpringBoot結合筆記Spring Boot
- Redis 結合 Docker 搭建叢集,並整合SpringBootRedisDockerSpring Boot
- 關於SpringBoot結合mybatis後遇到的坑Spring BootMyBatis
- SpringBoot整合Mybatis-Plus(SpringBoot3)Spring BootMyBatis
- springboot3+vue3(十)springboot屬性配置方式Spring BootVue
- springboot3+vue3(十一)springboot多環境開發Spring BootVue
- Redis 結合 Docker 搭建哨兵+主從,並整合SpringBootRedisDockerSpring Boot
- springboot3/14Spring Boot
- SpringBoot獲取HttpServletRequest的3種方式總結Spring BootHTTPServlet
- SpringBoot原始碼學習3——SpringBoot啟動流程Spring Boot原始碼
- springboot結合rocketmq的使用以及遇到的問題Spring BootMQ
- Springboot 多資料來源配置,結合tk-mybatisSpring BootMyBatis
- 3 springboot配置檔案Spring Boot
- springboot3接入nacosSpring Boot
- SpringBoot_3_integrate_SecuritySpring Boot
- Grails中如何繫結引數AI
- SpringBoot 與 Kotlin 完美交融Spring BootKotlin
- SpringBoot(16)—@ConditionalOnBean與@ConditionalOnClassSpring BootBean
- SpringBoot3.x使用DruidSpring BootUI
- SpringBoot 結合官網對MQTT訊息佇列整合記錄Spring BootMQQT佇列
- springboot使用問題總結Spring Boot
- SpringBoot的個人總結Spring Boot
- SpringBoot啟動流程總結Spring Boot
- SpringBoot基礎實戰系列(二)springboot解析json與HttpMessageConverterSpring BootJSONHTTP
- _002_SpringBoot_SpringBoot四大核心與開發環境Spring Boot開發環境
- springboot3+vue3(九)打包部署(windows)Spring BootVueWindows
- SpringBoot CLI安裝與使用Spring Boot
- 【SpringBoot】@Configration與@Bean的使用Spring BootBean
- SpringBoot(19)---SpringBoot整合ApolloSpring Boot
- SpringBoot(17)---SpringBoot整合RocketMQSpring BootMQ