精通Spring MVC 4(通過學(xué)習(xí)Spring MVC框架達(dá)到設(shè)計(jì)真是Web應(yīng)用的專業(yè)水準(zhǔn))_第1頁
精通Spring MVC 4(通過學(xué)習(xí)Spring MVC框架達(dá)到設(shè)計(jì)真是Web應(yīng)用的專業(yè)水準(zhǔn))_第2頁
精通Spring MVC 4(通過學(xué)習(xí)Spring MVC框架達(dá)到設(shè)計(jì)真是Web應(yīng)用的專業(yè)水準(zhǔn))_第3頁
精通Spring MVC 4(通過學(xué)習(xí)Spring MVC框架達(dá)到設(shè)計(jì)真是Web應(yīng)用的專業(yè)水準(zhǔn))_第4頁
精通Spring MVC 4(通過學(xué)習(xí)Spring MVC框架達(dá)到設(shè)計(jì)真是Web應(yīng)用的專業(yè)水準(zhǔn))_第5頁
已閱讀5頁,還剩238頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

精通SpringMVC4通過學(xué)習(xí)SpringMVC框架達(dá)到設(shè)計(jì)真是Web應(yīng)用的專業(yè)水準(zhǔn)注:因內(nèi)容過長(zhǎng)上傳受限制,本文檔只顯示部分內(nèi)容,完整版文檔請(qǐng)下載此文檔后留言謝謝。目錄\h第1章快速搭建SpringWeb應(yīng)用\h1.1SpringToolSuite簡(jiǎn)介\h1.2IntelliJ簡(jiǎn)介\h1.3start.Spring.io簡(jiǎn)介\h1.4命令行方式簡(jiǎn)介\h1.5那就正式開始吧\h1.5.1Gradle構(gòu)建\h1.5.2讓我們看一下代碼\h1.6幕后的SpringBoot\h1.6.1分發(fā)器和multipart配置\h1.6.2視圖解析器、靜態(tài)資源以及區(qū)域配置\h1.7錯(cuò)誤與轉(zhuǎn)碼配置\h1.8嵌入式Servlet容器(Tomcat)的配置\h1.8.1HTTP端口\h1.8.2SSL配置\h1.8.3其他配置\h1.9小結(jié)\h第2章精通MVC架構(gòu)\h2.1MVC架構(gòu)\h2.2對(duì)MVC的質(zhì)疑及其最佳實(shí)踐\h2.2.1貧血的領(lǐng)域模型\h2.2.2從源碼中學(xué)習(xí)\h2.3SpringMVC1-0-1\h2.4使用Thymeleaf\h第一個(gè)頁面\h2.5SpringMVC架構(gòu)\h2.5.1DispatcherServlet\h2.5.2將數(shù)據(jù)傳遞給視圖\h2.6Spring表達(dá)式語言\h從請(qǐng)求參數(shù)中獲取數(shù)據(jù)\h2.7結(jié)束HelloWorld,開始獲取Tweet\h2.7.1注冊(cè)應(yīng)用\h2.7.2搭建SpringSocialTwitter\h2.7.3訪問Twitter\h2.8Java8的流和lambda表達(dá)式\h2.9使用WebJars實(shí)現(xiàn)質(zhì)感設(shè)計(jì)\h2.9.1使用布局\h2.9.2導(dǎo)航\h2.10檢查點(diǎn)\h2.11小結(jié)\h第3章處理表單和復(fù)雜的URL映射\h3.1基本信息頁——表單\h3.2校驗(yàn)\h3.2.1自定義校驗(yàn)信息\h3.2.2用于校驗(yàn)的自定義注解\h3.3國(guó)際化\h3.3.1修改地域\h3.3.2翻譯應(yīng)用的文本\h3.3.3表單中的列表\h3.4客戶端校驗(yàn)\h3.5檢查點(diǎn)\h3.6小結(jié)\h第4章文件上傳與錯(cuò)誤處理\h4.1上傳文件\h4.1.1將圖片寫入到響應(yīng)中\(zhòng)h4.1.2管理上傳屬性\h4.1.3展現(xiàn)上傳的圖片\h4.1.4處理文件上傳的錯(cuò)誤\h4.2轉(zhuǎn)換錯(cuò)誤信息\h4.3將基本信息放到會(huì)話中\(zhòng)h4.4自定義錯(cuò)誤頁面\h4.5使用矩陣變量進(jìn)行URL映射\h4.6將其組合起來\h4.7檢查點(diǎn)\h4.8小結(jié)\h第5章創(chuàng)建RESTful應(yīng)用\h5.1什么是REST\h5.2Richardson的成熟度模型\h5.2.1第0級(jí)——HTTP\h5.2.2第1級(jí)——資源\h5.2.3第2級(jí)——HTTP動(dòng)作\h5.2.4第3級(jí)——超媒體控制\h5.3API版本化\h5.4有用的HTTP代碼\h5.5客戶端為王\h5.6調(diào)試RESTfulAPI\h5.6.1JSON格式化擴(kuò)展\h5.6.2瀏覽器中的RESTful客戶端\h5.6.3httpie\h5.7自定義JSON輸出\h5.8用戶管理API\h5.9狀態(tài)碼與異常處理\h5.9.1帶有狀態(tài)碼的ResponseEntity\h5.9.2使用異常來處理狀態(tài)碼\h5.10通過Swagger實(shí)現(xiàn)文檔化\h5.11生成XML\h5.12檢查點(diǎn)\h5.13小結(jié)\h第6章保護(hù)應(yīng)用\h6.1基本認(rèn)證\h6.1.1用戶授權(quán)\h6.1.2URL授權(quán)\h6.1.3Thymeleaf安全標(biāo)簽\h6.2登錄表單\h6.3Twitter認(rèn)證\h6.3.1搭建社交認(rèn)證環(huán)境\h6.3.2詳解\h6.4分布式會(huì)話\h6.5SSL\h6.5.1生成自簽名的證書\h6.5.2單一模式\h6.5.3雙通道模式\h6.5.4置于安全的服務(wù)器之后\h6.6檢查點(diǎn)\h6.7小結(jié)\h第7章單元測(cè)試與驗(yàn)收測(cè)試\h7.1為什么要測(cè)試我的代碼\h7.2該如何測(cè)試自己的代碼\h7.3測(cè)試驅(qū)動(dòng)開發(fā)\h7.4單元測(cè)試\h7.4.1完后工作的趁手工具\(yùn)h7.5驗(yàn)收測(cè)試\h7.6第一個(gè)單元測(cè)試\h7.7Mock與Stub\h7.7.1使用Mockito進(jìn)行mock\h7.7.2在測(cè)試時(shí)Stubbean\h7.7.3該使用Mock還是Stub\h7.8對(duì)REST控制器進(jìn)行單元測(cè)試\h7.9測(cè)試認(rèn)證\h7.10編寫驗(yàn)收測(cè)試\h7.10.1Gradle配置\h7.10.2第一個(gè)FluentLenium測(cè)試\h7.10.3使用FluentLenium創(chuàng)建頁面對(duì)象\h7.10.4用Groovy實(shí)現(xiàn)測(cè)試\h7.10.5使用Spock進(jìn)行單元測(cè)試\h7.10.6使用Geb進(jìn)行集成測(cè)試\h7.10.7在Geb中使用頁面對(duì)象\h7.11檢查點(diǎn)\h7.12小結(jié)\h第8章優(yōu)化請(qǐng)求\h8.1生產(chǎn)環(huán)境的profile\h8.2Gzip\h8.3緩存控制\h8.4應(yīng)用緩存\h8.4.1緩存失效\h8.4.2分布式緩存\h8.5異步方法\h8.6ETag\h8.7WebSocket\h8.8檢查點(diǎn)\h8.9小結(jié)\h第9章將Web應(yīng)用部署到云中\(zhòng)h9.1選擇主機(jī)\h9.1.1CloudFoundry\h9.1.2OpenShift\h9.1.3Heroku\h9.2將Web應(yīng)用部署到PivotalWebServices中\(zhòng)h9.2.1安裝CloudFoundryCLI工具\(yùn)h9.2.2裝配應(yīng)用\h9.2.3激活Redis\h9.3將Web應(yīng)用部署到Heroku中\(zhòng)h9.3.1安裝工具\(yùn)h9.3.2搭建應(yīng)用\h9.3.3Herokuprofile\h9.3.4運(yùn)行應(yīng)用\h9.3.5激活Redis\h9.4改善應(yīng)用的功能\h9.5小結(jié)\h第10章超越SpringWeb\h10.1Spring生態(tài)系統(tǒng)\h10.1.1核心\h10.1.2執(zhí)行\(zhòng)h10.1.3數(shù)據(jù)\h10.1.4其他值得關(guān)注的項(xiàng)目\h10.2部署\hDocker\h10.3單頁面應(yīng)用\h10.3.1參與者\(yùn)h10.3.2未來的前景\h10.3.3實(shí)現(xiàn)無狀態(tài)\h10.4小結(jié)第1章快速搭建SpringWeb應(yīng)用在本章中,我們將會(huì)直接接觸代碼并搭建一個(gè)Web應(yīng)用,本書的其他章節(jié)將會(huì)基于該應(yīng)用進(jìn)行講解。在這里,我們將會(huì)使用SpringBoot的自動(dòng)配置功能來構(gòu)建應(yīng)用,這樣的話,就能完全避免使用樣板式的配置文件。本書將會(huì)從整體上介紹SpringBoot是如何運(yùn)行的以及該如何對(duì)其進(jìn)行配置,共有4種方式來開啟一個(gè)Spring項(xiàng)目:使用SpringToolSuite生成Starter代碼;使用IntelliJIDEA14.1,它對(duì)SpringBoot提供了良好的支持;借助Spring站點(diǎn),從\hhttp://start.Spring.io上下載可配置的ZIP文件;使用到\hhttp://start.Spring.io站點(diǎn)的curl命令來達(dá)到相同的效果。本書中將會(huì)使用Gradle和Java8,但是也不必為此感到擔(dān)心。如果你還在使用Maven和更早版本的Java的話,相信你會(huì)發(fā)現(xiàn)這些技術(shù)也是很易于使用的。很多官方的Spring教程同時(shí)提供了Gradle構(gòu)建和Maven構(gòu)建,因此,如果你決定繼續(xù)使用Maven的話,也能很容易地找到樣例。Spring4完全兼容Java8,如果你不采用Lambda表達(dá)式來簡(jiǎn)化代碼庫的話,那真的是很遺憾的事情。本書同時(shí)還會(huì)為你展示一些Git命令。筆者認(rèn)為,跟蹤工作進(jìn)展并在穩(wěn)定的狀態(tài)進(jìn)行提交是一件好事。另外,這樣還能很容易地將你的工作成果與本書提供的源碼進(jìn)行對(duì)比。本書第9章將借助Heroku部署我們的應(yīng)用,建議從一開始就使用Git對(duì)代碼進(jìn)行版本管理。在本章中,關(guān)于如何開始使用Git,我會(huì)給出一些建議。1.1SpringToolSuite簡(jiǎn)介如果要開始學(xué)習(xí)Spring并使用Spring社區(qū)所提供的指南和Starter項(xiàng)目的話,那么最好的起步方式之一就是下載SpringToolSuite(STS)。STS是一個(gè)自定義版本的Eclipse,它被用來與各種Spring項(xiàng)目進(jìn)行協(xié)作,它同時(shí)還包括Groovy和Gradle功能。即便如此,你可能像我一樣,還會(huì)使用其他的IDE,但是,我強(qiáng)烈建議你給STS一個(gè)機(jī)會(huì),因?yàn)樗ㄟ^“GettingStarted”項(xiàng)目,能夠讓你快速地了解Spring廣闊的生態(tài)系統(tǒng)。所以,你可以訪問\h//Spring.io/tools/sts/all,并下載STS的最新發(fā)布版。在生成第一個(gè)SpringBoot項(xiàng)目之前,首先需要安裝Gradle對(duì)STS的支持。在Dashboard中,可以看到“ManageIDEExtensions”按鈕,然后,需要在“Languageandframeworktooling”區(qū)域中選擇下載“GradleSupport”。還推薦你下載“GroovyEclipse”以及“Groovy2.4compiler”,如圖1-1所示,在本書的后文中,介紹使用geb構(gòu)建驗(yàn)收測(cè)試時(shí)會(huì)用到它們。圖1-1現(xiàn)在,在起步階段,提供兩種可選方案。下載示例代碼通過你的賬號(hào),可以在\h站點(diǎn)下載購買的所有Packt書籍的示例代碼文件。如果你通過其他途徑購買本書的話,那么可以訪問\h/support并進(jìn)行注冊(cè),這些文件就能通過Email直接發(fā)送給你了。也可以直接通過\h///Mastering-Spring-MVC-4/mastering-spring-mvc4下載本書的示例代碼。第一個(gè)方案是使用“File|New|SpringStarterProject”導(dǎo)航菜單,如圖1-2的截屏所示。這里的可選項(xiàng)是與\hhttp://start.Spring.io相同的,只不過嵌入到了IDE中。圖1-2通過使用頂部菜單中的“File|New|ImportGettingStartedContent”,我們可以看到\hhttp://spring.io上所有的可配置項(xiàng),這里可以選擇使用Gradle或Maven,如圖1-3所示??梢韵螺dStarter代碼,并按步驟學(xué)習(xí)本書中的內(nèi)容,也可以直接下載完整的代碼。圖1-3在“GettingStartedContent”中有很多有意思的內(nèi)容,建議讀者自行對(duì)其進(jìn)行一下探索。它闡述了如何將Spring與各種讀者可能感興趣的技術(shù)進(jìn)行集成。此時(shí),將會(huì)生成一個(gè)Web項(xiàng)目,如圖1-3所示,這是一個(gè)Gradle應(yīng)用,會(huì)生成JAR文件并使用Java8。表1-1是我們想要使用的配置。表1-1屬性值NamemasterSpringMvcTypeGradleprojectPackagingJarJavaversion1.8LanguageJavaGroupmasterSpringMvcArtifactmasterSpringMvcVersion0.0.1-SNAPSHOTDescriptionBecreative!PackagemasterSpringMvc在第2個(gè)界面中,將會(huì)詢問你想要使用的SpringBoot版本以及想要添加進(jìn)工程的依賴。在編寫本書的時(shí)候,SpringBoot的最新版本是1.2.5,請(qǐng)確保你始終選擇最新的版本。當(dāng)你閱讀本書的時(shí)候,可以使用最新的快照版本。如果到那時(shí)SpringBoot1.3還沒有發(fā)布的話,那么你可以試一下快照版本。你可以參考\h//spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3來了解更多細(xì)節(jié)。在配置窗口的底部會(huì)有一些復(fù)選框,代表各種SpringBootstarter庫。它們是可以添加到構(gòu)建文件中的依賴項(xiàng),針對(duì)各種Spring項(xiàng)目,它們提供了自動(dòng)配置功能。現(xiàn)在只關(guān)心SpringMVC,所以只選中Web這個(gè)復(fù)選框。為Web應(yīng)用生成一個(gè)JAR文件?將Web應(yīng)用打包為JAR文件,這一點(diǎn)你們可能會(huì)覺得有些詭異。盡管仍然可以將其打包為WAR,但這并不是推薦的實(shí)踐。在默認(rèn)情況下,SpringBoot將會(huì)創(chuàng)建一個(gè)胖JAR包(fatJAR),這個(gè)JAR包中包含了應(yīng)用所有的依賴,提供了通過“java-jar”命令便捷啟動(dòng)Web應(yīng)用的方法。我們的應(yīng)用將會(huì)打包為JAR文件,如果你想創(chuàng)建WAR文件的話,可以參考\hhttp://spring.io/guides/gs/convert-jar-to-war/。你點(diǎn)擊了“Finish”按鈕了嗎?如果已經(jīng)點(diǎn)擊了的話,將會(huì)得到如圖1-4所示的項(xiàng)目結(jié)構(gòu)。圖1-4可以看到主類MasterSpringMvcApplication及其測(cè)試類MasterSpringMvcApplicationTests,還可以看到兩個(gè)空的文件夾——static和templates,它們分別用來存放靜態(tài)Web資源(圖片、樣式文件等)和模板(jsp、freemarker或Thymeleaf)。最后一個(gè)文件是空的perties,它是SpringBoot默認(rèn)的配置文件。這是一個(gè)很便利的文件,在本章中,將會(huì)看到SpringBoot如何使用它。對(duì)于構(gòu)建文件build.gradle,稍后將會(huì)詳細(xì)介紹。如果你覺得已經(jīng)準(zhǔn)備就緒,那么運(yùn)行應(yīng)用的主方法,這樣就能會(huì)啟動(dòng)一個(gè)Web服務(wù)器。要做到這一點(diǎn),切換至應(yīng)用的主方法,然后右鍵點(diǎn)擊該類,并在工具欄中導(dǎo)航至“Runas|SpringApplication”,或者點(diǎn)擊工具欄上綠色的Play按鈕。遵循上面的步驟,并導(dǎo)航至\hhttp://localhost:8080,此時(shí)會(huì)產(chǎn)生一個(gè)錯(cuò)誤,不必?fù)?dān)心,請(qǐng)繼續(xù)往下閱讀。接下來將為讀者展示如何不使用STS來生成相同的項(xiàng)目,然后再回過頭來看這些文件。1.2IntelliJ簡(jiǎn)介IntelliJIDEA是在Java開發(fā)人員中非常流行的一個(gè)工具。在過去的幾年中,因?yàn)檫@個(gè)很棒的編輯器,我非常心甘情愿地為Jetbrains支付了年費(fèi)。IntelliJ也有快速創(chuàng)建SpringBoot項(xiàng)目的方法。如圖1-5所示,進(jìn)入新建項(xiàng)目菜單,默認(rèn)的擇“SpringInitializr”項(xiàng)目。圖1-5這將會(huì)出現(xiàn)與STS相同的配置選項(xiàng),所以請(qǐng)參照之前的小節(jié)來了解詳細(xì)的配置。你可能需要將Gradle項(xiàng)目導(dǎo)入到IntelliJ之中。推薦你首先生成Gradle包裝器(參考1.5.1節(jié))。如果需要的話,通過再次打開項(xiàng)目的build.gradle文件,可以重新導(dǎo)入該項(xiàng)目。1.3start.Spring.io簡(jiǎn)介請(qǐng)導(dǎo)航至\hhttp://start.Spring.io站點(diǎn)來開始使用start.Spring.io,對(duì)于這個(gè)類似于Bootstrap的站點(diǎn),你可能會(huì)感到很熟悉。如果進(jìn)入上述的鏈接,那么看到的內(nèi)容會(huì)如圖1-6的截屏所示。圖1-6在這里所看到的配置選項(xiàng)與STS中是相同的,點(diǎn)擊“GenerateProject”按鈕后將會(huì)下載一個(gè)ZIP文件,這個(gè)文件中會(huì)包含我們的Stater項(xiàng)目。1.4命令行方式簡(jiǎn)介對(duì)于鐘情于控制臺(tái)的讀者來說,可以采用“curl\hhttp://start.Spring.io”的方式。采用這種方式的話,將會(huì)需要一些指令,幫助我們組織curl請(qǐng)求。例如,要生成與之前相同的項(xiàng)目,那么可以輸入如下的命令:

