SpringBoot學習筆記——Web開發探究
前置知識:
- SpringBoot學習筆記——SpringBoot簡介與HelloWord
- SpringBoot學習筆記——原始碼初步解析
- SpringBoot學習筆記——配置檔案yaml學習
- SpringBoot學習筆記——JSR303資料校驗與多環境切換
- SpringBoot學習筆記——自動配置原理
Web開發探究
簡介
我們開始學習SpringBoot與Web開發,從這一章往後,就屬於我們實戰部分的內容了;
其實SpringBoot的東西用起來非常簡單,因為SpringBoot最大的特點就是自動裝配。
使用SpringBoot的步驟:
1、建立一個SpringBoot應用,選擇我們需要的模組,SpringBoot就會預設將我們的需要的模組自動配置好
2、手動在配置檔案中配置部分配置專案就可以執行起來了
3、專注編寫業務程式碼,不需要考慮以前那樣一大堆的配置了。
要熟悉掌握開發,之前學習的自動配置的原理一定要搞明白!
比如SpringBoot到底幫我們配置了什麼?我們能不能修改?我們能修改哪些配置?我們能不能擴充套件?
- 向容器中自動配置元件 :*** Autoconfiguration
- 自動配置類,封裝配置檔案的內容:***Properties
沒事就找找類,看看自動裝配原理!
我們之後來進行一個單體專案的小專案測試,讓大家能夠快速上手開發!
web開發要解決的問題:
- 匯入靜態資源...
- 首頁
- jsp,模板弓|擎Thymeleaf
- 裝配擴充套件SpringMVC
- 增刪改查
- 攔截器
- 國際化!
靜態資源處理
靜態資源對映規則
首先,我們搭建一個普通的SpringBoot專案,回顧一下HelloWorld程式!
寫請求非常簡單,那我們要引入我們前端資源,我們專案中有許多的靜態資源,比如css,js等檔案,這個SpringBoot怎麼處理呢?
如果我們是一個web應用,我們的main下會有一個webapp,我們以前都是將所有的頁面導在這裡面的,對吧!但是我們現在的pom呢,打包方式是為jar的方式,那麼這種方式SpringBoot能不能來給我們寫頁面呢?當然是可以的,但是SpringBoot對於靜態資源放置的位置,是有規定的!
我們先來聊聊這個靜態資源對映規則:
SpringBoot中,SpringMVC的web配置都在 WebMvcAutoConfiguration 這個配置類裡面;
我們可以去看看 WebMvcAutoConfigurationAdapter 中有很多配置方法;
有一個方法:addResourceHandlers 新增資源處理
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
// 已禁用預設資源處理
logger.debug("Default resource handling disabled");
return;
}
// 快取控制
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
// webjars 配置
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
// 靜態資源配置
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
讀一下原始碼:比如所有的 /webjars/** , 都需要去 classpath:/META-INF/resources/webjars/ 找對應的資源;
什麼是webjars 呢?
Webjars本質就是以jar包的方式引入我們的靜態資源 , 我們以前要匯入一個靜態資原始檔,直接匯入即可。
使用SpringBoot需要使用Webjars,我們可以去搜索一下:
要使用jQuery,我們只要要引入jQuery對應版本的pom依賴即可!
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.4.1</version>
</dependency>
匯入完畢,檢視webjars目錄結構,並訪問Jquery.js檔案!
訪問:只要是靜態資源,SpringBoot就會去對應的路徑尋找資源,我們這裡訪問:http://localhost:8080/webjars/jquery/3.4.1/jquery.js
第二種靜態資源對映規則
那我們專案中要是使用自己的靜態資源該怎麼匯入呢?我們看下一行程式碼;
我們去找staticPathPattern發現第二種對映規則 :/** , 訪問當前的專案任意資源,它會去找 resourceProperties 這個類,我們可以點進去看一下分析:
// 進入方法
public String[] getStaticLocations() {
return this.staticLocations;
}
// 找到對應的值
private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
// 找到路徑
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
};
resources>static>public
ResourceProperties 可以設定和我們靜態資源有關的引數;這裡面指向了它會去尋找資源的資料夾,即上面陣列的內容。
所以得出結論,以下四個目錄存放的靜態資源可以被我們識別:
"classpath:/META-INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/"
我們可以在resources根目錄下新建對應的資料夾,都可以存放我們的靜態檔案;
比如我們訪問 http://localhost:8080/1.js , 他就會去這些資料夾中尋找對應的靜態資原始檔;
自定義靜態資源路徑
我們也可以自己通過配置檔案來指定一下,哪些資料夾是需要我們放靜態資原始檔的,在application.properties中配置;
spring.resources.static-locations=classpath:/coding/,classpath:/sdz/
一旦自己定義了靜態資料夾的路徑,原來的自動配置就都會失效了!
首頁處理
靜態資原始檔夾說完後,我們繼續向下看原始碼!可以看到一個歡迎頁的對映,就是我們的首頁!
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
FormattingConversionService mvcConversionService,
ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(), // getWelcomePage 獲得歡迎頁
this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
return welcomePageHandlerMapping;
}
點進去繼續看
private Optional<Resource> getWelcomePage() {
String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());
// ::是java8 中新引入的運算子
// Class::function的時候function是屬於Class的,應該是靜態方法。
// this::function的funtion是屬於這個物件的。
// 簡而言之,就是一種語法糖而已,是一種簡寫
return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
}
// 歡迎頁就是一個location下的的 index.html 而已
private Resource getIndexHtml(String location) {
return this.resourceLoader.getResource(location + "index.html");
}
歡迎頁,靜態資原始檔夾下的所有 index.html 頁面;被 /** 對映。
比如我訪問 http://localhost:8080/ ,就會找靜態資原始檔夾下的 index.html
新建一個 index.html ,在我們上面的3個目錄中任意一個;然後訪問測試 http://localhost:8080/ 看結果!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首頁</h1>
</body>
</html>
關於網站圖示說明:
與其他靜態資源一樣,Spring Boot在配置的靜態內容位置中查詢 favicon.ico。如果存在這樣的檔案,它將自動用作應用程式的favicon。
1、關閉SpringBoot預設圖示
#關閉預設圖示
spring.mvc.favicon.enabled=false
2、自己放一個圖示在靜態資源目錄下,我放在 public 目錄下
3、清除瀏覽器快取!重新整理網頁,發現圖示已經變成自己的了!