thymleaf的用法 及 一些參數


Thymeleaf 的基本用法

https://www.jianshu.com/p/d1370aeb0881 看這篇就行

屬於個人整理的文檔,大部分內容來源自網絡

在這里我們沒有打算使用SpringMVC進行整合使用或者說跟Spring Boot 一起使用

我們在這里單獨使用Servelet版本-算是為了給一些初學者提供部分代碼

Thymeleaf是一款用於渲染XML/XHTML/HTML5內容的模板引擎,類似JSP,Velocity,FreeMaker等,它也可以輕易的與Spring MVC等Web框架進行集成作為Web應用的模板引擎。

Thymeleaf最大的特點是能夠直接在瀏覽器中打開並正確顯示模板頁面,而不需要啟動整個Web應用,但是總是看到說其效率有點低

Thymeleaf 在有網絡和無網絡的環境下皆可運行,即它可以讓美工在瀏覽器查看頁面的靜態效果,也可以讓程序員在服務器查看帶數據的動態頁面效果。這是由於它支持 html 原型,然后在 html 標簽里增加額外的屬性來達到模板+數據的展示方式。瀏覽器解釋 html 時會忽略未定義的標簽屬性,所以 thymeleaf 的模板可以靜態地運行;當有數據返回到頁面時,Thymeleaf 標簽會動態地替換掉靜態內容,使頁面動態顯示。
Thymeleaf 開箱即用的特性。它提供標准和spring標准兩種方言,可以直接套用模板實現JSTL、 OGNL表達式效果,避免每天套模板、改jstl、改標簽的困擾。同時開發人員也可以擴展和創建自定義的方言。

1.引入提示

在html頁面中引入thymeleaf命名空間,即,此時在html模板文件中動態的屬性使用th:命名空間修飾 。

<html lang="en" xmlns:th="http://www.thymeleaf.org"> 

這樣才可以在其他標簽里面使用th:這樣的語法.這是下面語法的前提*.

2.變量表達式(獲取變量值)

<div th:text="'你是否讀過,'+${session.book}+'!!'"> 同EL表達式有些相似的效果,如果有數據,被替換 完成前后端分離效果(美工代碼) </div> 
代碼分析:
1.可以看出獲取變量值用$符號,對於javaBean的話使用變量名.屬性名方式獲取,這點和EL表達式一樣
2.它通過標簽中的th:text屬性來填充該標簽的一段內容,意思是$表達式只能寫在th標簽內部,不然不會生效,上面例子就是使用th:text標簽的值替換div標簽里面的值,至於div里面的原有的值只是為了給前端開發時做展示用的.這樣的話很好的做到了前后端分離.意味着div標簽中的內容會被表達式${session.book}的值所替代,無論模板中它的內容是什么,之所以在模板中“多此一舉“地填充它的內容,完全是為了它能夠作為原型在瀏覽器中直接顯示出來。
3.訪問spring-mvc中model的屬性,語法格式為“${}”,如${user.id}可以獲取model里的user對象的id屬性 
4.牛叉的循環<li th:each="book : ${books}" > 

3.URL表達式(引入URL)