$curl

\hhttp://start.Spring.io/starter.tgz\

-dname=masterSpringMvc\

-ddependencies=web\

-dlanguage=java\

-dJavaVersion=1.8\

-dtype=gradle-project\

-dpackageName=masterSpringMvc\

-dpackaging=jar\

-dbaseDir=app|tar-xzvf-

%Total%Received%XferdAverageSpeedTimeTimeTime

Current

DloadUploadTotalSpentLeftSpeed

1001255100111910013610141230:00:010:00:01--:--:-

-1015

xapp/

xapp/src/

xapp/src/main/

xapp/src/main/Java/

xapp/src/main/Java/com/

xapp/src/main/Java/com/geowarin/

xapp/src/main/resources/

xapp/src/main/resources/static/

xapp/src/main/resources/templates/

xapp/src/test/

xapp/src/test/Java/

xapp/src/test/Java/com/

xapp/src/test/Java/com/geowarin/

xapp/build.Gradle

xapp/src/main/Java/com/geowarin/AppApplication.Java

xapp/src/main/resources/perties

xapp/src/test/Java/com/geowarin/AppApplicationTests.Java

現(xiàn)在,我們不離開控制臺(tái)就能開始使用Spring了,美夢(mèng)變成了現(xiàn)實(shí)??梢钥紤]為上述的命令創(chuàng)建一個(gè)別名(alias),這樣的話,就能快速地創(chuàng)建Spring項(xiàng)目的原型了。1.5那就正式開始吧現(xiàn)在Web應(yīng)用已經(jīng)準(zhǔn)備就緒,先看一下它是如何編寫的。在進(jìn)一步學(xué)習(xí)之前,我們可以將工作的成果保存到Git上。如果你還不了解Git的話,我推薦下面的兩個(gè)教程:\h//try.github.io,這是一個(gè)很好的交互式教程,可以引導(dǎo)你一步步地學(xué)習(xí)基礎(chǔ)的Git命令;\hhttp://pcottle.github.io/learnGitBranching,這是一個(gè)很棒的教程,它將Git以類似于樹形的結(jié)構(gòu)進(jìn)行了可視化,它同時(shí)展現(xiàn)了Git的基本和高級(jí)功能。安裝Git在Windows下,需要安裝Gitbash,這可以在\h//msysgit.github.io找到。在Mac下,如果你使用homebrew的話,很可能已經(jīng)安裝過Git了,否則的話,使用brewinstallgit命令來進(jìn)行安裝。如果有疑問的話,請(qǐng)查閱\h///book/en/v2/Getting-Started-Installing-Git上的文檔。如果要使用Git版本化我們的工作內(nèi)容,那么可以在控制臺(tái)中輸入如下的命令:

