1. 程式人生 > >6)Thymelead th:with 區域性變數 與 屬性優先順序 和 Thymeleaf 註釋

6)Thymelead th:with 區域性變數 與 屬性優先順序 和 Thymeleaf 註釋

目錄

區域性變數

編碼示例

屬性優先順序

Thymeleaf 註釋

ThymeLeaf 解析器級註釋

Thymeleaf 專有註釋


區域性變數

     如同 JSP 中 JSTL 的 <c:set var="j" value="${1}"/> 標籤可以用於設定變數值和物件屬性一樣,Thymeleaf 中可以使用 th:with 進行指定區域性變數,區域性變數是指定義在模版⽚段中的變數,並且該變數的作⽤域為所在的模版⽚段。

<tr th:each="user : ${userList}">   ...   </tr>

    1)如上所示 th:each 迭代中的 user 其實就是區域性變數,僅在 <tr> 標籤範圍內可⽤,包括所有子元素,可⽤於在該標籤中執⾏優先順序低於 th:each 的任何其他 th:* 屬性。
     Thymeleaf 提供 th:with 屬性宣告區域性變數,其語法與屬性值分配類似:

<div th:with="firstPer=${persons[0]}">
   <p>The name of the first person is <span th:text="${firstPer.name}"

>Julius Caesar</span>.</p>
</div>

     當 th:with 被處理時,firstPer 變數被建立為區域性變數並被新增到來⾃上下⽂ map 中,以便它可以與上下⽂中宣告的任何其他變數⼀起使⽤,但只能在包含的 <div> 標籤內使⽤。

     2)可以使用同時定義多個變數,用逗號隔開:

<div th:with="firstPer=${persons[0]},secondPer=${persons[1]}">
   <p>The name of the first person is <span th:text="${firstPer.name}"

>Julius Caesar</span>.</p>
   <p>But the name of the second person is<span th:text="${secondPer.name}">Marcus Antonius</span>.</p>
</div>

    3) th:with 屬性允許重⽤在同⼀屬性中定義的變數:

<div th:with="company=${user.company + ' Co.'},account=${accounts[company]}">...</div>

編碼示例

<!--定義變數 userName='Admin',可在整個 body 中進行使用-->
<body th:with="userName='Admin'">
<p>當前登入使用者:<span th:text="${userName}"></span></p>

<!--後臺傳值:model.addAttribute("userList", userList),userList 中有5個User-->
<div th:with="userFirst=${userList[0]}">
    <p>我:<span th:text="${userFirst}"></span></p>
</div>

<!--一次定義三個變數:withId、withInfo、isMarry-->
<!--後臺傳值:model.addAttribute("id", null),於是 withId 的值也為nuLl-->
<!--後臺傳值:model.addAttribute("info", "Love you 中國");-->
<!--後臺傳值:model.addAttribute("isMarry", true);-->
<div th:with="withId=${id},withInfo=${info},isMarry=${isMarry}">
    <p>withId:<span th:text="${withId}"></span></p>
    <p>withInfo:<span th:text="${withInfo}"></span></p>
    <p>isMarry:<span th:text="${isMarry}"></span></p>
    <p></p>
</div>

<!--一次定義兩個變數 id 與 flag ,且 flag 的值使用到了 id 變數-->
<div th:with="id=9527,flag=${id}+'_flag'">
    <p>id:<span th:text="${id}"></span></p>
    <p>flag:<span th:text="${flag}"></span></p>
</div>
</body>

屬性優先順序

     當在同⼀個標籤中寫⼊多個 th:* 屬性時會發⽣什麼? 例如:

<ul>
   <li th:each="item : ${items}" th:text="${item.description}">Item description here...</li>
</ul>

     期望是 th:each 屬性在 th:text 之前執⾏,以便得到想要的結果,但是 HTML / XML 標準對於標籤屬性的渲染順序沒有任何定義, 因此 Thyme Leaf 如果要達到這種效果,必須在屬性本身中建⽴優先機制,以確保這些屬性按預期⼯作。因此,所有的Thymeleaf 屬性都定義⼀個數字優先順序,以便確定在標籤中按順序執⾏。優先順序清單如下:

Order(順序) Feature(特徵) Attributes(屬性)
1 Fragment inclusion th:insert 、th:replace
2 Fragment iteration th:each
3 Conditional evaluation th:if 、th:unless、th:switch、 th:case
4 Local variable definition th:object 、th:with
5 General attribute modification th:attr、 th:attrprepend、th:attrappend
6 Specific attribute modification th:value、 th:href、 th:src...
7 Text (tag body modification) th:text 、th:utext
8 Fragment specification th:fragment
9 Fragment removal th:remove

     這個優先機制意味著與屬性位置並無關係,只與屬性名有關:

<ul>
   <li th:each="item : ${items}" th:text="${item.description}">Item description here...</li>
</ul>

等價於

<ul>
   <li th:text="${item.description}" th:each="item : ${items}">Item description here...</li>
</ul>

Thymeleaf 註釋

ThymeLeaf 解析器級註釋

    標準 HTML/XML 註釋 <!- ... - > 可以在 Thymeleaf 模板中的任何地⽅使⽤,這些註釋中的所有內容都不會被 Thymeleaf 處理,並將逐字複製到結果中。

     Thymeleaf 解析器級註釋塊被解析時,Thymeleaf 直接將它們從模板中刪除。也就說是通過 ThymeLeaf 渲染時,在瀏覽器 F12 也將無法再看到被註釋內容。

格式如下:

格式1

<!--/* <div> you can see me only before Thymeleaf processes me!</div> */--> 

格式2

<!--/*-->
<div> you can see me only before Thymeleaf processes me!</div>

<div> you can see me only before Thymeleaf processes me!</div>
<!--*/-->

1)格式1 中 顯然就是在 html 註釋的基礎上加了 /* 與 */ ,這意味著使用 Thymeleaf 渲染訪問時,瀏覽器 F12 無法看到被註釋的內容,但是如果不通過 Thyneleaf 渲染,而是以原型訪問時,瀏覽器 F12 可以看到被註釋的內容。

2)格式2 中,使用 Thymeleaf 渲染訪問時,瀏覽器不顯示被註釋的內容(因為被刪除了),F12 也無法看到被註釋的內容,但是如果不通過 Thyneleaf 渲染,而是以原型訪問時,瀏覽器會直接顯然被註釋的內容。

<body>
<!--普通 html 註釋:China-->
<p>中國</p>

<!--ThymeLeaf 解析器級註釋方式1-->
<!--/* <div> you can see me only before Thymeleaf processes me!</div> */--> 

<!--ThymeLeaf 解析器級註釋方式2-->
<!--/*-->
<div> you can see me only before Thymeleaf processes me!</div>
<div> you can see me only before Thymeleaf processes me!</div>
<!--*/-->
</body>

Thymeleaf 專有註釋

     Thymeleaf 專有註釋格式如下:

<!--/*/
....
/*/-->

     可以看出是在 Html 註釋的基礎上加上了 /*/,它的作用是當模板被靜態開啟(即作為原型)時,這些被註釋的內容將會被註釋掉,而通過 Thymeleaf 渲染時,<!--/*/ 與 /*/--> 會被自動刪除,其中的內容都將進行正常顯示。這與上面 解析器級註釋方式2 剛好相反,解析器級註釋方式2 是作為原型開啟時可以顯示,而 Thymeleaf 渲染時會被刪除。

<body>
<!--後臺傳值:model.addAttribute("info", "Love you 中國");-->
<!--/*/
<span>江山代有才人出</span>
/*/-->

<!--/*/
<div th:text="${info}">
...
</div>
/*/-->
</body>