Java之SpringBoot-Thymeleaf詳情
前言:
聊Thymeleaf
,需要知道為什么到了SpringBoot
中就不用JSP了?這跟SpringBoot
打包方式有點(diǎn)關(guān)系,SpringBoot
項(xiàng)目打包是jar包,我們就先簡(jiǎn)單來(lái)了解下這個(gè)war包
war包代表
JavaWeb
應(yīng)用程序,jar包是類(lèi)的歸檔文件。war包不僅僅可以包含類(lèi)的歸檔文件,它還可以包含 Servlet、HTML頁(yè)面、Java
類(lèi)、圖像文件,以及組成Web
應(yīng)用程序的其他資源。
JAR
(Java Archive,Java 歸檔文件)是與平臺(tái)無(wú)關(guān)的文件格式,它允許將許多文件組合成一個(gè)壓縮文件。JAR 文件格式以流行的 ZIP 文件格式為基礎(chǔ),所以可以直接將jar包后綴改成zip再進(jìn)行解壓即可得到壓縮前的文件。與 ZIP 文件不同的是,JAR 文件不僅用于壓縮和發(fā)布,而且還用于部署和封裝庫(kù)、組件和插件程序,并可被像編譯器和 JVM 這樣的工具直接使用。包括我們常用的工具以及SpringBoot項(xiàng)目都是jar包。war是一個(gè)可以直接運(yùn)行的web模塊,通常用于網(wǎng)站,打成包部署到容器中。比如我們之前SSM寫(xiě)的web程序可以直接將war包部署到
tomcat
的webapps
目錄下,啟動(dòng)tomcat后會(huì)自動(dòng)解壓war包,就相當(dāng)于發(fā)布了這個(gè)web應(yīng)用程序。
1、About Thymeleaf
Thymeleaf
是SpringBoot
中的一個(gè)模版引擎,個(gè)人認(rèn)為有點(diǎn)類(lèi)似于Python
中的Jinja2,負(fù)責(zé)渲染前端頁(yè)面。
之前寫(xiě)JavaWeb
和SSM的時(shí)候,前端頁(yè)面可能會(huì)用JSP寫(xiě),但是因?yàn)橹绊?xiàng)目都是war包部署,而SpringBoot
都是jar包且內(nèi)嵌tomcat,所以是不支持解析jsp文件的。但是如果是編寫(xiě)純靜態(tài)的html就很不方便,那么這時(shí)候就需要一個(gè)模版引擎類(lèi)似于Jinja2可以通過(guò)表達(dá)式幫我們把動(dòng)態(tài)的變量渲染到前端頁(yè)面,我們只需要寫(xiě)一個(gè)template
即可。這也就是到了SpringBoot
為什么官方推薦要使用Thymeleaf
處理前端頁(yè)面了。
2、Hello Thymeleaf
簡(jiǎn)單來(lái)個(gè)demo
看一下Thymeleaf
效果
Pom.xml中引入依賴(lài)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
Resources/templates/index.html
<!doctype html> <!--注意:引入thymeleaf的名稱(chēng)空間--> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div th:text="${msg}"></div> </body> </html>
Controller
這里return "index"
;Thymeleaf
會(huì)在templats
目錄下尋找index.html
@Controller public class IndexController { @RequestMapping("/index") public String test1(Model model){ //存入數(shù)據(jù) model.addAttribute("msg","Hello,Thymeleaf"); //classpath:/templates/index.html return "index"; } }
也可以參考Thymeleaf的自動(dòng)配置類(lèi)。
這里的注解需要使用@Controller
,不能使用@RestController
注解
- 如果只是使用
@RestController
注解Controller
,則Controller中的方法無(wú)法返回jsp頁(yè)面,或者h(yuǎn)tml,配置的視圖解析器InternalResourceViewResolver
不起作用,返回的內(nèi)容就是Return 里的內(nèi)容- 如果需要返回到指定頁(yè)面,則需要用 @Controller配合視圖解析器
InternalResourceViewResolver
才行。如果需要返回JSON,XML或自定義mediaType內(nèi)容到頁(yè)面,則需要在對(duì)應(yīng)的方法上加上@ResponseBody注解。
關(guān)于@Controller
和@RestController
@RestController
注解是@Controller
和@ResponseBody
的合集,表示這是個(gè)控制器 bean,并且是將函數(shù)的返回值直 接填入 HTTP 響應(yīng)體中,是 REST 風(fēng)格的控制器。- 單獨(dú)使用 @Controller 不加
@ResponseBody
的話一般使用在要返回一個(gè)視圖的情況,這種情況屬于比較傳統(tǒng)的Spring MVC
的應(yīng)用,對(duì)應(yīng)于前后端不分離的情況。@Controller +@ResponseBody 返回 JSON 或 XML 形式數(shù)據(jù)
3、Thymeleaf 表達(dá)式
3.1配置文件聲明
spring: thymeleaf: cache: false # 緩存關(guān)閉,不然我們改變頁(yè)面之后可能不能及時(shí)看到更改的內(nèi)容,默認(rèn)是true。 prefix: classpath:/templates/ #默認(rèn)掃描的目錄去尋找我們r(jià)eturn時(shí)寫(xiě)的文件名,即模版文件所在位置 encoding: UTF-8 #編碼 suffix: .html #后綴 mode: HTML
3.2 常用表達(dá)式
3.2.1 0x01 ${} 變量表達(dá)式
從web作用域里面取到對(duì)應(yīng)的值,作用域包括 request
、session
、application
。
主要需要注意在template中利用獲取 request
、session
、application
的代碼是不一樣的
requset: ${ago.id} Session: ${session.agiao.id} ServletContext: ${application.abc.id}
也可以通過(guò)如下形式獲取
<span th:text="${#request.getRequestURL()}"></span><br/> <span th:text="${#session.getMaxInactiveInterval()}"></span><br/> <span th:text="${#servletContext.getServerInfo()}"></span>
示例代碼:
Controller
@GetMapping("/varExpression") public String varExpression(HttpServletRequest request, HttpSession session) { User ago = new User(1, "Ago", "123"); request.setAttribute("ago", ago); User agiao = new User(2, "Agiao", "123"); session.setAttribute("agiao", agiao); User abc = new User(3, "Abc", "123"); ServletContext servletContext = request.getServletContext(); servletContext.setAttribute("abc", abc); return "varExpression"; }
templates/varExpression.html
這里及時(shí)html中獲取request部分有報(bào)錯(cuò)也無(wú)所謂,不影響正常前端頁(yè)面顯示
<!doctype html> <!--注意:引入thymeleaf的名稱(chēng)空間--> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> request: <br/> <div> 編號(hào): <label th:text="${ago.id}"></label><br/> 用戶名:<label th:text="${ago.name}"></label> <br/> 密碼:<label th:text="${ago.pwd}"></label><br/> </div> session:<br/> <div> 編號(hào): <label th:text="${session.agiao.id}"></label><br/> 用戶名:<label th:text="${session.agiao.name}"></label> <br/> 密碼:<label th:text="${session.agiao.pwd}"></label><br/> </div> application:<br/> <div> 編號(hào):<label th:text="${application.abc.id}"></label><br/> 用戶名:<label th:text="${application.abc.name}"></label><br/> 密碼:<label th:text="${application.abc.pwd}"></label><br/> </div> </body> </html>
3.2.2 0x02 *{} 選擇變量表達(dá)式#
比較適合偷懶,直接在獲取屬性值之前先把存儲(chǔ)于scope中的整個(gè)對(duì)象提出來(lái),通過(guò)*{}獲取該對(duì)象的屬性值
request: <br/> <div> 編號(hào): <label th:text="${ago.id}"></label><br/> 用戶名:<label th:text="${ago.name}"></label> <br/> 密碼:<label th:text="${ago.pwd}"></label><br/> </div> session:<br/> <div> 編號(hào): <label th:text="${session.agiao.id}"></label><br/> 用戶名:<label th:text="${session.agiao.name}"></label> <br/> 密碼:<label th:text="${session.agiao.pwd}"></label><br/> </div>
等價(jià)于
request: <br/> <div th:object="${ago}"> 編號(hào): <label th:text="*{id}"></label><br/> 用戶名:<label th:text="*{name}"></label> <br/> 密碼:<label th:text="*{pwd}"></label><br/> </div> session:<br/> <div th:object="${session.agiao}"> 編號(hào): <label th:text="*{id}"></label><br/> 用戶名:<label th:text="*{name}"></label> <br/> 密碼:<label th:text="*{pwd}"></label><br/> </div>
3.2.3 0x03 #{} 消息表達(dá)式
對(duì)于國(guó)際化的支持說(shuō)明
配置文件聲明
## 配置國(guó)際化支持 spring.messages.basename=message
消息表達(dá)式
<span th:text="#{home.welcome}"></span><br />
3.2.4 0x04 @{} 鏈接表達(dá)式
指定跳轉(zhuǎn)的鏈接
<a th:href="@{/home}" rel="external nofollow" >url</a>
3.2.5 0x05 空值處理
如果為空則輸出null
,有id
值就輸出id
值
可以在調(diào)用對(duì)象或者方法的點(diǎn)(.)前面,使用問(wèn)號(hào)(?)來(lái)判斷是否為null
<span th:text="${session?.user?.id}"></span>
4、標(biāo)簽與屬性
常用的屬性大致有
th:text
文本顯示th:object
一般和*{}一起用th:if / th:unless
相當(dāng)于if/else
th:each
遍歷循環(huán)元素th:value
屬性賦值
所有的HTML5標(biāo)簽的所有屬性都有一個(gè)自定義的
Thymeleaf
屬性對(duì)應(yīng)。
Thymeleaf
屬性只有當(dāng)Thymeleaf
模板引擎啟動(dòng)的情況下,才會(huì)生效,即取代對(duì)應(yīng)的HTML5屬性,相反,Thymeleaf屬性?xún)H僅只是一個(gè)無(wú)用的自定義屬性,因?yàn)闉g覽器內(nèi)核不認(rèn)識(shí),因此使用Thymeleaf
模板引擎可以使得前端代碼和后端代碼分離,當(dāng)出現(xiàn)顯示問(wèn)題時(shí),可以立即定位問(wèn)題所在(是前端頁(yè)面還是后臺(tái)返回?cái)?shù)據(jù)有錯(cuò)),這也是Thymeleaf
相對(duì)于JSP的一個(gè)優(yōu)勢(shì)。
結(jié)尾:
簡(jiǎn)單過(guò)了一下Thymeleaf
,簡(jiǎn)單留個(gè)印象,相較于JSP個(gè)人感覺(jué)Thymeleaf
這種模版引擎才更像是前后端分離,也更方便了。但是在安全里,往往方便的地方就最容易存在漏洞,后續(xù)分析Thymeleaf
時(shí)再深入研究下。
到此這篇關(guān)于Java之SpringBoot-Thymeleaf詳情的文章就介紹到這了,更多相關(guān)Java之SpringBoot-Thymeleaf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java equals和=,==的區(qū)別詳細(xì)介紹
這篇文章主要介紹了java equals和=,==的區(qū)別,學(xué)習(xí)Java的朋友對(duì)equals 和== 這個(gè)概念開(kāi)始使用的時(shí)候會(huì)有疑問(wèn),很難辨別如何正確使用,這里幫大家詳細(xì)講解該知識(shí)點(diǎn),希望大家能掌握,有需要的小伙伴可以參考下2016-10-10SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的操作方法
隨著安全性的要求越來(lái)越高,目前許多項(xiàng)目中都使用了驗(yàn)證碼,驗(yàn)證碼也有各種類(lèi)型,如 圖形驗(yàn)證碼、短信驗(yàn)證碼、郵件驗(yàn)證碼、人臉識(shí)別等,本文給大家介紹SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的方法,感興趣的朋友跟隨小編一起看看吧2024-07-07淺談web項(xiàng)目讀取classpath路徑下面的文件
這篇文章主要介紹了淺談web項(xiàng)目讀取classpath路徑下面的文件,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Java實(shí)現(xiàn)分布式鎖的3種方法總結(jié)
分布式鎖是一種用于保證分布式系統(tǒng)中多個(gè)進(jìn)程或線程同步訪問(wèn)共享資源的技術(shù),同時(shí)它又是面試中的常見(jiàn)問(wèn)題,所以我們本文就重點(diǎn)來(lái)看分布式鎖的具體實(shí)現(xiàn),希望對(duì)大家有所幫助2023-09-09java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel示例
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel的相關(guān)資料,文中先進(jìn)行了簡(jiǎn)單的介紹,之后給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03將java普通項(xiàng)目打包成exe可執(zhí)行文件的步驟記錄
將JAVA代碼打包為exe文件,會(huì)讓程序運(yùn)行更加方便,這篇文章主要給大家介紹了關(guān)于將java普通項(xiàng)目打包成exe可執(zhí)行文件的相關(guān)資料,需要的朋友可以參考下2021-07-07