$cdapp

$gitinit

使用IntelliJ的話,要忽略自動(dòng)生成的文件,即“.idea”和“*.iml”。使用Eclipse的話,應(yīng)該將“.classpath”文件和“.settings”文件夾提交上去。不管是哪種情況,都要忽略“.gradle”文件夾和build文件夾。創(chuàng)建一個(gè)包含如下文本內(nèi)容的“.gitignore“文件:

#IntelliJprojectfiles

.idea

*.iml

#gradle

.gradle

build

現(xiàn)在,我們可以將其他文件添加到Git中:

$gitadd.

$gitcommit-m"Generatedwithcurlstart.Spring.io"

[master(root-commit)eded363]Generatedwithcurlstart.Spring.io

4fileschanged,75insertions(+)

createmode100644build.Gradle

createmode100644src/main/Java/com/geowarin/AppApplication.Java

createmode100644src/main/resources/perties

createmode100644src/test/Java/com/geowarin/AppApplicationTests.Java

1.5.1Gradle構(gòu)建如果你還不熟悉Gradle的話,那么可以將其視為Maven的繼任者,它是一個(gè)現(xiàn)代化的構(gòu)建工具。與Maven類似,它會(huì)使用約定,例如如何組織Java應(yīng)用的結(jié)構(gòu)。我們的源碼依然會(huì)放在“src/main/java”之中,Web應(yīng)用的代碼放到“src/main/webapp”之中,諸如此類。與Maven類似,我們可以使用Gradle插件來處理各種構(gòu)建任務(wù)。但是,Gradle真正的閃光點(diǎn)在于,它允許我們使用GroovyDSL編寫自己的構(gòu)建任務(wù)。默認(rèn)庫使得管理文件、聲明任務(wù)之間的依賴以及增量執(zhí)行job都變得非常容易。安裝Gradle如果你使用OSX的話,那么可以通過brewinstallgradle命令,借助brew來安裝Gradle。在任意的*NIX的系統(tǒng)下(包括Mac),都可以使用gvm(\h/)來進(jìn)行安裝。另外,也可以在\h//G/downloads下獲取二進(jìn)制分發(fā)包。使用Gradle創(chuàng)建應(yīng)用的第一個(gè)最佳實(shí)踐就是生成Gradle包裝器(wrapper)。Gradle包裝器是一個(gè)小的腳本,它能夠在你的代碼中進(jìn)行共享,從而確保會(huì)使用相同版本的Gradle來構(gòu)建你的應(yīng)用。生成包裝器的命令是gradlewrapper:

