1. 程式人生 > 實用技巧 >7、SpringBoot整合Thymeleaf

7、SpringBoot整合Thymeleaf

步驟

  1. 建立專案
  2. 修改POM檔案,新增Thymeleaf啟動器依賴
  3. 建立Controller
  4. 建立檢視

新增依賴

<!--新增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