天天看點

thymeleaf 學習筆記

thymeleaf,我個人認為是個比較好的模闆,性能也比一般的,比如freemaker的要高,而且把将美工和程式員能夠結合起來,美工能夠在浏覽器中檢視靜态效果,程式員可以在應用伺服器檢視帶資料的效果。

thymeleaf是一個支援html原型的自然引擎,它在html标簽增加額外的屬性來達到模闆+資料的展示方式,由于浏覽器解釋html時,忽略未定義的标簽屬性,是以thymeleaf的模闆可以靜态運作。

由于thymeleaf在記憶體緩存解析後的模闆,解析後的模闆是基于tree的dom節點樹,是以thymeleaf适用于一般的web頁面,不适合基于資料的xml。

thymeleaf 的context,即提供資料的地方,基于web的context,即WebContext相對context增加 param,session,application變量,并且自動将request atttributes添加到context variable map,可以在模闆直接通路。

在模闆處理前,thymeleaf還會增加一個變量execInfo,比如${execInfo.templateName},${execInfo.now}等。

資料通路模式:

${...},變量引用模式,比如${myBean.property},如果用springDialect,則使用的是spring EL,如果不用spring,則用的ognl。

*{...},選擇表達式,一般是th:object之後,直接取object中的屬性。當沒有選取對象時,其功能等同${...},*{firstName}也等同于${#object.firstName},#object代表目前選擇的對象。

@{...}連結url的表達式。th:href="@{/xxx/aa.do(id=${o.id})",會自動進行url-encoding的處理。@{...}内部可以是需要計算的表達式,比如:

th:href=”@{'/details/'+${user.login}(orderId=${o.id})}"

#{...},i18n,國際化。

需要注意的:

#{${welcomeMsgKey}(${session.user.name})}:i18n message支援占位。各個表達式支援嵌套。

表達式基本對象:

#ctx:context object

#root或者#vars

#locale

#httpServletRequest

#httpSession

表達式功能對象:

#dates:java.util.Date的功能方法類。

#calendars:類似#dates,面向java.util.Calendar

#numbers:格式化數字的功能方法類。

#strings:字元串對象的功能類,contains,startWiths,prepending/appending等等。

#objects:對objects的功能類操作。

#bools:對布爾值求值的功能方法。

#arrays:對數組的功能類方法。

#lists:對lists功能類方法

#sets

#maps

#aggregates:對數組或者集合建立聚合的功能方法,

th:text="${#aggregates.sum(o.orderLines.{purchasePrice * amount})}"

#messages:在變量表達式中擷取外部資訊的功能類方法。

#ids:處理可能重複的id屬性的功能類方法。

條件操作:

(if)?(then):滿足條件,執行then。

(if)?(then):(else)

(value)?:(defalutValue)

一些标簽:

th:text="${data}",将data的值替換該屬性所在标簽的body。字元常量要用引号,比如th:text="'hello world'",th:text="2011+3",th:text="'my name is '+${user.name}"

th:utext,和th:text的差別是"unescaped text"。

th:with,定義變量,th:with="isEven=${prodStat.count}%2==0",定義多個變量可以用逗号分隔。

th:attr,設定标簽屬性,多個屬性可以用逗号分隔,比如th:attr="src=@{/image/aa.jpg},title=#{logo}",此标簽不太優雅,一般用的比較少。

th:[tagAttr],設定标簽的各個屬性,比如th:value,th:action等。

可以一次設定兩個屬性,比如:th:alt-title="#{logo}"

對屬性增加字首和字尾,用th:attrappend,th:attrprepend,比如:th:attrappend="class=${' '+cssStyle}"

對于屬性是有些特定值的,比如checked屬性,thymeleaf都采用bool值,比如th:checked=${user.isActive}

th:each, 循環,<tr th:each="user,userStat:${users}">,userStat是狀态變量,有 index,count,size,current,even,odd,first,last等屬性,如果沒有顯示設定狀态變量,thymeleaf會默 認給個“變量名+Stat"的狀态變量。

th:if or th:unless,條件判斷,支援布爾值,數字(非零為true),字元,字元串等。

th:switch,th:case,選擇語句。 th:case="*"表示default case。

th:fragment,th:include,th:substituteby:fragment為片段标記,指定一個模闆内一部分代碼為一個片段,然後在其它的頁面中用th:include或th:substituteby進行包含。

包含的格式為,格式内可以為表達式,比如th:include="footer::$(user.logined)?'logined':'notLogin'":

"templatename::fragname",指定模闆内的指定片段。

"templateName::[domselector]",指定模闆的dom selector,被包含的模闆内不需要th:fragment.

”templatename",包含整個模闆。

th:include和th:substituteby的差別在于前者包含片段的内容到目前标簽内,後者是用整個片段(内容和上一層)替換目前标簽(不僅僅是标簽内容)。

th:remove="all|body|tag|all-but-first",一般用于将mock資料在真實環境中移除,all表示移除标簽以及标簽内容,body隻移除内容,tag隻移除所屬标簽,不移除内容,all-but-first,除第一條外其它不移除。

由 于一個标簽内可以包含多個th:x屬性,其先後順序為:include,each,if/unless/switch/case,with,attr /attrprepend/attrappend,value/href,src ,etc,text/utext,fragment,remove。

内聯文本:[[...]]内聯文本的表示方式,使用時,必須先用th:inline="text/javascript/none"激活,th:inline可以在父級标簽内使用,甚至作為body的标簽。内聯文本盡管比th:text的代碼少,但是不利于原型顯示。

内聯js:

<scriptth:inline="javascript">
 
/*<![CDATA[*/
 
...
 
var username = /*[[${sesion.user.name}]]*/ 'Sebastian';
 
...
 
/*]]>*/
 
</script>      

js附加代碼:

/*[+
  
var msg = 'This is a working application';
  
+]*/      

js移除代碼:

/*[- */
   
var msg = 'This is a non-working template';
   
/* -]*/      

模闆緩存:

1、指定特定的緩存:

templateResolver.setCacheable(false);

templateResolver.getCacheablePatternSpec().addPattern("/users/*");

2、清除緩存:

templateEngine.clearTemplateCache();

templateEngine.clearTemplateCacheFor("/users/userList");

補充點url知識:

1、絕對路徑:http://news.sina.com.cn

2、相對路徑:

    2.1:頁面相對路徑,一般指相對目前請求的url,比如 aa.do

    2.2:上下文相對,比如/xxx/aa.do