$gradlewrapper

:wrapper

BUILDSUCCESSFUL

Totaltime:6.699secs

如果我們看一下新創(chuàng)建的文件,可以看到有兩個(gè)腳本和兩個(gè)目錄:

$gitstatus-s

??.gradle/

??gradle/

??gradlew

??gradlew.bat

在“.gradle”目錄中包含了Gradle二進(jìn)制文件,我們不希望將其添加到版本控制之中。前面已經(jīng)忽略了這個(gè)文件和構(gòu)建目錄,所以可以安全地對(duì)其他內(nèi)容執(zhí)行g(shù)itadd操作:

$gitadd.

$gitcommit-m"AddedGradlewrapper"

gradle目錄包含了如何得到二進(jìn)制文件的信息。另外兩個(gè)文件是腳本:用于Windows的批處理腳本(gradlew.bat)以及用于其他系統(tǒng)的shell腳本。我們可以使用Gradle運(yùn)行應(yīng)用,替換借助IDE來執(zhí)行應(yīng)用的方式:

$./gradlewbootrun

執(zhí)行上面的命令將會(huì)運(yùn)行一個(gè)嵌入式的Tomcat,應(yīng)用會(huì)位于它里面!如圖1-7所示,日志提示服務(wù)器運(yùn)行在8080端口上,我們檢查一下。圖1-7可以想象到你內(nèi)心的失望,因?yàn)閼?yīng)用還沒有為完全公開做好準(zhǔn)備。換句話說,在工程中,這兩個(gè)文件所完成的工作內(nèi)容還是很讓人振奮的。我們來看一下。首先是Gradle構(gòu)建文件,也就是build.gradle:

