6)Thymelead th:with 區域性變數 與 屬性優先順序 和 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>