SpringBoot整合Thymeleaf-基於SpringBoot2.X版本

一、爲啥要用Thymeleaf模板引擎?如今不都先後端分離了麼?

熊dei們,彆着急,咱們先來談談爲啥開始用Thymeleaf模板引擎,先照顧照顧下咱們這些可愛的小白童鞋....javascript

爲啥開始用Thymeleaf模板引擎?jsp她不香嘛?
首先前端交給咱們的頁面,是html頁面,若是是咱們以前開發,咱們須要把他們轉成jsp頁面,jsp好處就是當咱們查出一些數據轉發到JSP頁面之後,咱們能夠用jsp輕鬆實現數據的顯示,及交互等。jsp支持很是強大的功能,包括能寫Java代碼.......是的先給jsp一頓誇。html

可是呢,SpringBoot項目是以jar的方式,不是war方式,並且SpringBoot用的仍是嵌入式的Tomcat,因此呢,他如今默認是不支持jsp的.......是的而後給jsp反手一嘴巴子。前端

那不支持jsp,若是咱們直接用純靜態頁面的方式,那給咱們開發會帶來很是大的麻煩,那怎麼辦呢,SpringBoot推薦使用模板引擎。模板引擎有不少種,好比ThymeleafVelocityFreeMarker,不過思想都是一致的,這個就沒必要擔憂,springboot推薦使用Thymeleaf,固然基本上程序員用的都是Thymeleaf模板引擎,在業界Thymeleaf模板引擎是業界的一致好評。java

如今不都先後端分離了麼?Vue她不香嘛?
雖然如今慢慢在流行先後端分離開發,可是仍是有一些「靈玩不靈」的公司依舊在作先後端不分的開發,而在先後端不分的開發中,咱們就會須要後端頁面模板引擎【實際上,即便先後端分離,也會在一些場景下須要使用頁面模板,舉個典型的栗子:郵件發送模板】。程序員

二、SpringBoot1.X與2.X版本導火線

隨着科技的發展,社會在進步,企業在奔跑,程序員在咆哮。醒醒吧年輕人,如今都2020年,在以前不免會聽到或者看到網上的文章什麼的說第一步要導入Thymeleaf模板依賴包,說啥在以往的版本中默認是Thymeleaf 是2.1.6x , 開發要基於3.x,而後又要在pom.xml的properties標籤中寫下如下兩句代碼web

<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>        
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>

說是佈局功能的支持程序須要 thymeleaf3主程序、 layout2以上版本,也就是說手動把3.x的thymeleaf覆蓋掉依賴中的2.x。spring

說了一大堆,我只想說一句:如今的版本基本默認都是thymeleaf3.x,如今2020年了,就算是學生仔學習基本都是SpringBoot2.X版本了。若是你還在用SpringBoot1.X,那咱們不合適,你是個好人。編程

若是仍是不肯定,你大可進行以下操做,檢查檢查thymeleaf版本:
在這裏插入圖片描述後端

三、SpringBoot2.X版本整合Thymeleaf

得,說(扯)了一大堆,不如來整:
在這裏插入圖片描述
想上面,可能不一樣的idea版本會出現選擇SpringBoot版本不一樣的狀況,這很正常,人生建議:無論啥都不要追求最新版,你用起來好像很牛皮很高端,同時一根菸一行bug改一天的樣子也是很是瀟灑~狼狽~的,這裏我就很少概述了。設計模式

勾選Thymeleaf以後,建立完成後,pom.xml 依賴會默認以下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

也就是說,以及導入Thymeleaf依賴了,不須要再導了。到這裏基本上能夠說是整合完成了,接下來說講Thymeleaf的強大功能。

四、Thymeleaf渲染

Thymeleaf渲染規則,能夠找到它的自動配置文件便可查看它的使用規則,以下:
在這裏插入圖片描述
關鍵代碼:

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
        private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;
        public static final String DEFAULT_PREFIX = "classpath:/templates/";
        public static final String DEFAULT_SUFFIX = ".html";
        private boolean checkTemplate = true;
        private boolean checkTemplateLocation = true;
        private String prefix = DEFAULT_PREFIX;
        private String suffix = DEFAULT_SUFFIX;
        private String mode = "HTML";
        private Charset encoding = DEFAULT_ENCODING;
        private boolean cache = true;
        //...

分析源碼,過程以下:

一、首先經過 @ConfigurationProperties 註解,將 application.properties 前綴爲 spring.thymeleaf 的配置和這個類中的屬性綁定。

 

二、前三個 static 變量,定義了默認的編碼格式、視圖解析器的前綴、後綴等。

 

三、根據前三行配置,能夠看出,Thymeleaf 模板的默認位置在 resources/templates 目錄>下,默認的後綴是 html

 

注意:這些配置,若是開發者不本身提供,則使用 默認的,若是本身提供,則在 application.properties 中以 spring.thymeleaf 開始相關的配置。

是的,簡單來講默認規則以下:

默認前綴DEFAULT_PREFIX = "classpath:/templates/"

 

