摘要:事實上,的依賴包已經(jīng)包含了,因此準確地說,只用即可。這個文件的內(nèi)容初始是空的,表示全部使用的默認值。的自動刷新很久之前提到的依賴包終于派上用場了。修改任意文件后,按執(zhí)行,瀏覽器就會在編譯完成后自動刷新。
引言
說起用Java語言來搭建Web項目,那么最令人熟知,也應(yīng)用最廣的框架就是Spring MVC了。不過,Spring MVC的Web項目搭建起來并不是一件簡單的事,而如果你也像我這樣之前沒有接觸過Spring生態(tài)系統(tǒng),那多半會感覺到相當費勁。
時代是變化的,現(xiàn)在我們有了Spring Boot。
現(xiàn)代Java應(yīng)用Spring Boot是一個新的框架,但它并不生產(chǎn)新東西,而是作為一個統(tǒng)籌者,整理好Spring生態(tài)系統(tǒng)的一系列庫,方便你快速搭建基于Spring的項目。
相比傳統(tǒng)的Spring MVC,Spring Boot基本無需配置即可使用。這一點使得Spring Boot像許多腳本語言的簡潔框架(如PHP的Laravel,Node的Express)那樣親切友好。這就是現(xiàn)代Java 應(yīng)用。
用Spring Boot搭建Web項目接下來,本文將講述用Spring Boot搭建一個簡單Web項目的流程。
在本文的時間點,Spring Boot的推薦版本是1.4.0。
基本環(huán)境本文使用Java8(jdk1.8.0_60)。
Spring Boot需要搭配Maven或Gradle任一構(gòu)建工具使用。本文選擇Gradle,安裝版本為2.8。
Java項目需要搭配適當?shù)腎DE來開發(fā),本文使用IntelliJ IDEA。
初始目錄到官方提供的Spring Initializer,生成符合自己需要的項目初始目錄,比如我的情況:
一方面選擇Gradle Project,另一方面在Dependencies位置輸入并選擇所需的依賴模塊。這里選擇Web和Thymeleaf就足夠搭建一個簡單的Web項目。其中,Thymeleaf是Spring Boot常用的模板引擎。附加的DevTools如名所示,是Spring Boot的開發(fā)工具,它可以提供自動刷新等有用功能。
事實上,Spring Boot的Thymeleaf依賴包已經(jīng)包含了Web,因此準確地說,只用Thymeleaf即可。
創(chuàng)建項目使用生成的初始目錄,就可以創(chuàng)建好一個Spring Boot項目。在IntelliJ IDEA里選擇File→New→Project from Existing Sources...。
在打開的對話框里繼續(xù)選擇Import project from external model (Gradle)→Use default gradle wrapper (recommended)。
點擊Finish后,Gradle會立即運行,下載項目需要的依賴包。如果遇到錯誤,有可能是網(wǎng)絡(luò)狀況不佳,這時候可以考慮到File→Settings里找到HTTP Proxy一欄設(shè)置適當?shù)拇怼?/p>
新創(chuàng)建的項目可能還需要到File→Project Structure里設(shè)置正確的language level:
目錄結(jié)構(gòu)規(guī)劃現(xiàn)在可以開始在項目里寫東西了。參考官方的Code Structure建議,項目目錄可以是這樣(由初始目錄演變得到):
其中主應(yīng)用類(這里是SpringBootAcgtofeApplication.java)建議放在圖示位置,以符合Spring Boot的默認結(jié)構(gòu)要求,免除額外的配置需要。
視圖view創(chuàng)建一個簡單的視圖文件welcome.html:
spring boot for acgtofe Welcome to acgtofe!
放置于templates/welcome目錄下。
控制器controller參照前文的目錄結(jié)構(gòu)創(chuàng)建WelcomeController.java,它的代碼也很簡單:
@Controller @RequestMapping("/welcome") public class WelcomeController { @RequestMapping("") String index(){ return "welcome/welcome"; } }
@Controller標識這是一個controller類。@RequestMapping用于指定訪問路徑,也就是路由。
index()方法返回一個字符串welcome/welcome,意思是返回路徑templates/welcome/welcome.html的那個視圖。
不需要再做其他任何配置,基于Spring Boot的簡單Web項目到此就可以運行了。
啟動運行在IntelliJ IDEA里選擇Run→Edit Configurations。
在彈出的對話框里點擊左上的+選擇Spring Boot。然后,在右邊的Main class一欄點擊...按鈕選擇主應(yīng)用類:
點擊OK保存運行配置,最后選擇Run→Run(或Debug)運行應(yīng)用。此時控制臺里可以看到Spring Boot的banner:
打開瀏覽器,訪問localhost:8080/welcome,就可以看到剛才的視圖頁:
到此,一個簡單的Web項目就完成了。接下來,我們看看如何讓這個Web項目更豐富,更符合實際項目的需要。
改變默認配置在前面的流程中,盡可能使用了Spring Boot的默認配置,因此非常簡單。如果要改變Spring Boot項目的配置,就可以修改初始提供的位于resources下的application.properties。
這個文件的內(nèi)容初始是空的,表示全部使用Spring Boot的默認值。簡單按照.properties的內(nèi)容格式來添加內(nèi)容就可以了。下面是一些常用的例子。
端口號這段代碼將更改服務(wù)器啟動的端口為8001(默認8080):
server.port = 8001非嚴格的thymeleaf格式
你可能會發(fā)現(xiàn)在默認配置下,thymeleaf對.html的內(nèi)容要求很嚴格,比如,如果少最后的標簽封閉符號/,就會報錯而轉(zhuǎn)到錯誤頁。也比如你在使用Vue.js這樣的庫,然后有這樣的html代碼,也會被thymeleaf認為不符合要求而拋出錯誤。
因此,建議增加下面這段:
spring.thymeleaf.mode = LEGACYHTML5
spring.thymeleaf.mode的默認值是HTML5,其實是一個很嚴格的檢查,改為LEGACYHTML5可以得到一個可能更友好親切的格式要求。
需要注意的是,LEGACYHTML5需要搭配一個額外的庫NekoHTML才可用。到項目根目錄的build.gradle文件里這樣添加它到dependencies:
compile("net.sourceforge.nekohtml:nekohtml:1.9.22")
然后運行一次Gradle刷新(有任何Gradle改動,都應(yīng)該這樣運行一次):
最后重啟項目就可以感受到不那么嚴格的thymeleaf了。
YAML格式的配置相比.properties格式,可能YAML格式看起來條理更清晰,也更有層次感。Spring Boot本身就支持YAML格式的應(yīng)用配置文件,因此,你可以創(chuàng)建文件application.yml。
前面剛提到的兩項配置,寫成YAML是:
server: port: 8001 spring: thymeleaf: mode: LEGACYHTML5
應(yīng)用配置文件application.[yml|properties]除了初始位置,新建目錄resources/config來放置也比較常見。
配置參考完整的配置參考請見官方的Common application properties。
靜態(tài)資源css、js及圖片屬于靜態(tài)資源。在resources目錄下的以下幾個位置的靜態(tài)資源文件,都將在啟動服務(wù)后可以被直接訪問:
static
public
resources
META-INF/resources
數(shù)據(jù)傳遞與thymeleaf基礎(chǔ)用法如何把數(shù)據(jù)從controller傳遞到view呢?請看下面的例子。
model/Hoge.java:
public class Hoge { public int id; public String value; }
controller/WelcomeController.java:
@Controller @RequestMapping("/welcome") public class WelcomeController { @RequestMapping("") String index(Model model){ Hoge hoge = new Hoge(); hoge.id = 10; hoge.value = "hoge"; model.addAttribute("myData", hoge); return "welcome/welcome"; } }
templates/welcome/welcome.html:
spring boot for acgtofe id: mock id
value: mock value
這樣可以得到:
在視圖文件中使用thymeleaf,首先用xmlns:th為thymeleaf定義好名空間,然后以th:名空間的自定屬性,來使用thymeleaf的功能。
在這個例子中,th:text屬性表示標簽內(nèi)部的文本,它會輸出指定的值,替換掉原來的靜態(tài)文本。而${...}的表達式,可以用于指定th:text的值,以獲取controller傳遞過來的數(shù)據(jù)(通過model)。
插值技巧在前面的例子中,我們好像為了讓thymeleaf輸出數(shù)據(jù),額外增加了標簽。這個標簽不是必須的,因此我們可能不想要它。
thymeleaf有一個非常有用的屬性設(shè)置th:remove="tag"。比如現(xiàn)在有一個數(shù)據(jù)變量name的值是Rin,那么這段:
Hello, Alice!
將輸出為:
Hello, Rin!
是不是干凈了許多?
詳細的thymeleaf模板引擎的用法,請參考Using Thymeleaf。
thymeleaf視圖布局搭建一個Web站點常會面臨這樣一個問題:有很多不同的頁會有一些結(jié)構(gòu)或內(nèi)容是相同的,如何合理地管理它們以方便維護?
Thymeleaf Layout Dialect可以幫助我們應(yīng)對這個問題。spring-boot-starter-thymeleaf依賴包已經(jīng)包含了它,可以直接使用。
現(xiàn)在,我們有一系列視圖,它們都有頁眉(header),頁腳(footer),及公共的css(common.css)和js(common.js),而且網(wǎng)頁標題有相同的后綴。那么,可以新建一個布局視圖layout/default.html:
acgtofe public header page main content
可以看到,共用元素,包括內(nèi)的、
然后修改之前的視圖welcome/welcome.html如下:
welcome Welcome to acgtofe!
其中layout:decorator="layout/default"是一個關(guān)鍵的屬性標記,它的意思是按照繼承的風格,取layout/default.html視圖作為布局使用。
啟動應(yīng)用并訪問,可以看到結(jié)果是這樣:
thymeleaf-layout-dialect默認會像這樣為里的內(nèi)容進行合并,而里的內(nèi)容會按layout:fragment分別進行覆蓋。
屬性layout:title-pattern用于指定布局視圖的標題如何與頁面視圖的標題拼合在一起,這個例子也是用它實現(xiàn)了網(wǎng)頁標題的共同后綴。
你可以查看thymeleaf-layout-dialect的官方文檔了解更多的使用方法。
前端庫集成如果想要為項目添加jQuery、Bootstrap這樣的前端庫,可以使用WebJars。
例如,在build.gradle里添加這樣的依賴:
compile "org.webjars:jquery:3.1.0" compile "org.webjars:bootstrap:3.3.7"
運行Gradle刷新,然后就可以這樣在視圖文件里加入它們:
結(jié)合前面的布局視圖,就可以讓這些庫在任何地方都可用。
和Spring MVC有關(guān)的用法筆記Spring Boot的Web用的就是Spring MVC,因此Spring MVC的知識點在Spring Boot項目里是通用的。下面是一些常用功能。
返回一般數(shù)據(jù)的controller@RestController @RequestMapping("/hello") public class HelloController { @RequestMapping(method=RequestMethod.GET) public String getMethod() { return "get"; } @RequestMapping(value="/hey", method=RequestMethod.POST) public String postMethod2() { return "hey post"; } }
除了返回視圖,某些controller可能是用來返回一般數(shù)據(jù)(例如json格式數(shù)據(jù)),比較像API。@RestController標記的類就是一個API風格的controller,其內(nèi)部所有指定了訪問地址的方法,都將返回一般數(shù)據(jù)。一般來說,Ajax請求很適合和這樣的controller搭配。
如果在返回視圖的@Controller標記的類里也希望某單個方法返回一般數(shù)據(jù),在這個方法前一行多帶帶添加注解@ResponseBody即可。
@RequestMapping的value指定路徑,method指定HTTP訪問方法。
controller中獲取請求參數(shù)@RequestMapping可以在路徑里設(shè)置參數(shù),然后在方法中被取到:
@RestController @RequestMapping("/hello") public class HelloController { @RequestMapping(value="/{id}/{name}", method=RequestMethod.GET) public void getMethod(@PathVariable int id, @PathVariable String name) { System.out.println("id=" + id + ", name=" + name); } }
這樣@PathVariable搭配{...},就從路徑分別獲取了id和name兩個變量值。
此外, 一次請求的GET參數(shù)(位于URL的?后的內(nèi)容)或POST參數(shù)(作為請求的Request Body),都可以用request.getParameter()取到:
@RestController @RequestMapping("/hello") public class HelloController { @RequestMapping(method=RequestMethod.POST) public void getMethod(HttpServletRequest request) { System.out.println("userName=" + request.getParameter("userName")); } }
如果用Ajax向controller發(fā)送json字符串數(shù)據(jù),controller這邊獲取起來要麻煩一些,大致像下面這樣。
例如,Ajax發(fā)送的內(nèi)容是(注意需要指定內(nèi)容格式為json):
var person = { name: "Rin", age: 17 }, promise = $.ajax{ url: "/hello/submit", type: "POST", contentType: "application/json; charset=utf-8", data: JSON.stringify(person) };
然后接收的這邊需要先準備好一個同樣結(jié)構(gòu)的類,如Person.java:
public class Person { private String name; private int age; // getters & setters ... }
然后controller里用帶@RequestBody標記的參數(shù)就可以獲取到:
@RestController @RequestMapping("/hello") public class HelloController { @RequestMapping(value="/submit", method=RequestMethod.POST) public void submit(@RequestBody Person person) { System.out.println("person.name=" + person.getName()); } }
如果json數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類不能完全匹配,controller將返回415錯誤(不支持的媒體類型)。
DevTools的自動刷新很久之前提到的依賴包DevTools終于派上用場了。DevTools提供了自動刷新功能,可以讓開發(fā)更快捷。下面是結(jié)合IntelliJ IDEA的使用流程:
在應(yīng)用配置文件內(nèi)設(shè)置spring.devtools.livereload.enabled的值為true:
spring.devtools.livereload.enabled = true
接下來,為瀏覽器安裝LiveReload插件,比如Chrome的情況:
然后運行項目,并在瀏覽器中確認LiveReload插件為運行狀態(tài)(單擊一下即可在運行狀態(tài)與停止狀態(tài)之間切換)。
修改任意文件后,按ctrl + F9執(zhí)行Make Project,瀏覽器就會在編譯完成后自動刷新。
結(jié)語一路寫下來,發(fā)現(xiàn)篇幅意外地長,不過這也總算是有一點“手冊”的味道。如果你有考慮過Java語言來快速開發(fā)Web應(yīng)用,相信本文和Spring Boot都會對你有所幫助。
(重新編輯自我的博客,原文地址:http://acgtofe.com/posts/2016...)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65088.html
摘要:因為某些原因,不方便在這里直接發(fā)送百度鏈接,關(guān)注我的微信公眾號面試通關(guān)手冊回復(fù)資源分享第一波即可領(lǐng)取。然后大家還有什么問題的話,可以在我的微信公眾號后臺面試通關(guān)手冊給我說或者加我微信,我會根據(jù)自己的學習經(jīng)驗給了說一下自己的看法。 這是一篇針對Java初學者,或者說在Java學習路線上出了一些問題(不知道該學什么、不知道整體的學習路線是什么樣的) 第一步:Java基礎(chǔ)(一個月左右) 推薦...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:為什么我會說它們是一樣的簡單思考一下我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發(fā)與架構(gòu)。一方案調(diào)研版本選擇當前主流版本是和應(yīng)用的后臺運行配置后端掘金醬油一篇,整理一下關(guān)于后臺運行的一些配置方式。 分享 50 個完整的 React Native 項目 - 掘金本文為 Marno 原創(chuàng),轉(zhuǎn)載必須保留出處! 公眾號 aMarno,關(guān)注后回復(fù) RN 加入交流群 簡書專題《 Rea...
閱讀 1588·2019-08-30 13:18
閱讀 1578·2019-08-29 12:19
閱讀 2094·2019-08-26 13:57
閱讀 4137·2019-08-26 13:22
閱讀 1179·2019-08-26 10:35
閱讀 2991·2019-08-23 18:09
閱讀 2500·2019-08-23 17:19
閱讀 677·2019-08-23 17:18