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