Thymeleaf簡介

在Java中,模板引擎可以幫助生成文本輸出。常見的模板引擎包括FreeMarker、Velocity和Thymeleaf等

Thymeleaf是一個適用于Web和獨立環境的現代服務器端Java模板引擎。

Thymeleaf 和 JSP比較:

Thymeleaf目前所作的工作和JSP有相似之處,Thymeleaf和JSP都是屬于服務端渲染技術,Thymeleaf比JSP功能強大許多。

Thymeleaf就是SpringBoot 官方推薦使用的模板引擎。

搭建thymeleaf環境:

1、創建一個 SpringBoot 項目

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.14</version><scope>provided</scope>
</dependency>

2、編寫跳轉頁面的 Controller

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private Integer id;private String name;private Integer age;private Date birthday;
}@Controller
public class IndexController {@RequestMapping("/index")public String index(Model model) {model.addAttribute("message", "HelloWorld");Student student = new Student(1, "李四", 23, new Date());model.addAttribute("student", student);Student student1 = new Student(1, "張三1", 23, new Date());Student student2 = new Student(2, "張三2", 23, new Date());Student student3 = new Student(3, "張三3", 23, new Date());List<Student> list = new ArrayList<>();list.add(student1);list.add(student2);list.add(student3);model.addAttribute("list", list);return "index";}
}

3、index.html 頁面

在resources/templates目錄創建一個index.html頁面。

注意,必須加上命名空間xmlns:th="Thymeleaf",否則Thymeleaf的自定義標簽沒有提示。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!--使用th:text輸出--><div th:text="${message}"></div><input type="text" th:id="${student.id}" th:name="${student.name}" th:value="${student.name}"/><!--循環--><table border="1"><tr><td>編號</td><td>姓名</td><td>年齡</td><td>生日</td></tr><tr th:each="student:${list}"><td th:text="${student.id}">1</td><td th:text="${student.name}">張三</td><td th:text="${student.age}">23</td><td th:text="${#dates.format(student.birthday, 'yyyy-MM-dd')}">1990-12-13</td></tr></table><!--取出集合中某一個--><div th:text="${list[0].name}"></div>
</body>
</html>

疑難問題

問題:為什么thymeleaf頁面放在templates文件夾里面,并且后綴要是.html呢?

SpringBoot框架會將內置支持的功能組件放在spring-boot-autoconfigure-3.2.5.jar 包下,而 Thymeleaf 框架就是內置支持的。

所以在這個包里面可以找對應的自動配置代碼,如圖:

如果找默認的屬性配置應該找XxxxProperties類,如圖所示,Thymeleaf模板的前后綴如下:

所以Thymeleaf的頁面存放在templates文件夾中,并且頁面的后綴為.html。

常用標簽:

  1. 數學運算

二元操作:+, - , * , / , %

一元操作: - (負)

  1. 邏輯運算

一元 : and or

二元 : !,not

  1. 比較運算(為避免轉義尷尬,可以使用括號中的英文進行比較運算!)

比較:> , < , >= ,

等于:== , != ( eq , ne )

  1. 簡單表達式

變量表達式: ${...}

選擇變量表達式: *{...}

消息表達式: #{...}

URL 表達式: @{...}

代碼段表達式: ~{...}

<body><!-- 使用th:text屬性輸出 --><div th:text="${message}" ></div><input type="text" th:id="${student.id}" th:name="${student.name}" th:value="${student.name}"><br/><!--循環--><table border="1"><tr><td>編號</td><td>姓名</td><td>年齡</td><td>生日</td></tr><tr th:each="student:${list}"><td th:text="${student.id}">1</td><td th:text="${student.name}">張三</td><td th:text="${student.age}">23</td><td th:text="${#dates.format(student.birthday, 'yyyy-MM-dd')}">1990-12-13</td></tr></table><!-- springmvc 保存了一個 model 對象: list --><!-- 獲取所有 list --><p th:text="${list}"></p><!-- 獲取 list 的第一個元素 --><p th:text="${list[0]}"></p><!-- 獲取第一個 student 對象的 name 屬性 --><p th:text="${list[0].name}"></p><!-- 也可以用 ['name'] 來獲取第一個 student 對象的 name 屬性 --><p th:text="${list[0]['name']}"></p><!-- 甚至可以調用方法! --><p th:text="${list[0].getName()}"></p><p th:text="${list[0]['name'].substring(0, 1)}"></p><!--判斷Thymeleaf支持四種判斷:th:if/th:unless、邏輯運算符(and、or、not)、三目運算符、switch。--><!--第一種:if & unless--><!-- 如果條件為真,執行標簽內的內容 --><div th:if="${false}">天天18</div><div th:if="${list[0].name eq '張三1'}">張三1</div><div th:if="${list[0].name == '張三1'}">張三1</div><!-- 如果條件為假,執行標簽內的內容 --><div th:unless="${false}">unless</div><!--第二種:and、or、not--><div th:if="${true or false}">真的18歲</div><div th:if="${not false}">真的別做夢</div><!--第三種:三目運算符--><span th:text="true ? '今年不是18歲' : '總算清醒了'"></span><br/><span th:text="${student.age eq 23} ? '今年是23' : '不是23'"></span><span th:text="${student.age eq 23 ? '今年23' : '不是23'}"></span><!--第四種:switch--><div th:switch="${student.age}"><div th:case="16">我今年16歲</div><div th:case="17">我今年17歲</div><div th:case="18">我今年18歲</div><div th:case="20">我今年20歲</div><div th:case="23">我今年23歲</div><div th:case="*">我年年18歲</div></div>
</body>

域對象

變量表達式的作用是:從web作用域里面取到對應的值,作用域包括 request、session、application。

@RequestMapping("/data")
public String data(HttpServletRequest request, HttpSession session) {Student student1 = new Student(1, "張三1", 23 , new Date());request.setAttribute("student1", student1);Student student2 = new Student(2, "張三2", 23, new Date());session.setAttribute("student2", student2);Student student3 = new Student(3, "張三3", 23, new Date());ServletContext application = request.getServletContext();application.setAttribute("student3", student3);return "data";
}
<body>request:<div>編號:<span th:text="${student1.id}"></span><br>姓名:<span th:text="${student1.name}"></span><br>年齡:<span th:text="${student1.age}"></span><br></div>session:<div>編號:<span th:text="${session.student2.id}"></span><br>姓名:<span th:text="${session.student2.name}"></span><br>年齡:<span th:text="${session.student2.age}"></span><br></div>application:<div>編號:<span th:text="${application.student3.id}"></span><br>姓名:<span th:text="${application.student3.name}"></span><br>年齡:<span th:text="${application.student3.age}"></span><br></div></body>

選擇變量表達式

問題:取request、session、application作用域上的屬性時,可以發現,我們需要重復編寫student1、session.student2和application.student3三次,

如果student對象的屬性有十幾個怎么辦?顯然寫十幾次相同的代碼不是我們想要解決方案。

針對這種問題,Thymeleaf提供了選擇變量表達式來解決。

request: <br/>
<div th:object="${student1}">編號: <p th:text="*{id}"></p><br/>姓名:<p th:text="*{name}"></p> <br/>年齡:<p th:text="*{age}"></p><br/>
</div>session:<br/>
<div th:object="${session.student2}">編號: <p th:text="*{id}"></p><br/>姓名:<p th:text="*{name}"></p> <br/>年齡:<p th:text="*{age}"></p><br/>
</div>

作用域內容對象的空值處理

當獲取一個作用域中不存在的對象屬性,那么會返回一個null,但是有些情況下還通過點運算符獲取對象屬性,那么這是SpringBoot會報異常。有些情況下,就是根據某個對象是否為null來執行相應的操作。

--需求:獲取session作用域中的user對象,如果不為null就輸出name,如果為null,就輸出空字符串,而不是報異常。

--分析:可以在調用對象或者方法的點(.)前面,使用問號(?)來判斷null

編號:

內置工具對象:# 符號直接使用

除了基本對象, thymeleaf 還提供了一組工具對象,其實和java中對應的方法大同小異。

@RequestMapping(value = "/util")
public String set(Model model) {Set<String> names = new HashSet<String>() ;List<Integer> ids = new ArrayList<Integer>() ;for (int i = 0 ; i < 5 ; i ++) {names.add("boot-" + i) ;ids.add(i) ;}model.addAttribute("names", names) ;model.addAttribute("ids", ids) ;model.addAttribute("mydate", new Date()) ;return "util" ;
}
<body><p th:text="${#dates.format(mydate,'yyyy-MM-dd')}"/><p th:text="${#dates.format(mydate,'yyyy-MM-dd HH:mm:ss.SSS')}"/><hr/><p th:text="${#strings.replace('www.baidu.cn','.','$')}"/><p th:text="${#strings.toUpperCase('www.baidu.cn')}"/><p th:text="${#strings.trim('www.baidu.cn')}"/><hr/><p th:text="${#sets.contains(names,'boot-0')}"/><p th:text="${#sets.contains(names,'boot-9')}"/><p th:text="${#sets.size(names)}"/><hr/><p th:text="${#lists.contains(ids,0)}"/>
</body>

Link URL

鏈接 URL 表達式語法是 @{...}

反斜杠 ”/“ 開頭,代表static目錄下的靜態資源文件

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" th:href="@{/bootstrap-3.3.7-dist/css/bootstrap.css}"><script type="text/javascript" th:src="@{/jquery-2.1.4.js}"></script><script type="text/javascript" th:src="@{/mylayer.js}"></script>
</head>
<body><a class="btn btn-primary" href="/">返回首頁</a> <br/><a class="btn btn-primary" href="#" th:href="@{/}">返回首頁</a> <br/><a href="/student/search">訪問StudentController下面的search方法</a> <br/><a href="#" th:href="@{/student/search}">訪問StudentController下面的search方法</a><br/><!-- 會生成 url: http://localhost:8888/student/search?id=2&name=zhangsan --><a href="#" th:href="@{/student/search(id=${student.id},name=${student.name})}">訪問UrlController下面的demo方法帶參數</a>
</body>
</html>
@Controller
@RequestMapping("/student")
public class StudentController {@RequestMapping("/search")public String search(Integer id, String name) {System.out.println("StudentController.search");System.out.println("id: " + id);System.out.println("name: " + name);return "index";}
}

如何引入另一個html頁面:

header.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div th:fragment="common_resource"><link rel="stylesheet" th:href="@{/bootstrap-3.3.7-dist/css/bootstrap.css}"><script type="text/javascript" th:src="@{/jquery-2.1.4.js}"></script><script type="text/javascript" th:src="@{/mylayer.js}"></script></div>
</body>
</html>
<head><meta charset="UTF-8"><title>Title</title><!--<link rel="stylesheet" th:href="@{/bootstrap-3.3.7-dist/css/bootstrap.css}"><script type="text/javascript" th:src="@{/jquery-2.1.4.js}"></script><script type="text/javascript" th:src="@{/mylayer.js}"></script>--><div th:replace="header::common_resource"></div>
</head>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77347.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(論文閱讀)RNNoise 基于遞歸神經網絡的噪聲抑制庫

RNNoise 是一個基于遞歸神經網絡的噪聲抑制庫。 有關該算法的描述見以下論文&#xff1a; J.-M. Valin, A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement, Proceedings of IEEE Multimedia Signal Processing (MMSP) Workshop, arXiv:1709.08…

DevOps-文章目錄

01什么是DevOps 02DevOps基礎環境準備 03-DevOps-安裝并初始化Gitlab 04-DevOps-安裝并初始化Jenkins 05-DevOps-Jenkins自動拉取構建代碼1 05-DevOps-Jenkins自動拉取構建代碼2 06-DevOps-自動構建Docker鏡像 07-DevOps-安裝部署Harbor鏡像倉庫 08-DevOps-向Harbor上傳自定義鏡…

UML 狀態圖:以網絡媒體教學系統為例解析

目錄 一、系統概述 二、狀態圖分析 &#xff08;一&#xff09;登錄認證模塊 &#xff08;二&#xff09;課程選擇模塊 &#xff08;三&#xff09;視頻播放模塊 &#xff08;四&#xff09;退出登錄狀態 三、UML狀態圖繪畫 四、總結 UML狀態圖是一種行為圖&#xff0c…

交易模式革新:Eagle Trader APP上線,助力自營交易考試效率提升

近年來&#xff0c;金融行業隨著投資者需求的日益多樣化&#xff0c;衍生出了眾多不同的交易方式。例如&#xff0c;為了幫助新手小白建立交易基礎&#xff0c;誕生了各類跟單社區&#xff1b;而與此同時&#xff0c;一種備受矚目的交易方式 —— 自營交易模式&#xff0c;正吸…

Elasticsearch BBQ 與 OpenSearch FAISS:向量搜索性能對比

作者&#xff1a;來自 Elastic Ugo Sangiorgi Elasticsearch BBQ 與 OpenSearch FAISS 的性能對比。 帶有二值量化的向量搜索&#xff1a;使用 BBQ 的 Elasticsearch 比使用 FAISS 的 OpenSearch 快 5 倍。Elastic 收到了來自社區的請求&#xff0c;希望澄清 Elasticsearch 與 …

Vue 3.4 新特性詳解:Composition API 與 Effect 作用域 API 實戰

一、Vue 3.4 核心特性概覽 Vue 3.4 代號「?? Slam Dunk」,帶來多項關鍵升級: 模板解析器性能翻倍:單文件組件(SFC)構建效率提升 44%,解析速度提升 2 倍。響應式系統優化:計算屬性和 watchEffect 觸發更精準,減少無效渲染。Effect 作用域 API 穩定:通過 effectScope…

【day8】調用AI接口,生成自動化測試用例

1、項目結構建議 project/ ├── api_docs/ # 存放接口文檔 │ └── XX系統.swagger.json ├── ai_generator/ # AI測試用例生成模塊 │ └── test_case_generator.py ├── tests/ # 生成的測試用例 │ └── test_user_api.py ├── conftest.py # pytest配置 ├─…

React應用開發學習指南

AI生成研究報告&#xff1a;關鍵詞 React應用開發 React 已經成為前端 Web 開發領域的主導力量&#xff0c;它是一個免費且開源的 JavaScript 庫&#xff0c;主要用于構建用戶界面 (UI) 1。其多功能性延伸到為 Web 和原生應用程序創建 UI&#xff0c;使其成為行業內備受追捧的…

MSTP+VRRP+DHCP(ENSP)

下載鏈接 通過網盤分享的文件&#xff1a;MSTPVRRPDHCP拓撲圖 鏈接: https://pan.baidu.com/s/1ehRwRQ-WzKC8PsUHsTe70Q?pwd345d 提取碼: 345d PC1 PC2 PC5 AR1 為AR1各端口配置IP地址 <Huawei>sys [Huawei]un in en [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/…

第一個Qt開發的OpenCV程序

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 下載安裝Qt&#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下載安裝OpenCV&#xff1a;https://opencv.org/releases/ 下載安裝CMake&#xff1a;Downl…

深入解析 Python 中的裝飾器 —— 從基礎到實戰

1. 裝飾器基礎 1.1 什么是裝飾器&#xff1f; 裝飾器本質上是一個 Python 函數&#xff0c;它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能。裝飾器的返回值也是一個函數對象。 1.2 語法糖&#xff1a; 符號 Python 提供了 符號作為裝飾器的語法糖&#xff0c…

