7、SpringBoot整合Thymeleaf
步驟
- 建立專案
- 修改POM檔案,新增Thymeleaf啟動器依賴
- 建立Controller
- 建立檢視
新增依賴
<!--新增Thymeleaf啟動器依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
注意:template是安全級別比較高的一個目錄,不可以直接訪問目錄下的資源,而static目錄下的資源就可以直接訪問;
建立Controller
/**
* 頁面跳轉controller
*/
@Controller
public class PageController {
@GetMapping("/show")
public String showPage(Model model){
model.addAttribute("msg", "Merry Christmas Mr lawrence");
return "index";
}
}
建立檢視
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head> <title>Title</title> </head> <body> <h1>Rain</h1> <span th:text="聖誕快樂,勞倫斯先生"></span> <hr/> <span th:text="${msg}"></span> </body> </html>
Thymeleaf名稱空間
加入該語句於html標籤中,則該頁面在寫thymeleaf表示式的時候會有提示
xmlns:th="http://www.thymeleaf.org"
Thymeleaf語法
th:text
用於字串或變數的輸出,例如
<span th:text="the last emperor"></span>
或
<span th:text="${msg}"></span>
內建物件
Thymeleaf提供了一些內建物件,內建物件可直接在模板中使用,這些物件是以#引用的。
Thymeleaf內容物件的主要作用是針對於一些型別的資料去處理的一些物件
內建物件的語法
1、引用內建物件需要使用#
2、大部分內建物件的名稱都以s結尾,如:strings、number、dates
判斷字串是否為空,如果為空返回true,否則返回false
${#strings.isEmpty(key)}
判斷字串是否包含指定的子串,如果包含返回true,否則返回false
${#strings.contains(msg,"T")}
判斷當前字串是否以子串開頭,如果是返回true,否則返回false
${#strings.startWith(msg,'a')}
判斷當前字串是否以子串結尾,如果是返回true,否則返回false
${#strings.endWith(msg,'a')}
返回字串的長度
${#strings.length(msg)}
查詢子串的位置,並返回該子串的下標,如果沒找到則返回-1
${#strings.indexOf(msg,'h')}
擷取子串,使用者與jdk String類下SubString方法相同
${#strings.substring(msg,2)}
${#strings.substring(msg,2,5)}
字串轉大小寫
${#strings.toUpperCase(msg)}
${#strings.toLowerCase(msg)}
日期格式化處理
格式化日期,預設的以瀏覽器預設語言為格式化標準
${#dates.format(key)}
按照自定義的格式做日期轉換
${#dates.format(key,'yyyy/MM/dd')}
分別取日期中“年”,“月”,“日”
${#dates.year(key)}
${#dates.month(key)}
${#dates.day(key)}
條件判斷
if條件判斷
th:if
th:switch/th:case
th:switch/th:case 與 Java中的switch語句等效;
有條件地顯示匹配的內容,如果有多個匹配結果只選擇第一個顯示;
th:case=“*”表示Java中switch的default,即沒有case的值為true時則顯示 th:case=“*”的內容。
迭代遍歷
迭代器,用於迴圈迭代集合
th:each
狀態變數
index:當前迭代器的索引,從0開始
count:當前迭代物件的計數,從1開始
size:被迭代物件的長度
odd/even:布林值,當前迴圈是否是偶數/奇數 從0開始
first:布林值,當前迴圈的是否是第一條,如果是返回true,否則返回false
last:布林值,當前迴圈的是否是最後一條,如果是則返回true,否則返回false
th:each 迭代List
pojo
package com.example.springbootthmeleaf.pojo;
public class Users {
private String id;
private String name;
private int age;
//有參,無參構造方法省略,get,set方法省略
}
controller
@GetMapping("/show")
public String showPage(Model model){
List<Users> list = new ArrayList<>();
list.add(new Users("1","admin",23));
list.add(new Users("2","kevin",23));
list.add(new Users("3","lin",23));
model.addAttribute("list",list);
return "index";
}
html
<table border="1" width="50%">
<tr>
<th>Id</th>
<th>Name</th>
<th>Age</th>
<th>Index</th>
<th>Count</th>
<th>Size</th>
<th>Odd</th>
<th>Even</th>
<th>First</th>
<th>Last</th>
</tr>
<tr th:each="u, ztbl : ${list}">
<td th:text="${u.id}"></td>
<td th:text="${u.name}"></td>
<td th:text="${u.age}"></td>
<td th:text="${ztbl.index}"></td>
<td th:text="${ztbl.count}"></td>
<td th:text="${ztbl.size}"></td>
<td th:text="${ztbl.odd}"></td>
<td th:text="${ztbl.even}"></td>
<td th:text="${ztbl.first}"></td>
<td th:text="${ztbl.last}"></td>
</tr>
</table>
結果如下
th:each 迭代Map
迭代Set和迭代list的方式是相同的
迭代Map則與Set和List有區別,畢竟資料結構不一樣
controller
@GetMapping("/show")
public String showPage(Model model){
Map<String, Users> map = new HashMap<>();
map.put("user1",new Users("1","admin",23));
map.put("user2",new Users("2","kevin",24));
map.put("user3",new Users("3","lin",25));
model.addAttribute("map",map);
return "index";
}
html
<table border="1" width="50%">
<tr>
<th>Value</th>
</tr>
<tr th:each="m : ${map}">
<td th:text="${m}"></td>
</tr>
</table>
<hr />
<table border="1" width="50%">
<tr>
<th>key</th>
<th>id</th>
<th>name</th>
<th>age</th>
</tr>
<tr th:each="m : ${map}">
<td th:text="${m.key}"></td>
<td th:text="${m.value.id}"></td>
<td th:text="${m.value.name}"></td>
<td th:text="${m.value.age}"></td>
</tr>
</table>
效果如下:
操作域物件
HttpServletRequest
request.setAttribute("req","HttpServletRequest");
<span th:text="${#httpServletRequest.getAttribute('req')}"></span>
<span th:text="${#request.getAttribute('req')}"></span>
HttpSession
request.getSession().setAttribute("sess","HttpSession");
<span th:text="${seesion.sess}"></span><br/>
<span th:text="${#session.getAttribute("sess")}"><span><br/>
ServletContext
request.getSession().getServletContext().setAttribute("app","Application")
<span th:text="${application.app}"></span>
<span th:text="${#SservletContext.getAttribute('app')}">
URL表示式
語法:thymeleaf中URL表示式的語法格式為@{}
絕對路徑
<a th:href="@{http://www.baidu.com}">絕對路徑</a>
相對路徑
相對於當前專案的根
<a th:href="@{/show}">相對路徑</a>
現對於伺服器路徑的根,可以跨專案進行訪問
<a th:href="@{~/專案名/專案的資源}">相對於伺服器的根</a>
在URL中傳遞引數
在普通格式的url中傳遞引數
<a th:href="@{/show?id=1&name=zhangsan}">普通URL格式傳參</a>
<a:th:href="@{/show(id=1,name=zhansan)}">普通URL格式傳參</a>
<a th:href="@{'/show?id='+${id}+'&name='+${name}}">普通URL格式傳參</a>
<a th:href="@{/show(id=${id},name=${name})}">普通URL格式傳輸</a>
在resful格式的URL中傳遞引數
<a th:href="@{/show/{id}(id=1)}">resful格式引數</a>
<a th:href="@{/show/{id}/{name}(id=1,name=admin)}">resful格式傳參</a>
<a th:href="@{/show/{id}(id=1,name=admin)}">restful 格式引數</a>
<a th:href="@{/show/{id}(id=${id},name=${name})}">restful格式傳參</a>
在配置檔案中配置Thymeleaf
themeleaf前後綴
spring.thymeleaf.prefix=/templates/
spring.thymeleaf.suffix=.html
配置檢視模式型別
#html5作為模板的話屬性值應該配置為
spring.thmeleaf.mode=HTML5
#預設就是HTML4作為模板
spring.thmeleaf.mode=HTML
thymeleaf的編碼
spring.thymeleaf.encoding=utf-8
配置響應型別
#預設是任意型別 "*/*"
spring.thymeleaf.servlet.content-type=text/html
#配置頁面快取,預設是true,一般改為false
spring.thymeleaf.cache=false