帶著萌新看springboot原始碼03
上一節講到了快速新建一個springboot應用,以及springboot的自動配置類起作用的時機,並且一起看了一個自動配置類的原始碼。
這一節我們來粗略看看當用戶在瀏覽器輸入一個url,怎麼樣返回一個靜態HTML和動態網頁,以及其中的原理。
在此之前說一點,springboot不支援jsp,也就是說以前我們寫的jsp頁面頁面在這裡解析不了,換句話說,springboot肯定有一個自己獨有的類似jsp的技術來實現動態網頁的訪問,這點毫無疑問,不然一個網站只能訪問html網頁,太單調了。
springboot的這個獨有的技術是thymeleaf,下面就簡要說說thymeleaf,要想徹底學會還需要自己多查查資料,我這裡只能說一個大概的。
1.初識thymeleaf
作為一個類似於jsp的技術,用腳趾頭想肯定是類似標籤的東西、符合thymeleaf語法,經過thymeleaf引擎解析(thymeleaf引擎又是個什麼東西呢?很抽象,我也說不好說;總之,想想jsp引擎,不就是將那些jsp頁面裡的所有標籤解析成servlet,然後向用戶響應servlet,其實這也是jsp最被人詬病的地方,還特麼要先將jsp檔案裡面的東西全部解析成servlet,然後才能響應簡直就是太浪費時間了,扯遠了。。。)
目錄結構
用thymeleaf之前,匯入依賴以及版本控制(這個可以不用springboot自帶的版本),以及在帶有thymeleaf的html檔案加入名稱空間
pom.xml檔案:
說說thymeleaf語法基本就是這樣一個模式,th:xx=“${xxx}”,這裡的xx可以是任意屬性值,假設有如下一個controller
開啟success.html,
還有th:if th:object th:each等標籤的運用自己去試試,跟jsp裡面的標籤及其相似,這裡不多說了。根據上面的設定,執行,開啟瀏覽器測試,開啟heml原始碼就能看到效果。
2.thymeleaf小知識
為什麼controller裡面返回的success,就會跳轉到template/success.html頁面,thymeleaf引擎就會將其解析,並響應呢?而且靜態網頁為什麼是放在那個static資料夾下,放在其他地方行嗎?這都是需要大概瞭解的
首先,我們開啟這個類
我們開啟ThymeleafProperties這個類,可以看到一些屬性
這就很明顯了,配置了字首字尾,無非是Thymeleaf引擎呼叫這個類中的屬性,然後和controller返回的字串(就是所謂的邏輯檢視名)和這個前後綴拼接組成真正的檢視全路徑,再呼叫檢視解析器去解析,然後響應。
由此,我們就要知道,thymeleaf檔案就要放在類路徑下的template資料夾下,並且以.html結尾,或者自己去主配置檔案spring.thymeleaf.xx="xxx"去自定義位置。
3.靜態檔案路徑解析
接下來是靜態資料夾,還記不記得前面的匯入了很多的xxxAutoConfiguration,這裡的靜態檔案位置就要用到一個,就是WebMvcAutoConfiguration,這個自動配置類其實就是相當於ssm的springmvc配置。
補充一個知識點,webjars網站https://www.webjars.org/,這裡將很多的東西都打包成了jar包,想要用什麼只需要匯入相關的依賴就可以了。
開啟這個類WebMvcAutoConfiguration,看到這個方法裡裡面
現在我們就要看看staticPathPattern到底是什麼,點開getStaticPathPattern();------------->點開return xxx.staticPathPattern-------->看到private String staticPathPattern = "/**";
我們就明白了,我們只要在瀏覽器輸入localhost:8080/xxx都行
繼續分析this.resourceProperties.getStaticLocations()這個,這代表springboot會去哪裡找你想要的靜態檔案
點開.getStaticLocations()------->點開return this.staticLocations;---------->private String[] staticLocations = RESOURCE_LOCATIONS;(點開RESOURCE_LOCATIONS),最後,你能看到如下程式碼
結論:
1.假如你在瀏覽器輸入localhost:8080/webjars/xxx,springboot就會遍歷所有jar包下的webjars,直至找到xxx檔案
2.假如你在瀏覽器輸入localhost:8080/xxx,那麼springboot就會在如下的五個路徑下依次遍歷,直到找到則個靜態檔案,否則,丟擲異常
{"/",
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/" };
3.假如在瀏覽器輸入localhost:8080/xxx(動態網頁),springboot就會去類路徑下template/xxx.html檔案