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';
/* -]*/
模板緩存:
一、指定特定的緩存:
templateResolver.setCacheable(false);
templateResolver.getCacheablePatternSpec().addPattern("/users/*");
二、清除緩存:
templateEngine.clearTemplateCache(); templateEngine.clearTemplateCacheFor("/users/userList");
補充點url知識: 一、絕對路徑:http://news.sina.com.cn 二、相對路徑: 2.1:頁面相對路徑,通常指相對當前請求的url,好比 aa.do 2.2:上下文相對,好比/xxx/aa.do 2.3:服務器相對路徑,好比~/other/xxx/aa.do,容許切換到相同服務器不一樣上下文的路徑。