1. 程式人生 > >小編帶著小白看springboot源碼3

小編帶著小白看springboot源碼3

速度 .html conf 訪問 tro 實現 col fff vpd

上一節講到了快速新建一個springboot應用,以及springboot的自動配置類起作用的時機,並且一起看了一個自動配置類的源碼。

  這一節我們來粗略看看當用戶在瀏覽器輸入一個url,怎麽樣返回一個靜態HTML和動態網頁,以及其中的原理。

  在此之前說一點,springboot不支持jsp,也就是說以前我們寫的jsp頁面頁面在這裏解析不了,換句話說,springboot肯定有一個自己獨有的類似jsp的技術來實現動態網頁的訪問,這點毫無疑問,不然一個網站只能訪問html網頁,太單調了。

  springboot的這個獨有的技術是thymeleaf,下面就簡要說說thymeleaf,要想徹底學會還需要自己多查查資料,我這裏只能說一個大概的。

1.初識thymeleaf

  作為一個類似於jsp的技術,用腳趾頭想肯定是類似標簽的東西、符合thymeleaf語法,經過thymeleaf引擎解析(thymeleaf引擎又是個什麽東西呢?很抽象,我也說不好說;總之,想想jsp引擎,不就是將那些jsp頁面裏的所有標簽解析成servlet,然後向用戶響應servlet,第一次請求要先將jsp文件裏面的東西全部解析成servlet,然後還要編譯成.class文件,運行,然後才能響應簡直了,而且jsp開發比較慢,以及後期的項目部署花費比較高,雖然說jsp第二次以及之後運行速度很快、安全性比較好,但是市場上用jsp開發的大多是銀行啊這些國企,小企業是沒有那個經濟用jsp開發,扯遠了。。。)

  目錄結構
技術分享圖片
用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這個類,可以看到一些屬性
技術分享圖片
這就很明顯了,配置了前綴後綴,無非是視圖解析器調用這個類中的屬性,然後和controller返回的字符串(就是所謂的邏輯視圖名)和這個前後綴拼接組成真正的視圖全路徑,再調用模板引擎去解析成最終的html,然後響應。

  由此,我們就要知道,thymeleaf文件就要放在類路徑下的template文件夾下,並且以.html結尾,或者自己去主配置文件spring.thymeleaf.xx="xxx"去自定義位置。

3.靜態文件路徑解析

  接下來是靜態文件夾,還記不記得前面的導入了很多的xxxAutoConfiguration,這裏的靜態文件位置就要用到一個,就是WebMvcAutoConfiguration,這個自動配置類其實就是相當於ssm的springmvc配置。

  補充一個知識點,webjars網站https://www.webjars.org/,這裏將很多的東西都打包成了jar包,想要用什麽只需要導入相關的依賴就可以了。

  比如springboot會用到jquery,webjars的依賴,然後html文件裏引用就好。
技術分享圖片
打開這個類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文件
  

小編帶著小白看springboot源碼3