buildscript{

ext{

springBootVersion='1.2.5.RELEASE'

}

repositories{

mavenCentral()

}

dependencies{

classpath("org.springframework.boot:spring-boot-gradle-

plugin:${springBootVersion}")

classpath("io.spring.gradle:dependency-management-

plugin:0.5.1.RELEASE")

}

}

applyplugin:'java'

applyplugin:'eclipse'

applyplugin:'idea'

applyplugin:'spring-boot'

applyplugin:'io.spring.dependency-management'

jar{

baseName='masterSpringMvc'

version='0.0.1-SNAPSHOT'

}

sourceCompatibility=1.8

targetCompatibility=1.8

repositories{

mavenCentral()

}

dependencies{

compile("org.springframework.boot:spring-boot-starter-web")

testCompile("org.springframework.boot:spring-boot-starter-test")

}

eclipse{

classpath{

containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')

containers'org.eclipse.jdt.launching.JRE_CONTAINER/org.

ernal.debug.ui.launcher.StandardVMType/JavaSE-1.8'

}

}

taskwrapper(type:Wrapper){

gradleVersion='2.3'

}

在這里,都看到了什么呢?對(duì)SpringBoot插件的依賴,它分布在Maven中央倉庫中。我們的項(xiàng)目是Java工程。Gradle可以為IntelliJ或Eclipse生成IDE工程文件。該應(yīng)用將會(huì)生成JAR文件。我們的項(xiàng)目的依賴是托管在Maven中央倉庫中的。類路徑在生產(chǎn)環(huán)境下包含spring-boot-starter-web,在測(cè)試環(huán)境中,還包含spring-boot-starter-test。針對(duì)Eclipse的一些額外配置。Gradle包裝器的版本是2.3。SpringBoot插件將會(huì)產(chǎn)生一個(gè)胖(fat)JAR文件,其中包含了項(xiàng)目的所有依賴。要構(gòu)建的話,只需輸入:

./gradlewbuild

我們將會(huì)在“build/libs”目錄下找到這個(gè)JAR文件。該目錄下會(huì)包含兩個(gè)文件,其中一個(gè)為胖JAR包,名為masterSpringMvc-0.0.1-SNAPSHOT.jar,另外一個(gè)是普通的JAR文件,名為masterSpringMvc-0.0.1-SNAPSHOT.jar.original,這個(gè)文件不包含任何的依賴??蛇\(yùn)行的JARSpringBoot主要的一個(gè)優(yōu)勢(shì)在于將應(yīng)用所需的所有內(nèi)容都放到一個(gè)易于重發(fā)布的JAR文件中,其中包含了Web服務(wù)器。如果你運(yùn)行javajarmasterSpringMvc-0.0.1-SNAPSHOT.jar的話,Tomcat將會(huì)在8080端口上啟動(dòng),就像在開發(fā)期一樣。如果要將其部署到生產(chǎn)環(huán)境或云中,這都是相當(dāng)便利的。在這里,主要的依賴是spring-boot-starter-web,SpringBoot提供了很多的Starter,它們會(huì)對(duì)應(yīng)用的很多方面進(jìn)行自動(dòng)化配置,這是通過提供典型的依賴和Spring配置來實(shí)現(xiàn)的。例如,spring-boot-starter-web將會(huì)包含對(duì)tomcat-embedded和SpringMVC的依賴。它會(huì)自動(dòng)運(yùn)行SpringMVC最為常用的配置并提供一個(gè)分發(fā)器(dispatcher),使其監(jiān)聽“/”根路徑,還會(huì)提供錯(cuò)誤處理頁面,就像之前所看到的404頁面那樣。除此之外,還有一個(gè)典型的視圖解析器(viewresolver)配置。稍后,我們將會(huì)看到更多的內(nèi)容,首先從下一節(jié)開始吧!1.5.2讓我們看一下代碼這里將會(huì)展現(xiàn)運(yùn)行應(yīng)用的所有代碼,它是一個(gè)經(jīng)典的main函數(shù),這種方式有很大的優(yōu)勢(shì),因?yàn)槲覀兛梢栽贗DE中像運(yùn)行其他程序那樣運(yùn)行這個(gè)應(yīng)用。我們可以對(duì)其進(jìn)行調(diào)試,并且不需要插件就能實(shí)現(xiàn)一些類的重新加載。在開發(fā)模式下,當(dāng)我們?cè)贓clipse中保存文件或者在IntelliJ中點(diǎn)擊“MakeProject”就會(huì)觸發(fā)重新加載的過程。只有JVM支持切換至新編譯版本的類文件時(shí),它才是可行的,如果修改靜態(tài)變量或配置文件的話,我們必須要重新加載應(yīng)用。主類如下所示:

packagemasterSpringMvc;

importorg.Springframework.boot.SpringApplication;

importorg.Springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

publicclassAppApplication{

publicstaticvoidmain(String[]args){

SpringApplication.run(AppApplication.class,args);

}

}

需要注意的是@SpringBootApplication注解,如果看一下這個(gè)注解的代碼的話,就會(huì)發(fā)現(xiàn)它實(shí)際上組合了3個(gè)其他的注解,也就是@Configuration、@EnableAutoConfiguration和@ComponentScan:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@Configuration

@EnableAutoConfiguration

@ComponentScan

public@interfaceSpringBootApplication{

/**

*Excludespecificauto-configurationclassessuchthattheywill

neverbeapplied.

*/

Class<?>[]exclude()default{};

}