重點!重點!重點!

  • 引用靜態資源文件(CSS使用th:href,js使用使用th:src)

     
     
  • href鏈接URL(使用th:href)

     
     
    代碼分析
    1.最終解析的href為:    
      /seconddemo/    
      /seconddemo/usethymeleaf?name=Dear 相對路徑,帶一個參數   
      /seconddemo/usethymeleaf?name=Dear&alis=Dear 相對路徑,帶多個參數
      /seconddemo/usethymeleaf?name=Dear&alis=Dear 相對路徑,帶多個參數
      /seconddemo/usethymeleaf/Dear 相對路徑,替換URL一個變量
      /seconddemo/usethymeleaf/Dear/Dear 相對路徑,替換URL多個變量
    2.URL最后的(name=${name})表示將括號內的內容作為URL參數處理,該語法避免使用字符串拼接,大大提高了可讀性
    3.@{/usethymeleaf}是Context相關的相對路徑,在渲染時會自動添加上當前Web應用的Context名字,假設context名字為seconddemo,那么結果應該是/seconddemo/usethymeleaf,即URL中以”/“開頭的路徑(比如/usethymeleaf將會加上服務器地址和域名和應用cotextpath,形成完整的URL。
    4.th:href屬性修飾符:它將計算並替換使用href鏈接URL 值,並放入的href屬性中。
    5.th:href中可以直接使用靜態地址
    
    

4.選擇或星號表達式

表達式很像變量表達式,不過它們用一個預先選擇的對象來代替上下文變量容器(map)來執行*{customer.name}

<div th:object="${session.user}"> <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p> <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p> <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p> </div> //等價於 <div> <p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p> <p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p> <p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p> </div> 
1.如果不考慮上下文的情況下,兩者沒有區別;星號語法評估在選定對象上表達,而不是整個上下文,什么是選定對象?就是父標簽的值。上面的*{title}表達式可以理解為${book.title}。(父對象)  
2.當然,美元符號和星號語法可以混合使用

小插曲:三和四的變量表達式、URL表達式所對應的屬性都可以使用統一的方式:th.attr=“屬性名=屬性值”的方式來設置,參考第“七.設置屬性值”部分

5.文字國際化表達式

j簡單看一下就可以,文字國際化表達式允許我們從一個外部文件獲取區域文字信息(.properties),用Key索引Value,還可以提供一組參數(可選).

#{main.title}    
#{message.entrycreated(${entryId})} 可以在模板文件中找到這樣的表達式代碼:    
<table> <th th:text="#{header.address.city}"> <th th:text="#{header.address.country}"> </table> 

6. 表達式支持的語法

  • 字面量(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
  • 文本操作(Text operations)

    • 字符串連接(String concatenation): +

    • 文本替換(Literal substitutions): |The name is ${name}|

      <div th:class="'content'">...</div> <span th:text="|Welcome to our application, ${user.name}!|"> //Which is equivalent to: <span th:text="'Welcome to our application, ' + ${user.name} + '!'"> <span th:text="${onevar} + ' ' + |${twovar}, ${threevar}|"> 
  • 算術運算(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)
    示例一:    
    <h2 th:text="${expression} ? 'Hello' : 'Something else'"></h2> 示例二: <!-- IF CUSTOMER IS ANONYMOUS --> <div th:if="${customer.anonymous}"> <div>Welcome, Gues!</div> </div> <!-- ELSE --> <div th:unless="${customer.anonymous}"> <div th:text=" 'Hi,' + ${customer.name}">Hi, User</div> </div> 
  • Special tokens:

    • No-Operation: _
  • switch

     
    image
 
image
  • 循環

    渲染列表數據是一種非常常見的場景,例如現在有n條記錄需要渲染成一個表格或li列表標簽該數據集合必須是可以遍歷的,使用th:each標簽

     
    image
    代碼分析:
    循環,在html的標簽中,加入th:each=“value:${list}”形式的屬性,如可以迭代prods的數據 又如帶狀態變量的循環:
    
     
    image
 
image
 
image

​ 利用狀態變量判斷:

 
image

7.設置屬性值

1. th:attr 
    任何屬性值,語法格式:th:attr="屬性名=屬性值,[屬性名=屬性值]" 
    屬性值如果是使用表達式的話:通常有URL表達式@{}和變量表達式${}        
    但此標簽語法不太優雅    
    示例:        
th:attr="action=@{/subscribe}" //當然也可以直接使用th:action                 
th:attr="src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}" //可直接使用th:src  
th:attr="value=#{subscribe.submit}"//可直接使用th:value        
<input type="checkbox" name="active" th:attr="checked=${user.active}"/> 設置多個屬性在同一時間,有兩個特殊的屬性可以這樣設置: th:alt-title 和 th:lang-xmllang th:src="@{/images/gtvglogo.png}" th:alt-title="#{logo}" 2.前置和后置添加屬性值 th:attrappend 和 th:attrprepend 主要對class和style兩個屬性 class="btn" th:attrappend="class=${' ' + cssStyle}" 轉換后:class="btn warning" 3.還有兩個特定的添加屬性 th:classappend 和 th:styleappend 與上面的attrappend功能一樣 class="row" th:classappend="${prodStat.odd}? 'odd'" 轉換后:奇數行class="row odd",偶數行class="row" 

8.內嵌變量Utilities

為了模板更加易用,Thymeleaf還提供了一系列Utility對象(內置於Context中),可以通過#直接訪問。

dates : java.util.Date的功能方法類    
calendars : 類似#dates,面向java.util.Calendar    
numbers : 格式化數字的功能方法類    
strings : 字符串對象的功能類,contains,startWiths,prepending/appending等等    
objects: 對objects的功能類操作    
bools: 對布爾值求值的功能方法    
arrays:對數組的功能類方法    
lists: 對lists功能類方法    
sets    
maps
代碼示例:    
${#dates.format(dateVar, 'dd/MMM/yyyy HH:mm')}    
${#dates.arrayFormat(datesArray, 'dd/MMM/yyyy HH:mm')}    
${#dates.listFormat(datesList, 'dd/MMM/yyyy HH:mm')}    
${#dates.setFormat(datesSet, 'dd/MMM/yyyy HH:mm')}    
${#dates.createNow()}    
${#dates.createToday()}    
${#strings.isEmpty(name)}    
${#strings.arrayIsEmpty(nameArr)}    
${#strings.listIsEmpty(nameList)}    
${#strings.setIsEmpty(nameSet)}    
${#strings.startsWith(name,'Don')}                  
// also array*, list* and set*    
${#strings.endsWith(name,endingFragment)}           
// also array*, list* and set*    
${#strings.length(str)}     
${#strings.equals(str)}    
${#strings.equalsIgnoreCase(str)}    
${#strings.concat(str)}    
${#strings.concatReplaceNulls(str)}    
${#strings.randomAlphanumeric(count)}//產生隨機字符串

9.thymeleaf布局

 
image
 
image

10.附錄

 
image
 
image
 
image


作者:胖先森
鏈接:https://www.jianshu.com/p/d1370aeb0881
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM