狂神說SpringBoot系列連載課程,通俗易懂,基於SpringBoot2.2.5版本,歡迎各位狂粉轉發關注學習。
微信公眾號:狂神說(首發) Bilibili:狂神說Java(視頻)
未經作者授權,禁止轉載
Thymeleaf
模板引擎
前端交給我們的頁面,是html頁面。如果是我們以前開發,我們需要把他們轉成jsp頁面,jsp好處就是當我們查出一些數據轉發到JSP頁面以后,我們可以用jsp輕松實現數據的顯示,及交互等。
jsp支持非常強大的功能,包括能寫Java代碼,但是呢,我們現在的這種情況,SpringBoot這個項目首先是以jar的方式,不是war,像第二,我們用的還是嵌入式的Tomcat,所以呢,他現在默認是不支持jsp的。
那不支持jsp,如果我們直接用純靜態頁面的方式,那給我們開發會帶來非常大的麻煩,那怎么辦呢?
SpringBoot推薦你可以來使用模板引擎:
模板引擎,我們其實大家聽到很多,其實jsp就是一個模板引擎,還有用的比較多的freemarker,包括SpringBoot給我們推薦的Thymeleaf,模板引擎有非常多,但再多的模板引擎,他們的思想都是一樣的,什么樣一個思想呢我們來看一下這張圖:
模板引擎的作用就是我們來寫一個頁面模板,比如有些值呢,是動態的,我們寫一些表達式。而這些值,從哪來呢,就是我們在后台封裝一些數據。然后把這個模板和這個數據交給我們模板引擎,模板引擎按照我們這個數據幫你把這表達式解析、填充到我們指定的位置,然后把這個數據最終生成一個我們想要的內容給我們寫出去,這就是我們這個模板引擎,不管是jsp還是其他模板引擎,都是這個思想。只不過呢,就是說不同模板引擎之間,他們可能這個語法有點不一樣。其他的我就不介紹了,我主要來介紹一下SpringBoot給我們推薦的Thymeleaf模板引擎,這模板引擎呢,是一個高級語言的模板引擎,他的這個語法更簡單。而且呢,功能更強大。
我們呢,就來看一下這個模板引擎,那既然要看這個模板引擎。首先,我們來看SpringBoot里邊怎么用。
引入Thymeleaf
怎么引入呢,對於springboot來說,什么事情不都是一個start的事情嘛,我們去在項目中引入一下。給大家三個網址:
Thymeleaf 官網:https://www.thymeleaf.org/
Thymeleaf 在Github 的主頁:https://github.com/thymeleaf/thymeleaf
Spring官方文檔:找到我們對應的版本
https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
找到對應的pom依賴:可以適當點進源碼看下本來的包!
<!--thymeleaf--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
Maven會自動下載jar包,我們可以去看下下載的東西;
Thymeleaf分析
前面呢,我們已經引入了Thymeleaf,那這個要怎么使用呢?
我們首先得按照SpringBoot的自動配置原理看一下我們這個Thymeleaf的自動配置規則,在按照那個規則,我們進行使用。
我們去找一下Thymeleaf的自動配置類:ThymeleafProperties
@ConfigurationProperties( prefix = "spring.thymeleaf" ) public class ThymeleafProperties { private static final Charset DEFAULT_ENCODING; 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 = "classpath:/templates/"; private String suffix = ".html"; private String mode = "HTML"; private Charset encoding; }
我們可以在其中看到默認的前綴和后綴!
我們只需要把我們的html頁面放在類路徑下的templates下,thymeleaf就可以幫我們自動渲染了。
使用thymeleaf什么都不需要配置,只需要將他放在指定的文件夾下即可!
測試
1、編寫一個TestController
@Controller public class TestController { @RequestMapping("/t1") public String test1(){ //classpath:/templates/test.html return "test"; } }
2、編寫一個測試頁面 test.html 放在 templates 目錄下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>測試頁面</h1> </body> </html>
3、啟動項目請求測試
Thymeleaf 語法學習
要學習語法,還是參考官網文檔最為准確,我們找到對應的版本看一下;
Thymeleaf 官網:https://www.thymeleaf.org/ , 簡單看一下官網!我們去下載Thymeleaf的官方文檔!
我們做個最簡單的練習 :我們需要查出一些數據,在頁面中展示
1、修改測試請求,增加數據傳輸;
@RequestMapping("/t1") public String test1(Model model){ //存入數據 model.addAttribute("msg","Hello,Thymeleaf"); //classpath:/templates/test.html return "test"; }
2、我們要使用thymeleaf,需要在html文件中導入命名空間的約束,方便提示。
我們可以去官方文檔的#3中看一下命名空間拿來過來:
xmlns:th="http://www.thymeleaf.org"
3、我們去編寫下前端頁面
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>狂神說</title> </head> <body> <h1>測試頁面</h1> <!--th:text就是將div中的內容設置為它指定的值,和之前學習的Vue一樣--> <div th:text="${msg}"></div> </body> </html>
4、啟動測試!
OK,入門搞定,我們來認真研習一下Thymeleaf的使用語法!
1、我們可以使用任意的 th:attr 來替換Html中原生屬性的值!
2、我們能寫哪些表達式呢?
Simple expressions:(表達式語法) Variable Expressions: ${...}:獲取變量值;OGNL; 1)、獲取對象的屬性、調用方法 2)、使用內置的基本對象:#18 #ctx : the context object. #vars: the context variables. #locale : the context locale. #request : (only in Web Contexts) the HttpServletRequest object. #response : (only in Web Contexts) the HttpServletResponse object. #session : (only in Web Contexts) the HttpSession object. #servletContext : (only in Web Contexts) the ServletContext object. 3)、內置的一些工具對象: #execInfo : information about the template being processed. #uris : methods for escaping parts of URLs/URIs #conversions : methods for executing the configured conversion service (if any). #dates : methods for java.util.Date objects: formatting, component extraction, etc. #calendars : analogous to #dates , but for java.util.Calendar objects. #numbers : methods for formatting numeric objects. #strings : methods for String objects: contains, startsWith, prepending/appending, etc. #objects : methods for objects in general. #bools : methods for boolean evaluation. #arrays : methods for arrays. #lists : methods for lists. #sets : methods for sets. #maps : methods for maps. #aggregates : methods for creating aggregates on arrays or collections. ================================================================================== Selection Variable Expressions: *{...}:選擇表達式:和${}在功能上是一樣; Message Expressions: #{...}:獲取國際化內容 Link URL Expressions: @{...}:定義URL; Fragment Expressions: ~{...}:片段引用表達式 Literals(字面量) Text literals: 'one text' , 'Another one!' ,… Number literals: 0 , 34 , 3.0 , 12.3 ,… Boolean literals: true , false Null literal: null Literal tokens: one , sometext , main ,… Text operations:(文本操作) String concatenation: + Literal substitutions: |The name is ${name}| Arithmetic operations:(數學運算) Binary operators: + , - , * , / , % Minus sign (unary operator): - Boolean operations:(布爾運算) Binary operators: and , or Boolean negation (unary operator): ! , not Comparisons and equality:(比較運算) Comparators: > , < , >= , <= ( gt , lt , ge , le ) Equality operators: == , != ( eq , ne ) Conditional operators:條件運算(三元運算符) If-then: (if) ? (then) If-then-else: (if) ? (then) : (else) Default: (value) ?: (defaultvalue) Special tokens: No-Operation: _
練習測試
1、 我們編寫一個Controller,放一些數據
@RequestMapping("/t2") public String test2(Map<String,Object> map){ //存入數據 map.put("msg","<h1>Hello</h1>"); map.put("users", Arrays.asList("qinjiang","kuangshen")); //classpath:/templates/test.html return "test"; }
2、測試頁面取出數據
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>狂神說</title> </head> <body> <h1>測試頁面</h1> <div th:text="${msg}"></div> <!--不轉義--> <div th:utext="${msg}"></div> <!--遍歷數據--> <!--th:each每次遍歷都會生成當前這個標簽:官網#9--> <h4 th:each="user :${users}" th:text="${user}"></h4> <h4> <!--行內寫法:官網#12--> <span th:each="user:${users}">[[${user}]]</span> </h4> </body> </html>
3、啟動項目測試!
我們看完語法,很多樣式,我們即使現在學習了,也會忘記,所以我們在學習過程中,需要使用什么,根據官方文檔來查詢,才是最重要的,要熟練使用官方文檔!
一定要關注分享支持一下哦~