如果你之前使用Java代碼配置過Spring應(yīng)用的話,那么你應(yīng)該對(duì)@Configuration非常熟悉。它表明我們的這個(gè)類將會(huì)處理Spring的常規(guī)配置,如bean的聲明。@ComponentScan也是一個(gè)比較經(jīng)典的注解,它會(huì)告訴Spring去哪里查找Spring組件(服務(wù)、控制器等)。在默認(rèn)情況下,這個(gè)注解將會(huì)掃描當(dāng)前包以及該包下面的所有子包。在這里,比較新穎的是@EnableAutoConfiguration注解,它會(huì)指導(dǎo)SpringBoot發(fā)揮其魔力。如果你將其移除掉的話,就無法從SpringBoot的自動(dòng)配置中收益了。使用SpringBoot來編寫MVC應(yīng)用的第一步通常是在代碼中添加控制器。將控制器放到controller子包中,這樣它就能夠被@ComponentScan注解所發(fā)現(xiàn):

packagemasterSpringMvc.controller;

importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.ResponseBody;

@Controller

publicclassHelloController{

@RequestMapping("/")

@ResponseBody

publicStringhello(){

return"Hello,world!";

}

}

現(xiàn)在,如果打開瀏覽器并訪問\hhttp://localhost:8080的話,就能看到我們鐘愛的“Hello,world!”被輸出了出來(見圖1-8)。圖1-81.6幕后的SpringBoot如果你之前搭建過SpringMVC應(yīng)用,那么可能已經(jīng)習(xí)慣于編寫相關(guān)的XML文件或Java注解配置類。一般來講,初始的步驟如下所示:1.初始化SpringMVC的DispatcherServlet;2.搭建轉(zhuǎn)碼過濾器,保證客戶端請(qǐng)求進(jìn)行正確地轉(zhuǎn)碼;3.搭建視圖解析器(viewresolver),告訴Spring去哪里查找視圖,以及它們是使用哪種方言編寫的(JSP、Thymeleaf模板等);4.配置靜態(tài)資源的位置(CSS、JS);5.配置所支持的地域以及資源bundle;6.配置multipart解析器,保證文件上傳能夠正常工作;7.將Tomcat或Jetty包含進(jìn)來,從而能夠在Web服務(wù)器上運(yùn)行我們的應(yīng)用;8.建立錯(cuò)誤頁面(如404)。不過,SpringBoot為我們處理了所有的事情。因?yàn)檫@些配置一般是與應(yīng)用相關(guān)的,所以你可以無限制地將它們進(jìn)行組合。在一定程度上來講,SpringBoot是帶有一定傾向性的Spring項(xiàng)目配置器。它基于約定,并且默認(rèn)會(huì)在你的項(xiàng)目中使用這些約定。1.6.1分發(fā)器和multipart配置接下來,讓我們看一下在幕后到底發(fā)生了什么。我們使用默認(rèn)生成的SpringBoot配置文件,并將其設(shè)置為debug模式。在src/main/resources/perties中添加下面這一行:

debug=true

現(xiàn)在,如果重新啟動(dòng)應(yīng)用的話,就能看到SpringBoot的自動(dòng)配置報(bào)告。它分為兩部分:一部分是匹配上的(positivematches),列出了應(yīng)用中,所有的自動(dòng)配置,另一部分是沒有匹配上的(negativematches),這部分是應(yīng)用在啟動(dòng)的時(shí)候,需求沒有滿足的SpringBoot自動(dòng)配置:

=========================

AUTO-CONFIGURATIONREPORT

=========================

Positivematches:

DispatcherServletAutoConfiguration

-@ConditionalOnClassclassesfound:org.Springframework.web.

servlet.DispatcherServlet(OnClassCondition)

-foundwebapplicationStandardServletEnvironment

(OnWebApplicationCondition)

EmbeddedServletContainerAutoConfiguration

-foundwebapplicationStandardServletEnvironment

(OnWebApplicationCondition)

ErrorMvcAutoConfiguration

-@ConditionalOnClassclassesfound:javax.servlet.Servlet,org.

springframework.web.servlet.DispatcherServlet(OnClassCondition)

-foundwebapplicationStandardServletEnvironment

(OnWebApplicationCondition)

HttpEncodingAutoConfiguration

-@ConditionalOnClassclassesfound:org.springframework.web.

filter.CharacterEncodingFilter(OnClassCondition)

-matched(OnPropertyCondition)

<Inputtrimmed>

仔細(xì)看一下DispatcherServletAutoConfiguration:

/**

*{@linkEnableAutoConfigurationAuto-configuration}fortheSpring

*{@linkDispatcherServlet}.Shouldworkforastandaloneapplication

whereanembedded

*servletcontainerisalreadypresentandalsoforadeployable

applicationusing

*{@linkSpringBootServletInitializer}.

*

*@authorPhillipWebb

*@authorDaveSyer

*/

@Order(Ordered.HIGHEST_PRECEDENCE)

@Configuration

@ConditionalOnWebApplication

@ConditionalOnClass(DispatcherServlet.class)

@AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class)

publicclassDispatcherServletAutoConfiguration{

/*

*ThebeannameforaDispatcherServletthatwillbemappedtothe

rootURL"/"

*/

publicstaticfinalStringDEFAULT_DISPATCHER_SERVLET_BEAN_NAME=

"dispatcherServlet";

/*

*ThebeannameforaServletRegistrationBeanforthe

DispatcherServlet"/"

*/

publicstaticfinalStringDEFAULT_DISPATCHER_SERVLET_

REGISTRATION_BEAN_NAME="dispatcherServletRegistration";

@Configuration

@Conditional(DefaultDispatcherServletCondition.class)

@ConditionalOnClass(ServletRegistration.class)

protectedstaticclassDispatcherServletConfiguration{

@Autowired

privateServerPropertiesserver;

@Autowired(required=false)

privateMultipartConfigElementmultipartConfig;

@Bean(name=DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)

publicDispatcherServletdispatcherServlet(){

returnnewDispatcherServlet();

}

@Bean(name=DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_

NAME)

publicServletRegistrationBeandispatcherServletRegistration()

{

ServletRegistrationBeanregistration=new

ServletRegistrationBean(

dispatcherServlet(),this.server.

getServletMapping());

registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_

NAME);

if(this.multipartConfig!=null){

registration.setMultipartConfig(this.multipartConfig);

}

returnregistration;

}

@Bean

@ConditionalOnBean(MultipartResolver.class)

@ConditionalOnMissingBean(name=DispatcherServlet.MULTIPART_

RESOLVER_BEAN_NAME)

publicMultipartResolvermultipartResolver(MultipartResolver

resolver){

//DetectiftheuserhascreatedaMultipartResolverbut

nameditincorrectly

returnresolver;

}

}