默認後綴DEFAULT_SUFFIX = ".html"

徹底相似 Spring MVC 的映射,固然若是要修改這些配置只須要在全局配置文件中覆蓋修改便可,咱們通常不覆蓋,除非特殊需求。

還須要說起一點的是Spring Boot 爲 Thymeleaf 提供的自動化配置類 org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration ,其中部分關鍵源碼以下:

@Configuration
@EnableConfigurationProperties(ThymeleafProperties.class)
@ConditionalOnClass({ TemplateMode.class, SpringTemplateEngine.class })
@AutoConfigureAfter({ WebMvcAutoConfiguration.class, WebFluxAutoConfiguration.class })
public class ThymeleafAutoConfiguration {
   //....
}

分析:

從源碼中能夠看到,這個自動化配置類中,首先@EnableConfigurationProperties導入 ThymeleafProperties ,而後 @ConditionalOnClass 註解表示當前系統中存在 TemplateMode 和 SpringTemplateEngine 類時,當前的自動化配置類纔會生效,即只要項目中引入了 Thymeleaf 相關的依賴,這個配置就會生效。

這些默認的配置咱們幾乎不須要作任何更改就能夠直接使用了。若是有特殊需求,則能夠在 application.properties 中配置以 spring.thymeleaf 開頭的屬性就能夠本身量身定製了,固然我是不可能有這種需求的,除非有人要打我,不然想不想要想我會有這種需求癖好。若是非要改建議參考SpringBoot官方文檔

五、測試整合Thymeleaf是否成功

是的,以上步驟誰都會,只有測試整合Thymeleaf成功以後纔算是整合完成了,也就是這個階段各類緣由的錯誤就出來了。

Controller代碼

首先編寫Controller代碼,咱也不寫的那麼複雜,demo怎麼簡單怎麼來

@Controller
public class HelloController {
    @GetMapping("/su")  
    public String success(){
        return "success";    //  至關於訪問 classpath:/templates/success.html
    }
}

html頁面代碼

編寫頁面代碼,千萬注意這個頁面代碼要在classpath:/templates/目錄下
在這裏插入圖片描述
代碼以下:

<!DOCTYPE html>
<html lang="en">  
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>整合Thymeleaf已經success哈哈哈哈</h1>

</body>
</html>

訪問測試

訪問http://localhost:8080/su
在這裏插入圖片描述
如上效果則說明整合成功。

六、SpringBoot整合Thymeleaf可能出現的問題

在這裏插入圖片描述

這種異常很常見具體的還得看異常的信息,好比上面說是頁面路由出現了環,等同於循環引用了,多是本身的訪問路徑名和HTML文件重名了,不妨改個請求路徑試試。

再好比,下面總的來講具體看打印信息
在這裏插入圖片描述
這裏概括一下異常緣由並解決:

一、Application啓動類的位置不對:要將Application類放在最外側,即包含全部子包 ,spring-boot會自動加載啓動類所在包下及其子包下的全部組件。若是啓動類沒有放在最外側就會報錯,正確位置以下:
在這裏插入圖片描述
二、springboot的配置文件有誤:關於application.ymlapplication.properties文件中視圖解析器的配置問題。在pom文件下的spring-boot-starter-paren

版本較高時使用配置:spring.mvc.view.prefix/spring.mvc.view.suffix
版本較低時使用配置:spring.view.prefix/spring.view.suffix

三、控制器的url訪問路徑與註解@XXXMapping("/xxxx")不匹配,以下圖所示:
在這裏插入圖片描述
四、最後這個緣由就特別坑了喔,你會發現上面你都符合了可是依舊仍是報錯,這就很神奇了,其實我就是這個緣由被坑了一上午————版本過高了 。可能你會說idea默認選擇的時候都是2.1.X往上,基本沒有本身想要的版本,其實這都不是很大的問題,其實能夠在pom.xml中修改便可,以下:
在這裏插入圖片描述
若是這過程還有異常發生,讓你參生恐懼,記住,打敗恐懼的最好辦法就是面對恐懼,醒醒吧年輕人,一giao我哩giaogiao嗷..嗷嗷嗷..嗷嗷嗷嗷..嗷嗷嗷嗷嗷............................奧利給!!!

若是本文對你有一點點幫助,那麼請點個讚唄,謝謝~

最後,如有不足或者不正之處,歡迎指正批評,感激涕零!若是有疑問歡迎留言,絕對第一時間回覆!

歡迎各位關注個人公衆號,裏面有一些java學習資料和一大波java電子書籍,好比說周志明老師的深刻java虛擬機、java編程思想、核心技術卷、大話設計模式、java併發編程實戰.....都是java的聖經,不說了快上Tomcat車,咋們走!最主要的是一塊兒探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...

在這裏插入圖片描述
參考:

SpringBoot官方文檔:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/

http://www.imooc.com/article/293021

https://blog.csdn.net/qushaming/article/details/94593675

相關文章
相關標籤/搜索