SpringBoot2零基礎(chǔ)到精通之配置文件與web開(kāi)發(fā)
1 配置文件
??之前說(shuō)過(guò),配置文件大致分兩種類型:properties、yaml。其中properties是最常規(guī)的配置文件類型:使用鍵值對(duì)等號(hào)的格式來(lái)對(duì)各種參數(shù)進(jìn)行配置,后綴為.properties,在這里就不過(guò)多的進(jìn)行贅述了。下面說(shuō)一下yaml文件。
1.1 yaml文件
?? YAML全稱YAML Ain't(isn't) Markup Language,是一種直觀的能夠被電腦識(shí)別的數(shù)據(jù)序列化格式,YAML以數(shù)據(jù)為核心,比傳統(tǒng)的xml方式更加簡(jiǎn)潔。體現(xiàn)在書寫的格式簡(jiǎn)潔,表達(dá)的層級(jí)明顯,非常適合用來(lái)做以數(shù)據(jù)為中心的配置文件。yaml文件的后綴為.yml或者.yaml
1.1.1 基本語(yǔ)法
- 使用K: V進(jìn)行鍵值映射,V前要有空格作為分隔符
- 區(qū)分大小寫
- 使用縮進(jìn)表示層級(jí)關(guān)系
- 語(yǔ)法層面使用縮進(jìn)不能用Tab鍵,要手敲空格??崭駭?shù)不重要,只要是相同的空格數(shù)就代表相同的層級(jí)關(guān)系,所以相同層級(jí)的縮進(jìn)空格要相同。但是實(shí)際操作的時(shí)候還是使用tab鍵,不會(huì)出現(xiàn)問(wèn)題
- 注解使用#字符
1.1.2 數(shù)據(jù)格式
??yaml文件的數(shù)據(jù)格式可以使用如下的的格式約束,用注解注掉的就是這種類型的行內(nèi)寫法,可以自行選擇習(xí)慣的形式進(jìn)行使用。其中注意的是字符串類型的數(shù)據(jù)可以不用引號(hào)引起來(lái),但是要是使用引號(hào)的話,單引號(hào)會(huì)將轉(zhuǎn)義字符作為字符串進(jìn)行輸出,但是雙引號(hào)會(huì)將轉(zhuǎn)義字符轉(zhuǎn)義之后輸出,比如\n單引號(hào)就是\n雙引號(hào)就是換號(hào)符。

1.2 數(shù)據(jù)綁定時(shí)關(guān)鍵字提示
??在使用yaml配置文件進(jìn)行配置的時(shí)候并不會(huì)進(jìn)行代碼補(bǔ)全的相關(guān)提示,這樣不僅會(huì)大大降低代碼書寫效率,還會(huì)增加出錯(cuò)的概率。于是,現(xiàn)在就有一種方法:在項(xiàng)目中加入配置處理器,即可實(shí)現(xiàn)編寫yaml文件的時(shí)候進(jìn)行關(guān)鍵字提示。方法如下:
第一步: 導(dǎo)入相關(guān)依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
第二步: 重啟項(xiàng)目
點(diǎn)擊運(yùn)行或者重啟按鈕,重啟一下該SpringBoot項(xiàng)目
第三步: 測(cè)試

第四步: 在pom.xml文件中添加代碼
即在打jar包的時(shí)候不將配置處理器打入jar包,否則會(huì)降低項(xiàng)目的效率