@Order(Ordered.LOWEST_PRECEDENCE-10)

privatestaticclassDefaultDispatcherServletConditionextends

SpringBootCondition{

@Override

publicConditionOutcomegetMatchOutcome(ConditionContext

context,

AnnotatedTypeMetadatametadata){

ConfigurableListableBeanFactorybeanFactory=context.

getBeanFactory();

ConditionOutcomeoutcome=checkServlets(beanFactory);

if(!outcome.isMatch()){

returnoutcome;

}

returncheckServletRegistrations(beanFactory);

}

}

}

這是一個(gè)典型的SpringBoot配置類。與其他的Spring配置類相同,它使用了@Configuration注解;一般會(huì)通過@Order注解來聲明優(yōu)先等級(jí),可以看到DispatcherServletAutoConfiguration需要優(yōu)先進(jìn)行配置;其中也可以包含一些提示信息,如@AutoConfigureAfter或@AutoConfigureBefore,從而進(jìn)一步細(xì)化配置處理的順序;它還支持在特定的條件下啟用某項(xiàng)功能。通過使用@ConditionalOnClass(DispatcherServlet.class)這個(gè)特殊的配置,能夠確保我們的類路徑下包含DispatcherServlet,這能夠很好地表明SpringMVC位于類路徑中,用戶當(dāng)前希望將其啟動(dòng)起來。這個(gè)文件中還包含了SpringMVC分發(fā)器Servlet和multipart解析器的典型配置。整個(gè)SpringMVC配置被拆分到了多個(gè)文件之中。另外,值得一提的是,這些bean會(huì)遵循特定的規(guī)則,以此來檢查是否處于激活狀態(tài)。在@Conditional(DefaultDispatcherServletCondition.class)條件滿足的情況下,ServletRegistrationBean函數(shù)才會(huì)啟用,這有些復(fù)雜,但是能夠檢查在你的配置中,是否已經(jīng)注冊(cè)了分發(fā)器Servlet。只有在滿足@ConditionalOnMissingBean(name=DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)條件的情況下,MultipartResolver函數(shù)才會(huì)處于激活狀態(tài),例如,當(dāng)我們自己還沒有注冊(cè)的時(shí)候。這意味著SpringBoot僅僅是基于常見的使用場(chǎng)景,幫助我們對(duì)應(yīng)用進(jìn)行配置。不過,可以在任意的地方覆蓋這些默認(rèn)值,并聲明自己的配置。因此,通過查看DispatcherServletAutoConfiguration,就了解了為什么我們已經(jīng)擁有了分發(fā)器Servlet和multipart解析器。1.6.2視圖解析器、靜態(tài)資源以及區(qū)域配置另外一個(gè)密切相關(guān)的配置是WebMvcAutoConfiguration,它聲明了視圖解析器、地域解析器(localeresolver)以及靜態(tài)資源的位置。視圖解析器如下所示:

@Configuration

@Import(EnableWebMvcConfiguration.class)

@EnableConfigurationProperties({WebMvcProperties.class,

ResourceProperties.class})

publicstaticclassWebMvcAutoConfigurationAdapterextends

WebMvcConfigurerAdapter{

@Value("${spring.view.prefix:}")

privateStringprefix="";

@Value("${spring.view.suffix:}")

privateStringsuffix="";

@Bean

@ConditionalOnMissingBean(InternalResourceViewResolver.class)

publicInternalResourceViewResolverdefaultViewResolver(){

InternalResourceViewResolverresolver=new

InternalResourceViewResolver();

resolver.setPrefix(this.prefix);

resolver.setSuffix(this.suffix);

returnresolver;

}

}

視圖解析器的配置并沒有什么特殊之處,這里真正有意思的是使用了配置屬性,從而允許用戶對(duì)其進(jìn)行自定義。它的意思就是說“將會(huì)在用戶的perties文件中查找兩個(gè)變量,這兩個(gè)變量的名字是spring.view.prefix和spring.view.suffix”。在配置中只需兩行代碼就能將視圖解析器搭建起來了,這是非常便利的。為了下一章內(nèi)容的講解,你需要牢記這一點(diǎn),不過,我們現(xiàn)在會(huì)繼續(xù)瀏覽SpringBoot的代碼。關(guān)于靜態(tài)資源,配置中包含了如下的內(nèi)容:

privatestaticfinalString[]CLASSPATH_RESOURCE_LOCATIONS={

"classpath:/META-INF/resources/","classpath:/resources/",

"classpath:/static/","classpath:/public/"};

privatestaticfinalString[]RESOURCE_LOCATIONS;

static{

RESOURCE_LOCATIONS=newString[CLASSPATH_RESOURCE_LOCATIONS.length

+SERVLET_RESOURCE_LOCATIONS.length];

System.arraycopy(SERVLET_RESOURCE_LOCATIONS,0,RESOURCE_LOCATIONS,

0,

SERVLET_RESOURCE_LOCATIONS.length);

System.arraycopy(CLASSPATH_RESOURCE_LOCATIONS,0,RESOURCE_

LOCATIONS,

SERVLET_RESOURCE_LOCATIONS.length,CLASSPATH_RESOURCE_LOCATIONS.

length);

}

@Override

publicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){

if(!this.resourceProperties.isAddMappings()){

logger.debug("Defaultresourcehandlingdisabled");

return;

}

IntegercachePeriod=this.resourceProperties.getCachePeriod();

if(!registry.hasMappingForPattern("/webjars/**")){

registry.addResourceHandler("/webjars/**")

.addResourceLocations("classpath:/META-INF/resources/

webjars/")

.setCachePeriod(cachePeriod);

}

if(!registry.hasMappingForPattern("/**")){

registry.addResourceHandler("/**")

.addResourceLocations(RESOURCE_LOCATIONS)

.setCachePeriod(cachePeriod);

}

}

資源位置的聲明有點(diǎn)復(fù)雜,但是通過它,我們可以了解到以下兩點(diǎn):對(duì)帶有“webjar”前綴的資源訪問將會(huì)在類路徑中解析。這樣的話,我們就能使用Mavan中央倉庫中預(yù)先打包好的JavaScript依賴;我們的靜態(tài)資源需要放在類路徑中,并且要位于以下4個(gè)目錄中的任意一個(gè)之中,“/META-INF/resources/”“/resources/”“/static/”或“/public/”。WebJars是JAR包格式的客戶端JavaScript庫,可以通過Maven中央倉庫來獲取。它們包含了Maven項(xiàng)目文件,這個(gè)文件允許定義傳遞性依賴,能夠用于所有基于JVM的應(yīng)用之中。WebJars是JavaScript包管理器的替代方案,如bower或npm。對(duì)于只需要較少JavaScript庫的應(yīng)用來說,這種方案是很棒的。你可以在站點(diǎn)上看到所有可用的WebJars列表。在這個(gè)文件中,還專門有一部分用來聲明地域管理:

@Bean

@ConditionalOnMissingBean(LocaleResolver.class)

@ConditionalOnProperty(prefix="spring.mvc",name="locale")

publicLocaleResolverlocaleResolver(){

returnnewFixedLocaleResolver(

StringUtils.parseLocaleString(this.mvcProperties.getLocale()));

}

默認(rèn)的地域解析器只會(huì)處理一個(gè)地域,并且允許我們通過spring.mvc.locale配置屬性來進(jìn)行定義。1.7錯(cuò)誤與轉(zhuǎn)碼配置還記得在沒有添加控制器的時(shí)候,第一次啟動(dòng)應(yīng)用嗎?當(dāng)時(shí)看到了一個(gè)有意思的“WhitelabelErrorPage”輸出。錯(cuò)誤處理要比看上去更麻煩一些,尤其是在沒有web.xml配置文件并且希望應(yīng)用能夠跨Web服務(wù)器部署時(shí)更是如此。好消息是SpringBoot將會(huì)處理這些事情!讓我們看一下ErrorMvcAutoConfiguration:

ConditionalOnClass({Servlet.class,DispatcherServlet.class})

@ConditionalOnWebApplication

//EnsurethisloadsbeforethemainWebMvcAutoConfigurationsothat

theerrorViewis

//available

@AutoConfigureBefore(WebMvcAutoConfiguration.class)

@Configuration

publicclassErrorMvcAutoConfigurationimplements

EmbeddedServletContainerCustomizer,

Ordered{

@Value("${error.path:/error}")

privateStringerrorPath="/error";

@Autowired

privateServerPropertiesproperties;

@Override

publicintgetOrder(){

return0;

}

@Bean

@ConditionalOnMissingBean(value=ErrorAttributes.class,search=

SearchStrategy.CURRENT)

publicDefaultErrorAttributeserrorAttributes(){

returnnewDefaultErrorAttributes();

}

@Bean

@ConditionalOnMissingBean(value=ErrorController.class,search=

SearchStrategy.CURRENT)

publicBasicErrorControllerbasicErrorController(ErrorAttributes

errorAttributes){

returnnewBasicErrorController(errorAttributes);

}

@Override

publicvoidcustomize(ConfigurableEmbeddedServletContainer

container){

container.addErrorPages(newErrorPage(perties.

getServletPrefix()

+this.errorPath));

}

@Configuration

@ConditionalOnProperty(prefix="error.whitelabel",name=

"enabled",matchIfMissing=true)

@Conditional(ErrorTemplateMissingCondition.class)

protectedstaticclassWhitelabelErrorViewConfiguration{

privatefinalSpelViewdefaultErrorView=newSpelView(

"<html><body><h1>WhitelabelErrorPage</h1>"

+"<p>Thisapplicationhasnoexplicitmapping

for/error,soyouareseeingthisasafallback.</p>"

+"<divid='created'>${timestamp}</div>"

+"<div>Therewasanunexpectederror

(type=${error},status=${status}).</div>"

+"<div>${message}</div></body></html>");

@Bean(name="error")

@ConditionalOnMissingBean(name="error")

publicViewdefaultErrorView(){

returnthis.defaultErrorView;

}

//Iftheuseradds@EnableWebMvcthenthebeannameview

resolverfrom

//WebMvcAutoConfigurationdisappears,soadditbackinto

avoiddisappointment.

@Bean

@ConditionalOnMissingBean(BeanNameViewResolver.class)

publicBeanNameViewResolverbeanNameViewResolver(){

BeanNameViewResolverresolver=new

BeanNameViewResolver();

resolver.setOrder(Ordered.LOWEST_PRECEDENCE-10);

returnresolver;

}

}

}

這段配置都做了些什么呢?定義了一個(gè)bean,即DefaultErrorAttributes,它通過特定的屬性暴露了有用的錯(cuò)誤信息,這些屬性包括狀態(tài)、錯(cuò)誤碼和相關(guān)的棧跟蹤信息。定義了一個(gè)BasicErrorControllerbean,這是一個(gè)MVC控制器,負(fù)責(zé)展現(xiàn)我們所看到的錯(cuò)誤頁面。允許我們將SpringBoot的whitelabel錯(cuò)誤頁面設(shè)置為無效,這需要將配置文件perties中的error.whitelable.enabled設(shè)置為false。我們還可以借助模板引擎提供自己的錯(cuò)誤頁面。例如,它的名字是error.html,ErrorTemplateMissingCondition條件會(huì)對(duì)此進(jìn)行檢查。在本書后面的內(nèi)容中,我們將會(huì)看到如何恰當(dāng)?shù)靥幚礤e(cuò)誤。至于轉(zhuǎn)碼的問題,非常簡(jiǎn)單的HttpEncodingAutoConfiguration將會(huì)負(fù)責(zé)處理相關(guān)的事宜,這是通過提供Spring的CharacterEncodingFilter類來實(shí)現(xiàn)的。通過spring.http.encoding.charset配置,我們可以覆蓋默認(rèn)的編碼(“UTF-8”),也可以通過spring.http.encoding.enabled禁用這項(xiàng)配置。1.8嵌入式Servlet容器(Tomcat)的配置默認(rèn)情況下,SpringBoot在打包和運(yùn)行應(yīng)用時(shí),會(huì)使用Tomcat嵌入式API(TomcatembeddedAPI)。我們來看一下EmbeddedServletContainerAutoConfiguration:

@Order(Ordered.HIGHEST_PRECEDENCE)

@Configuration

@Conditiona

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論