文章採用Spring Boot的源碼版本爲2.2.6。
從源碼淺讀,到具體體現。
0x01.Spring Boot 對靜態資源的映射
- Spring Boot中,SpringMVC的相關配置全部在類
WebMvcutoConfiguration
中。
- 我們可以從中瞭解Spring Boot對靜態資源的映射規則。
1.查看addResourceHandlers
方法:
- 該方法是增加資源映射的方法,在裏面映射了
/webjars/
,同時映射了靜態資源文件夾。
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
Integer cachePeriod = this.resourceProperties.getCachePeriod();
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(
registry.addResourceHandler("/webjars/**")
.addResourceLocations(
"classpath:/META-INF/resources/webjars/")
.setCachePeriod(cachePeriod));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
//靜態資源文件夾映射
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(
registry.addResourceHandler(staticPathPattern)
.addResourceLocations(
this.resourceProperties.getStaticLocations())
.setCachePeriod(cachePeriod));
}
}
- 我們首先發現,在這個位置設置了緩存時間:
- 繼續跟蹤下去:
-
我們可以發現,靜態資源有關的參數,緩存時間等都在這個類中進行設置。
-
我們還可以發現,所有對
/webjars/**
的請求 ,都會去classpath:/META-INF/resources/webjars/
找資源。
webjars
是以jar包的方式引入靜態資源。我們可以去webjars的官網查找對應的座標:
http://www.webjars.org/
例如:引入bootstrap的jar包形式:
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.0.0</version>
</dependency>
- 我們可以去相應的地方看到對應的靜態資源。
-
繼續看下邊的代碼,在下面添加了一個靜態資源文件夾的映射:
-
跟蹤下去:
-
也就是說,訪問當前的任何資源,都會默認去下面的路徑找,我們繼續跟蹤一下:
-
我們可以發現,它是一個字符串數組,也就是說,默認會去這幾個目錄尋找資源。
- "classpath:/META-INF/resources/",
- "classpath:/resources/",
- "classpath:/static/",
- "classpath:/public/"
2.查看WelcomePageHandlerMapping
方法:
- 該方法是對歡迎頁面的映射。
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(
ResourceProperties resourceProperties) {
return new WelcomePageHandlerMapping(resourceProperties.getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
}
- 我們先來看一下它獲取的歡迎頁是哪個頁面:
- 我們發現,這些靜態文件夾的路徑都拼接上了
index.html
。 - 再來看一下被誰映射:
- 也就是說,靜態資源文件夾下的所有
index.html
頁面;被"/**"
映射。
3.總結
- 從上述的源碼中,可以得到,Spring Boot的一些常用的靜態資源映射關係。
(1)所有 /webjars/**
,都去 classpath:/META-INF/resources/webjars/ 找資源;
(2)"/**"
訪問當前項目的任何資源,都去(靜態資源的文件夾)找映射;
(3)靜態資源文件夾下的所有index.html
頁面;被"/**"
映射;
0x02.Spring Boot 模板引擎–thymeleaf
- 模板引擎(這裏特指用於Web開發的模板引擎)是爲了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用於網站的模板引擎就會生成一個標準的HTML文檔。
- SpringBoot推薦使用Thymeleaf,它的優點是語法簡單,功能強大。
- Thymeleaf 是 Web 和獨立環境的現代服務器端 Java 模板引擎,能夠處理HTML,XML,JavaScript,CSS 甚至純文本。
1.導入thymeleaf:
- 在
pom.xml
中導入thymeleaf的座標。
<properties>
<java.version>1.8</java.version>
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
<!-- 佈局功能的支持程序 thymeleaf3主程序 layout2以上版本 -->
<!-- thymeleaf2 layout1-->
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2.源碼查看默認配置:
- 通過這段自動配置,我們可以發現,默認渲染的路徑是
"classpath:/templates/"
,默認的後綴是.html
。 - 也就是說只要我們把HTML頁面放在
classpath:/templates/
,thymeleaf就能自動渲染。
3.簡單語法:
- 先導入thymeleaf的名稱空間:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
th:任意html屬性
:來替換原生屬性的值。
例如:
<div th:text="${atfwus}" th:id=${id}>
th:utext
:不轉義字符。th:text
:轉義字符。th:each
:遍歷。th:if
,th:unless
,th:swith
,th:case
:判斷。- 具體語法參考:https://raledong.gitbooks.io/using-thymeleaf/content/Chapter1/section1.1.html(中文版哦~)
0x03.Spring Boot 對Spring MVC的自動配置
1.查看Spring Boot官方的文檔:
2.翻譯及解釋:
-
Inclusion of
ContentNegotiatingViewResolver
andBeanNameViewResolver
beans.- 自動配置了ViewResolver(視圖解析器:根據方法的返回值得到視圖對象,視圖對象決定如何渲染。轉發或者重定向)
- ContentNegotiatingViewResolver:用於組合所有的視圖解析器;
- 我們可以自己給容器中添加一個視圖解析器,ContentNegotiatingViewResolver會自動的將其組合進來;
-
Support for serving static resources, including support for WebJars (see below).
- 靜態資源文件夾路徑以及webjars。
-
Automatic registration of Converter, GenericConverter, Formatter beans.
- 自動註冊了 of
Converter
,GenericConverter
,Formatter
beans. - Converter:轉換器; 類型轉換使用Converter。
Formatter
格式化器;- 如果自己添加的格式化器轉換器,我們只需要放在容器中即可。
- 自動註冊了 of
-
Support for
HttpMessageConverters
(see below).HttpMessageConverter
:SpringMVC用來轉換Http請求和響應的;HttpMessageConverters
是從容器中確定;獲取所有的HttpMessageConverter
;- 如果自己給容器中添加HttpMessageConverter,只需要將自己的組件註冊容器中。
-
Automatic registration of MessageCodesResolver (see below).
- 自動註冊了MessageCodesResolver。
- 定義錯誤代碼生成規則
-
Static
index.html
support.- 靜態首頁訪問。
-
Custom
Favicon
support (see below). favicon.ico- 自定義圖標。
-
Automatic use of a
ConfigurableWebBindingInitializer
bean (see below).- 自動配置了
ConfigurableWebBindingInitializer
。
- 自動配置了
3.修改SpringBoot的默認配置:
- SpringBoot自動配置的原理:在自動配置很多組件的時候,先看容器中有沒有用戶自己配置的(@Bean、@Component)如果有就用用戶配置的,如果沒有,才自動配置;如果有些組件可以有多個(ViewResolver)將用戶配置的和自己默認的組合起來;
- xxxConfigurer能夠幫助我們進行擴展配置。
- xxxCustomizer能夠幫助我們進行定製配置。
4.具體擴展Spring MVC:
- 如果您想保留Spring Boot MVC特性,並且只想添加額外的MVC配置(攔截器、格式化器、視圖控制器等),那麼可以添加自己的
@configuration
註解並繼承WebMvcConfigurerAdapter
類,但不能使用@EnableWebMvc
。如果希望提供RequestMappingHandlerMapping
、RequestMappingHandlerAdapter
或ExceptionHandlerExceptionResolver
的自定義實例,則可以聲明提供此類組件的WebMVCregistrationAdapte
r實例。 - 也就是說,如果我們要對Spring MVC進行拓展,只需要加上
@configuration
註解並繼承WebMvcConfigurerAdapter
類就可以了。
例如:
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/save").setViewName("success");
}
}
- 原理探究:
- 在自動配置類中導入了一個
EnableWebMvcConfiguration
配置類。
- 這個類又繼承了一個
DelegatingWebMvcConfiguration
類,
- 在這裏獲取了容器中的配置。
-
我們找來一個實現的類查看一下:
-
我們可以發現,它實際上調用了所有的配置類。
-Spring Boot會將容器中所有的WebMvcConfigurer一起調用,SpringMVC的自動配置和我們的擴展配置都會起作用。
5.完全接管Spring MVC:
- 如果您想完全接管Spring MVC,可以添加自己的
@Configuration
,並用@EnableWebMvc
進行註釋。 - 完全接管指的是,不需要SpringBoot對SpringMVC的自動配置,所有都是我們自己配置;所有的SpringMVC的自動配置全部失效。
- 原理探究:一直追蹤這個註解
- 導入了一個配置類
DelegatingWebMvcConfiguration
。
- 這個類又繼承了
WebMvcConfigurationSupport
類。
- 重點來了,在自動配置類
WebMvcAutoConfiguration
中,發現了下列這個註解。
- 我們就能夠知道,如果使用了
@EnableWebMvc
,那麼所有的自動配置將會失效。
ATFWUS --Writing By 2020–04-28