使用模板的要點:
頁面主體結構固定,具體參數可變,儘量讓參數動態化,才能提升模板的複用性
===================================================================
Thymeleaf's core is a DOM processing enginejavascript
Processor: An Object which applies some logic to a DOM nodecss
Standard Dialect: a set of processor,provided by Thymeleaf core libraryhtml
Template Engine : can be configured several dialects at a time,called process chain
================================================================
Template Resolver
Template Resolvers are objects that implement an interface from the Thymeleaf API called org.thymeleaf.templateresolver.ITemplateResolver
public TemplateResolution resolveTemplate(final TemplateProcessingParameters templateProcessingParameters);
All implementaion class :
-ClassLoaderTemplateResolver
-FileTemplateResolver
-ServletContextTemplateResolver
-UrlTemplateResolver
Initial Template Engine use ServletContextTemplateResolver
private static void initializeTemplateEngine() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
// XHTML is the default mode, but we will set it anyway for better understanding of code
templateResolver.setTemplateMode("XHTML");
// This will convert "home" to "/WEB-INF/templates/home.html"
// 設置模板的前置路徑
templateResolver.setPrefix("/WEB-INF/templates/");
//設置模板統一的後綴名
templateResolver.setSuffix(".html");
// Set template cache TTL to 1 hour. If not set, entries would live in cache until expelled by LRU
templateResolver.setCacheTTLMs(Long.valueOf(3600000L));
// Cache is set to true by default. Set to false if you want templates to
// be automatically updated when modified.
templateResolver.setCacheable(true);
templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
}
1.new one TemplateResolver instance
2.config the resolver
3.new Template engine
4.set resolver to this engine
5.invoke engine's process method to work
============================================================================
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-3.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
或者使用下面的文檔聲明也能夠,這樣就沒有Thymeleaf對文檔的校驗功能了,由於沒有引入對應的DTD,並且IDE可能會提示錯誤,可是不影響對模板的解析。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
============================================================================
#{}
specify that a text should correspond to a specific message
引用外部文件(message)中的內容,進行替換
首先,須要指定外部文件的位置,若是沒有指定,則使用默認的Standard Message Resolver
會到/WEB-INF/templates/下尋找properties文件
home_en.properties文件是如何被定爲到的呢?
經過WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());
其中,request.getLocale()就說明了當前系統的所在地,就能肯定讀取en/zh_CN了。
固然,能夠配置外部文件的位置!
th:text="#{home.welcome}"
The th:text attribute, which evaluates its value expression and sets the result of this evaluation as the body of the tag it is in
th:text 計算表達式的結果,並使用這個結果來替換當前標籤中的內容
============================================================================
public void process(
final HttpServletRequest request, final HttpServletResponse response,
final ServletContext servletContext, final TemplateEngine templateEngine)
throws Exception {
WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());
ctx.setVariable("today", Calendar.getInstance());
templateEngine.process("home", ctx, response.getWriter());
}
Thymeleaf中提供了2個實現IContext的實現類
org.thymeleaf.context.Context implements IContext
org.thymeleaf.context.WebContext implements IWebContext
WebContext 提供了更多的方法可用
=============================================================================
Unescaped Text
照原樣對文本進行輸出,不對> < 進行轉義
th:utext="<b>Big Character</b>" 將輸出爲:<b>Big Character</b>
=============================================================================
Using and displaying variables
1.設置變量
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy");
Calendar cal = Calendar.getInstance();
WebContext ctx = new WebContext(request, servletContext, request.getLocale());
ctx.setVariable("today", dateFormat.format(cal.getTime()));
templateEngine.process("home", ctx, response.getWriter());
2.在模板中使用變量
th:text="${today}"
3.使用Thymeleaf提供的內置變量,不用提早設置,直接在模板中使用
th:text="${#calendars.format(today,'dd MMMM yyyy')}"
==============================================================================
Thymeleaf Standard Dialect: the Thymeleaf Standard Expression syntax
Thymeleaf 支持的運算符和表達式的應用
全部的操做符均可以嵌套使用,很是強大!
1.Text literals: '...'
2.Number literals: 0,1.0,12.3,etc
Simple expression: 表達式語法
1.Message expression : #{}
2.Variable expression : ${}
3.Link URL expression: @{}
4.Selection Variable expression: *{}
結合th:object使用,在某個範圍內進行變量的查找,而不是在context中查找,縮小了查詢的範圍,效率如何呢?
如何沒有與th:object結合使用,*{}與${}效果同樣,由於其範圍自動擴展到context。
Binary operations: 運算符
1.String concatenation: +
2.Arithetic operatiors : +, -, *, /, %
3.Comparators: >, <, >=, <=
4.Boolean operators: and, or
5.Equality operators: ==, !=
Unary operations:
1.Minus sign(): - 負號
2.Boolean negation: !, not 否認符
Conditional operators: 條件表達式
1.If-then-else: (if)?(then):else 三元運算符
2.If-then: (if) ? (then) ,省略了else部分,若是條件不成立,返回null
3.Default: (value)?:(defaultValue) , use second value only first is null
All this operations can be combined and nested:
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown')
=================================================================================
Message 在模板中獲取消息
動態指定message的內容/甚至能夠動態指定訪問哪一個message
th:utext="#{home.welcome(${session.user.name})}",其中${session.user.name}做爲參數,替換home.welcome的映射文本中的{0}
th:utext="#{${welcomeMsgKey}(${session.user.name})}",其中${welcomeMsgKey}動態指定message文件中的key
==================================================================================
Variables 在模板中獲取數據
${...} expressions are in fact OGNL (Object-Graph Navigation Language) expressions executed
on the map of variables contained in the context.
模板中獲取變量值的方式,使用${},針對不一樣類型數據,用法以下:
/*
* Access to properties using the point (.). Equivalent to calling property getters.
* 經過.進行導航,至關於調用getters()
*/
${person.father.name}
/*
* Access to properties can also be made by using brackets ([]) and writing
* the name of the property as a variable or between single quotes.
* 使用[]等效於使用. ,可是[]在某些場合能完成.不能完成的任務
*/
${person['father']['name']}
/*
* If the object is a map, both dot and bracket syntax will be equivalent to
* executing a call on its get(...) method.
* 訪問Map集合
*/
${countriesByCode.ES}
${personsByName['Stephen Zucchini'].age}
/*
* Indexed access to arrays or collections is also performed with brackets,
* writing the index without quotes.
* 訪問數組
*/
${personsArray[0].name}
/*
* Methods can be called, even with arguments.
* 調用對象的方法
*/
${person.createCompleteName()}
${person.createCompleteNameWithSeparator('-')}
=======================================================================================
Expression utility objects 在模板中使用內置對象
內置對象,提供了不少方便的功能,日期格式化,字符串處理,數字格式化等
#dates, formatting,component extraction,etc
#calendars
#numbers, formatting numeric objects.
#strigns, contains,startsWith,prepending/appending,etc
#bools
#arrays
#lists
#sets
#maps
#aggregates, creating aggregates on arrays or collections
#messages, equal to using #{}
#ids, deal with id attributes, eg: as a result of an iteration
#ctx等等,還有不少!
======================================================================================
Link URLs 在模板中使用URL連接
@{}
Several types of URLs:
1.Absolute URL,like http://localhost:8080/thymeleaf
2.Relative URL,which can be:
Page-relative,like: user/login.html 頁面相對定位
Context-relative,like: /itemdetails?id=1 (context name in server will be added automatically)項目根路徑定位,模板解析時會自動加上應用程序的名稱做爲前綴
Server-relative,like: ~/billing/processInvoice (allow calling URLs in another context in the same server) 相同服務器根目錄下的定位
如何要使用相對定位,必須指定一個實現了IWebcontext接口的對象,由於須要從其中獲取httprequest對象,從而獲得應用程序的根路徑,才能處理相對路徑
相對路徑,而且在URL上使用OGNL表達式取參數,並且themeleaf會自動對URL進行編碼:
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>
<a th:href="@{'/details/'+${user.login}(orderId=${o.id})}">view</a>
=======================================================================================
Literals 模板中使用簡單文本
字符串/數字
a.原樣輸出
<p>The year is <span th:text="2011">1492</span>.</p>
b.字符串拼接
th:text="'The name of the user is ' + ${user.name}"
========================================================================================
Arithmetic operations 模板中對變量進行算數運算
+ - * / %
有兩種計算方式,均可以。
1.使用Thymeleaf進行運算--->先OGNL表達式取到變量值,而後thymeleaf再進行運算
th:with="isEven=(${prodStat.count} % 2 == 0)"
2.使用OGNL進行運算--->直接在OGNL表達式中進行運算
th:with="isEven=${prodStat.count % 2 == 0}"
========================================================================================
Comparators and Equality 模板中使用比較符和等號
模板中不能直接使用 > < >= <=
須要進行轉義:
> gt;
< lt;
>= ge; gte;
<= le; lte;
== eq;
!= ne; neq;
th:text="'Execution mode is ' + ( (${execMode} == 'dev')? 'Development' : 'Production')"
=======================================================================================
Conditional expressions 三元運算,第一個表達式的結果爲boolean類型
if ? then : else ---> A ? B : C
<tr th:class="${row.even}? 'even' : 'odd'"> 設置tr的class屬性,用來控制行的顯示效果很方便
嵌套使用條件表達式:
<tr th:class="${row.even}? (${row.first}? 'first' : 'even') : 'odd'"> 靈活控制首行,偶數行,奇數行的class屬性值,便於進行css樣式定義
還能夠省略else部分,當表達式結果爲false,返回null,不然返回'alt'
<tr th:class="${row.even}? 'alt'">
...
</tr>
======================================================================================
Default Expression 具備默認值的表達式,第一個表達式的結果只要不爲null,就取第一個表達式的結果
being the second one evaluated only in the case of the first one returning null .
A ?: B ---> A不爲null,則取A,不然取B
若是第一個表達式的計算結果爲null,則取第二個表達式的結果
<div th:object="${session.user}">
...
<p>Age: <span th:text="*{age}?: '(no age specified)'">27</span>.</p>
</div>
等效於:
<p>Age: <span th:text="*{age != null}? *{age} : '(no age specified)'">27</span>.</p>
條件表達式嵌套:
<p>Name: <span th:text="*{firstName} ?: (*{admin} ? 'Admin' : #{default.username})">Sebastian</span>.</p>
=========================================================================================
靜態方法的調用
<p th:text="${@myapp.translator.Translator@translateToFrench('textVar')}">Some text here...</p>
==========================================================================================
******************************************************************************************
Setting the value of any attribute 在模板中對目標設置任何屬性,action, class, value, etc
很是強大,不只處理HTML模板方便,處理FO-XSL(PDF模板)同樣通用。
設置action屬性
<form action="subscribe.html" th:attr="action=@{/subscribe}">
設置value屬性
<input type="submit" value="Subscribe me!" th:attr="value=#{subscribe.submit}"/>
一次設置多個屬性
<img src="../../images/gtvglogo.png" th:attr="src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}"/>
模板處理後的結果---> <img src="/gtgv/images/gtvglogo.png" title="Logo de Good Thymes" alt="Logo de Good Thymes" />
設置屬性更優雅的方式(僅在HTML模板中有效,處理PDF模板,只能用th:attr=""來實現,由於PDF模板中的屬性在Thymeleaf中好像沒有定義)
<input type="submit" value="Subscribe me!" th:value="#{subscribe.submit}"/>
<form action="subscribe.html" th:action="@{/subscribe}">
<li><a href="product/list.html" th:href="@{/product/list}">Product List</a></li>
Themeleaf支持HTML中幾乎全部的屬性定義,使用時具體參考Thymeleaf的手冊
th:bgcolor,th:border,th:cellpadding,th:cellspacing, th:colspan,th:align,th:src,th:width,th:size 等等
控制樣式:
第一種方式直接在tr上定義css樣式,如bgcolor,border等
第二種方式,在tr上定義class屬性,經過外部css樣式進行控制。(複雜樣式,採用第二種方案)
============================================================================================
Appending and prepending 在已有屬性上追加屬性
th:attrappend 追加
th:attrprepend 放到前面
<input type="button" value="Do it!" class="btn" th:attrappend="class=${' ' + cssStyle}" />
---> <input type="button" value="Do it!" class="btn warning" />
遍歷prods集合,每次生成一行
<tr th:each="prod : ${prods}" class="row" th:classappend="${prodStat.odd}? 'odd'">
<td>${prod.name}</td>
</tr>
=============================================================================================
Fixed-value boolean attributes 設置某些具備固定值的屬性
XHTML/HTML5中,有一些特殊的屬性,要麼沒有值,要麼爲某個固定的值
checked
selected
disabled
mutiple
readonly
若是計算結果爲true,則使用它的固定值,不然不處理。
<input type="checkbox" name="active" th:checked="${user.active}" />
還有:
th:autofocus
th:default
th:hidden
...
===============================================================================================
***********************************************************************************************
Iteration 循環遍歷
th:each="obj : ${objList}" 循環所在標籤的片斷,每次片斷中用到的都是當前遍歷到的對象
後臺準備數據
public void process(
HttpServletRequest request, HttpServletResponse response,
ServletContext servletContext, TemplateEngine templateEngine) {
ProductService productService = new ProductService();
List<Product> allProducts = productService.findAll();
WebContext ctx = new WebContext(request, servletContext, request.getLocale());
ctx.setVariable("prods", allProducts);
templateEngine.process("product/list", ctx, response.getWriter());
}
模板中進行遍歷,每次遍歷生成一個tr,td列取到的對象爲當前遍歷到的對象
<tr th:each="prod : ${prods}">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
Keeping iteration status 跟蹤迭代過程當中的狀態變化
遍歷過程當中,提供了以下屬性:
index starting with 0
count starting with 1
size total amount of elements in the iterated variables
current current object
even/odd boolean value,第偶數個/奇數個
first/last boolean value.第1個/最後1個
在th:each中,在iter variable變量後面,定義一個status variable,經過該變量來獲取遍歷過程當中的狀態
<tr th:each="prod,iterStat : ${prods}" th:class="${iterStat.odd}? 'odd'">
prefix 前綴
suffix 後綴
If you don't explicitly set an iteration variable, Thymeleaf will always create one for you by suffixing 'Stat' to the name of the iter variable。
若是沒有定義status variable,thymeleaf會自動爲咱們提供一個來使用,經過在iter variable後面添加後綴Stat來使用。
<tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">
================================================================================================
************************************************************************************************
Conditional evaluation 條件語句
Simple conditionals: "if" and "unless"
在某種條件成立時,對某個fragment進行處理:
當th:if條件成立時,該標籤中其它th:*標籤纔會發揮做用,若是條件不成立,則th:*不會執行
<a href="comments.html"
th:href="@{/product/comments(prodId=${prod.id})}"
th:if="${not #lists.isEmpty(prod.comments)}">view</a>
th:if 判斷表達式結果是否爲真的規則:
If value is not null:
value is a boolean and is true;
value is a number and is non-zero;
value is a character and is non-zero;
value is a String and is not "false", "off" or "no";
value is not a boolean, a number, a character or a String;
If value is null, th:if will evaluate to false;
另外,還能夠用th:unless,進行條件控制。若是條件爲真,則不執行。
<a href="comments.html"
th:href="@{/comments(prodId=${prod.id})}"
th:unless="${#lists.isEmpty(prod.comments)}">view</a>
====================================================================================
Switch statement Switch選擇語句
Note that as soon as one th:case attribute is evaluated as true , every other th:case attribute in the same switch context is evaluated as false .
The defaul t option is speci fied as th:case="*" :
<div th:switch="${user.role}">
<p th:case="'admin'">User is an administrator</p>
<p th:case="#{roles.manager}">User is a manager</p>
<p th:case="*">User is some other thing</p>
</div>
======================================================================================
Template Layout 模板佈局/模板重用
Including template fragments
th:fragment
th:include
用法:
在某個標籤中使用th:fragment屬性定義一個變量名,而後在其餘模板中經過th:include,便可引入。
a.html
<div th:fragment="hello"> 定義一個fragment,並取名爲"hello"
include me.!
</div>
b.html
<div th:include="a :: hello">what?</div> 從名稱爲a.html的模板中引入名稱爲"hello"的fragment
***還能夠不使用th:fragment屬性進行引入,經過DOMSelector
"templatename::[domselector]" like XPath expressions.
***將模板整個引入
"templatename"
th:include中一樣能夠嵌套使用表達式
<div th:include="footer :: (${user.isAdmin}? #{footer.admin} : #{footer.normaluser})"></div>
th:include
引入fragment中定義的內容
th:substituteby
引入fragment所在標籤和內容,並替換當前的標籤
如:
footer.html
<footer th:fragment="copy">
© 2011 The Good Thymes Virtual Grocery
</footer>
main.html
--------------------------------------------> th:include只引入內容
<div th:include="footer :: copy"></div>
result:
<div>
© 2011 The Good Thymes Virtual Grocery
</div>
--------------------------------------------> 整個引入,並替換掉host tag
<div th:substituteby="footer :: copy"></div>
result:
<footer>
© 2011 The Good Thymes Virtual Grocery
</footer>
============================================================================
Removing template fragments
th:remove 爲了靜態顯示時提供充分的數據,可是在模板被解析後,又不須要這些模擬的數據,須要將其刪除
可選屬性:
th:remove="all", 刪除全部
th:remove="all-but-first",刪除全部,但保留第一個
th:remove="body", 刪除內容,但保留標籤
th:remove="tag", 刪除標籤,但保留內容
=============================================================================
Local variables 模板中自定義變量
th:with="fisrtPerson=${persons[0]}"
使用自定義的變量:
<span th:text="${firstPer.name}">
<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>
原理:定義的變量將被添加到context的map中,這樣就能像其它變量同樣被使用到了。
自定義變量的有效範圍:僅在被定義的標籤內有效,好比,上面的firstPerson,僅在當前div中有效
另外一個用途:
定義變量存放message中的配置
而後在表達式中用
如,從message中獲取date.format的配置,而後複製給變量df,而後在其它地方(自定義變量所在標籤內)進行使用
<p th:with="df=#{date.format}">
Today is: <span th:text="${#calendars.format(today,df)}">13 february 2011</span>
</p>
也能夠直接:
<p>
Today is: <span th:with="df=#{date.format}" th:text="${#calendars.format(today,df)}">13 february 2011</span>
</p>
優先級的問題:
th:with 優先級高於 th:text
th:each 優先級高於 th:*
==============================================================================================
Attribute precedence 屬性的優先級問題
Thymeleaf attributes have a numeric precedence:
1 fragment inclusion th:include
2 fragment iteration th:each
3 condition 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, etc
7 Text th:text, th:utext
8 Fragment specification th:fragment
9 Fragment removal th:remove
<ul th:each="item : ${items}">
<li th:text="${item.description}">Item description here...</li>
</ul>
因爲th:each的優先級高於其它th:*,因此能夠簡寫爲:
<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>
=======================================================================================
Inlining
Text inlining
好處:簡化書寫
弊端:以prototype呈現(靜態地打開網頁),將原樣顯示
用法,在標籤上定義th:inline="text"
該標籤中任意地方均可以使用內聯樣式獲取數據
<p>Hello, <span th:text="${session.user.name}">Sebastian</span>!</p>
簡化爲:
<p>Hello, [[${session.user.name}]]!</p>
parent tag中定義
<body th:inline="text">
...
<p>hello:[[${session.user.name}]]</p>
...
<body>
JavaScript inlining
<script th:inline="javascript">
/*<![CDATA[*/
...
var username = [[${session.user}]];
...
/*]]>*/
</script>
thymeleaf將自動對user對象進行轉換,並且轉換爲javascript中的user對象
<script th:inline="javascript">
/*<![CDATA[*/
...
var user = {'age':null,'firstName':'John','lastName':'Apricot','name':'John Apricot','nationality':'Antarctica'};
...
/*]]>*/
</script>
=================================================================================
Validation and Doctypes
Validating templates
使用Thymeleaf的DTD進行校驗和聲明Thymeleaf的命名空間
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-3.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
Doctype translation Thymeleaf對模板處理完成後,會自動將DOCTYPE轉換爲正確的類型,這樣瀏覽器端就能正常解析了!
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-3.dtd">
After Thymeleaf process the template, will automatically transformate the DOCTYPE to:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
===================================================================================
Template Resolver
org.thymeleaf.templateresolver.ClassLoaderTemplateResolver
return Thread.currentThread().getContextClassLoader().getResourceAsStream(templateName);
org.thymeleaf.templateresolver.FileTemplateResolver
return new FileInputStream(new File(templateName));
org.thymeleaf.templateresolver.UrlTemplateResolver
return (new URL(templateName)).openStream();
--->
Prefix and suffix:
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
Encoding to be appl ied when reading templates:
templateResolver.setEncoding("UTF-8");
Defaul t template mode, and patterns for defining other modes for speci fic templates:
// Default is TemplateMode.XHTML
templateResolver.setTemplateMode("HTML5");
templateResolver.getXhtmlTemplateModePatternSpec().addPattern("*.xhtml");
Defaul t mode for template cache, and patterns for defining whether speci fic templates are cacheable or not:
// Default is true
templateResolver.setCacheable(false);
templateResolver.getCacheablePatternSpec().addPattern("/users/*");
TTL in mi l l iseconds for parsed template cache entries originated in this template resolver. If not set, the only way to
remove an entry from the cache wi l l be LRU (cache max size exceeded and the entry is the oldest).
// Default is no TTL (only LRU would remove entries)
templateResolver.setCacheTTLMs(60000L);
Also, a Template Engine can be set several template resolvers, in which case an order can be establ ished between them for
template resolution so that, if the first one is not able to resolve the template, the second one is asked, and so on:
When several template resolvers are applied, it is recommended to specify patterns for each template resolver so that
Thymeleaf can quickly discard those template resolvers that are not meant to resolve the template, enhancing performance.
Doing this is not a requi rement, but an optimization:
ClassLoaderTemplateResolver classLoaderTemplateResolver = new ClassLoaderTemplateResolver();
classLoaderTemplateResolver.setOrder(Integer.valueOf(1));
// This classloader will not be even asked for any templates not matching these patterns
classLoaderTemplateResolver.getResolvablePatternSpec().addPattern("/layout/*.html");
classLoaderTemplateResolver.getResolvablePatternSpec().addPattern("/menu/*.html");
ServletContextTemplateResolver servletContextTemplateResolver = new ServletContextTemplateResolver();
servletContextTemplateResolver.setOrder(Integer.valueOf(2));
===================================================================================
Message Resolver
The implementation being used was an org.thymeleaf.messageresolver.StandardMessageResolver object as default in web application.
you can create your own by just implementing the org.thymeleaf.messageresolver.IMessageResolver interface.
And why would you want to have more than one message resolver? for the same reason as template resolvers:
message resolvers are ordered and if the first one cannot resolve a specific message, the second one will be asked, then the third, etc.
// For setting only one
templateEngine.setMessageResolver(messageResolver);
===================================================================================
Template Cache 模板緩存管理
// Default is 50
StandardCacheManager cacheManager = new StandardCacheManager();
cacheManager.setTemplateCacheMaxSize(100);
...
templateEngine.setCacheManager(cacheManager);
// Clear the cache completely
templateEngine.clearTemplateCache();
// Clear a specific template from the cache
templateEngine.clearTemplateCacheFor("/users/userList");java