2 web開(kāi)發(fā)
2.1 靜態(tài)資源的存放與訪問(wèn)
??靜態(tài)資源可以理解為前端的固定頁(yè)面,這里面包含HTML、CSS、JS、圖片等等,不需要查數(shù)據(jù)庫(kù)也不需要程序處理,直接就能夠顯示的頁(yè)面。
存放路徑: 所有的靜態(tài)資源在編程的時(shí)候都放在類路徑下的一個(gè)文件夾里,文件夾默認(rèn)匹配以下四種命名的任意一種: static、public 、resources 、/META-INF/resources
資源訪問(wèn)方式:
將項(xiàng)目啟動(dòng)開(kāi)之后,使用當(dāng)前項(xiàng)目根路徑/ + 靜態(tài)資源名 對(duì)靜態(tài)資源進(jìn)行訪問(wèn)。所有的靜態(tài)資源映射地址是/**
當(dāng)靜態(tài)資源和controller請(qǐng)求重名的時(shí)候,資源解析器會(huì)首先去找該名稱的Controller看能不能處理。不能處理的所有請(qǐng)求又都交給靜態(tài)資源處理器查找靜態(tài)資源,靜態(tài)資源也找不到則響應(yīng)404頁(yè)面
自定義存放路徑、訪問(wèn)方式:
對(duì)配置文件的 spring. web.resources.static-locations配置項(xiàng)進(jìn)行修改,可以改變默認(rèn)的靜態(tài)資源存儲(chǔ)路徑。

對(duì)配置文件的 spring.mvc.static-path-pattern配置項(xiàng)進(jìn)行修改,可以使得在訪問(wèn)時(shí)擁有指定前綴的請(qǐng)求才會(huì)訪問(wèn)靜態(tài)資源。如下圖,只有使用 /res前綴 + 靜態(tài)資源名訪問(wèn)的時(shí)候才會(huì)訪問(wèn)到相應(yīng)的靜態(tài)資源

2.2 webjars
??webjars就是將前端所需要的技術(shù)jar(比如jquery)使用依賴進(jìn)行導(dǎo)入,webjars的官方文檔就是展示jar對(duì)應(yīng)的依賴,使用的時(shí)候直接復(fù)制到pom.xml文件即可。webjars的官方文檔:https://www.webjars.org/
2.3 web小技巧
2.3.1 index頁(yè)面
??不管是默認(rèn)的還是自定義的靜態(tài)資源路徑,只要在下面創(chuàng)建一個(gè)index.html文件,這個(gè)頁(yè)面就將會(huì)被當(dāng)做項(xiàng)目的歡迎頁(yè)面,也就是說(shuō)訪問(wèn)localhost: 端口號(hào)的時(shí)候就會(huì)訪問(wèn)到index.html頁(yè)面。但是需要注意的是,不能自定義靜態(tài)資源的訪問(wèn)方式,否則就會(huì)導(dǎo)致上述效果失效。
2.3.2 網(wǎng)頁(yè)小圖標(biāo)
??不管是默認(rèn)的還是自定義的靜態(tài)資源路徑,只要在下面添加一個(gè)命名為favicon.ico的圖片,即可將該圖片設(shè)置成網(wǎng)頁(yè)的小圖標(biāo)。同時(shí)需要注意的是,不能自定義靜態(tài)資源的訪問(wèn)方式,否則就會(huì)導(dǎo)致上述效果失效。

2.4 web場(chǎng)景源碼淺析
生效自動(dòng)配置類: SpringBoot啟動(dòng)的時(shí)候默認(rèn)加載xxxAutoConfiguration類(自動(dòng)配置類)是相關(guān)場(chǎng)景生效,SpringMVC功能的自動(dòng)配置類是 WebMvcAutoConfiguration
配置綁定:
@EnableConfigurationProperties注解將配置文件的相關(guān)屬性和xxx配置類進(jìn)行了綁定,可以用于更改默認(rèn)的配置信息。而通過(guò)分析源碼可知在WebMvcAutoConfiguration自動(dòng)配置類里的WebMvcAutoConfigurationAdapter靜態(tài)類上有如下注解,注解參數(shù)中有兩個(gè)配置類,其中配置類與配置文件中的屬性綁定關(guān)系如下:WebMvcProperties.class --> spring.mvc WebProperties.class --> spring.web
@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
源碼中資源處理器的解析: 在SpringBoot的源碼中有一個(gè)規(guī)則:有參構(gòu)造器所有參數(shù)的值都會(huì)從容器中拿,于是在WebMvcAutoConfigurationAdapter靜態(tài)類里的有參構(gòu)造器中,所有的參數(shù)都將直接從容器中獲取。
//ResourceProperties resourceProperties --> 獲取和spring.resources綁定的所有的值的對(duì)象
//WebMvcProperties mvcProperties --> 獲取和spring.mvc綁定的所有的值的對(duì)象
//ListableBeanFactory beanFactory --> Spring的beanFactory
//HttpMessageConverters --> 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer --> 找到資源處理器的自定義(重點(diǎn)解析)
//DispatcherServletPath --> 找到資源的路徑
//ServletRegistrationBean --> 給應(yīng)用注冊(cè)Servlet、Filter....
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,
ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
ObjectProvider<DispatcherServletPath> dispatcherServletPath,
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
this.resourceProperties = resourceProperties;
this.mvcProperties = mvcProperties;
this.beanFactory = beanFactory;
this.messageConvertersProvider = messageConvertersProvider;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations;
}
??通過(guò)對(duì)WebMvcAutoConfigurationAdapter靜態(tài)類里的addResourceHandlers方法解析,得知資源解析器中資源處理的默認(rèn)規(guī)則
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 判斷resource.add-mappings的值true/false(默認(rèn)為true,可以在配置文件修改配置項(xiàng))
if (!this.resourceProperties.isAddMappings()) {
// resource.add-mappings的值為false,則禁用所有的靜態(tài)資源的訪問(wèn)規(guī)則,debug日志輸出下面這句話
logger.debug("Default resource handling disabled");
return;
}
// resource.add-mappings的值true的話,定義規(guī)則
// 定義緩存的相關(guān)配置
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
// 定義webjars的資源存儲(chǔ)規(guī)則和緩存時(shí)間
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
// 定義靜態(tài)資源的訪問(wèn)規(guī)則
// this.mvcProperties.getStaticPathPattern() --> 獲取靜態(tài)資源的訪問(wèn)方式,默認(rèn)是\/**
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
// getStaticLocations()方法中
.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
源碼中歡迎頁(yè)的解析:
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
// 下面 welcomePageHandlerMapping 的有參函數(shù)在下面圖片
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
return welcomePageHandlerMapping;
}
??下圖解釋了為什么:自定義靜態(tài)資源的訪問(wèn)方式會(huì)導(dǎo)致歡迎頁(yè)無(wú)法起到作用。SpringBoot的源碼中已經(jīng)將這部分條件寫死了。

到此這篇關(guān)于SpringBoot2零基礎(chǔ)到精通之配置文件與web開(kāi)發(fā)的文章就介紹到這了,更多相關(guān)SpringBoot2 配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot web開(kāi)發(fā)源碼深入分析
- SpringBoot Web開(kāi)發(fā)之系統(tǒng)任務(wù)啟動(dòng)與路徑映射和框架整合
- SpringBoot整合Web開(kāi)發(fā)之文件上傳與@ControllerAdvice
- SpringBoot整合Web開(kāi)發(fā)之Json數(shù)據(jù)返回的實(shí)現(xiàn)
- 一篇文章帶你了解SpringBoot Web開(kāi)發(fā)
- SpringBoot基本web開(kāi)發(fā)demo過(guò)程解析
- SpringBoot進(jìn)行Web開(kāi)發(fā)的實(shí)現(xiàn)
相關(guān)文章
spring boot使用sonarqube來(lái)檢查技術(shù)債務(wù)
今天小編就為大家分享一篇關(guān)于spring boot使用sonarqube來(lái)檢查技術(shù)債務(wù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Java項(xiàng)目如何防止SQL注入(多種方案匯總)
SQL注入即是指web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒(méi)有判斷或過(guò)濾不嚴(yán),攻擊者可以在web應(yīng)用程序中事先定義好的查詢語(yǔ)句的結(jié)尾上添加額外的SQL語(yǔ)句,這篇文章主要介紹了?Java項(xiàng)目防止SQL注入的四種方案,需要的朋友可以參考下2023-12-12
MyBatis實(shí)現(xiàn)物理分頁(yè)的實(shí)例
這篇文章主要介紹了MyBatis實(shí)現(xiàn)物理分頁(yè)的實(shí)例,MyBatis使用RowBounds實(shí)現(xiàn)的分頁(yè)是邏輯分頁(yè),有興趣的可以了解一下。2017-01-01
Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))
這篇文章主要介紹了Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
Spring實(shí)戰(zhàn)之使用c:命名空間簡(jiǎn)化配置操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用c:命名空間簡(jiǎn)化配置操作,結(jié)合實(shí)例形式詳細(xì)分析了Spring使用c:命名空間簡(jiǎn)化配置的相關(guān)接口與配置操作技巧,需要的朋友可以參考下2019-12-12
SpringBoot + WebSocket 實(shí)現(xiàn)答題對(duì)戰(zhàn)匹配機(jī)制案例詳解
這篇文章主要介紹了SpringBoot + WebSocket 實(shí)現(xiàn)答題對(duì)戰(zhàn)匹配機(jī)制,分別為每個(gè)用戶擬定四種在線狀態(tài),通過(guò)流程圖給大家展示,需要的朋友可以參考下2021-05-05
找出鏈表倒數(shù)第n個(gè)節(jié)點(diǎn)元素的二個(gè)方法
本文提供了找出鏈表倒數(shù)第n個(gè)節(jié)點(diǎn)元素的二個(gè)方法,其中一個(gè)方法是JAVA代碼實(shí)現(xiàn)2013-11-11