研究生面試常見問題

研究生面試是考研復試的重要環節&#xff0c;面試表現直接關系到錄取結果。以下從面試流程、常見問題分類及回答技巧等方面為您整理了相關內容&#xff0c;幫助您更好地準備面試。 一、研究生面試的基本流程 自我介紹&#xff1a;通常需要準備1分鐘左右的中文或英文自我介紹&a…

無人機避障與目標識別技術分析!

一、無人機避障技術 1. 技術實現方式 傳感器融合&#xff1a; 視覺傳感&#xff08;RGB/雙目/紅外相機&#xff09;&#xff1a;基于SLAM&#xff08;同步定位與地圖構建&#xff09;實現環境建模&#xff0c;但依賴光照條件。 激光雷達&#xff08;LiDAR&#xff09;&…

Facebook隱私保護:從技術到倫理的探索

在這個數字化時代&#xff0c;隱私保護已成為公眾關注的焦點。Facebook&#xff0c;作為全球最大的社交媒體平臺之一&#xff0c;其用戶隱私保護問題更是引起了廣泛的討論。本文將從技術層面和倫理層面探討 Facebook 在隱私保護方面的努力和挑戰。 技術層面的隱私保護 在技術…

vmware17 虛擬機 ubuntu22.04 橋接模式,虛擬機無法接收組播消息

問題描述&#xff1a; 在一個項目中&#xff0c;宿主機win10中&#xff0c;使用的vmware17pro 虛擬機安裝的ubuntu22.04&#xff0c;按照網上的教程使用Qt綁定組播消息&#xff0c;在另外一個Ubuntu工控機上發送用wiresahrk抓包的組播消息 sudo tcpreplay -i enp1s0 --loop0 y…

《Operating System Concepts》閱讀筆記:p735-p737

《Operating System Concepts》學習第 62 天&#xff0c;p735-p737 總結&#xff0c;總計 3 頁。 一、技術總結 1.distributed system (1)定義 A collection of loosely coupled nodes interconnected by a communication network(一組通過通信網絡相互連接的松散耦合節點)…

NO.92十六屆藍橋杯備戰|圖論基礎-最小生成樹-Prim算法-Kruskal算法|買禮物|繁忙的都市|滑雪(C++)

一個具有n個頂點的連通圖&#xff0c;其?成樹為包含n-1條邊和所有頂點的極?連通?圖。對于?成樹來說&#xff0c;若砍去?條邊就會使圖不連通圖&#xff1b;若增加?條邊就會形成回路。 ?個圖的?成樹可能有多個&#xff0c;將所有?成樹中權值之和最?的樹稱為最??成樹…

小白從0學習網站搭建的關鍵事項和避坑指南(2)

以下是針對小白從零學習網站搭建的 進階注意事項和避坑指南&#xff08;第二期&#xff09;&#xff0c;覆蓋開發中的高階技巧、常見陷阱及解決方案&#xff0c;幫助你在實戰中提升效率和質量&#xff1a; 一、進階技術選型避坑 1. 前端框架選擇 誤區&#xff1a;盲目追求最新…

Java的Servlet的監聽器Listener 筆記250417

Java的Servlet的監聽器Listener 筆記250417 分類1: 一、生命周期監聽器 監聽容器&#xff08;如 Tomcat&#xff09;中應用、會話或請求的創建與銷毀。 監聽器接口觸發事件典型用途ServletContextListener應用啟動 (contextInitialized)、關閉 (contextDestroyed)全局資源管…

網絡安全領域的AI戰略準備:從概念到實踐

網絡安全領域的AI準備不僅涉及最新工具和技術的應用&#xff0c;更是一項戰略必需。許多企業若因目標不明確、數據準備不足或與業務重點脫節而未能有效利用AI技術&#xff0c;可能面臨嚴重后果&#xff0c;包括高級網絡威脅數量的激增。 AI準備的核心要素 構建穩健的網絡安全…