模板基礎(chǔ)
- 插值
${....}
:解析變量輸出真實(shí)的值 - FTL標(biāo)簽 以
#
開(kāi)頭妒穴,用戶(hù)自定義標(biāo)簽以@
開(kāi)頭 - 注釋
<#!-- 注釋內(nèi)容-->
- directives 指令:就是所謂的FTL標(biāo)簽痹兜,這些指令在和HTML中的元素中關(guān)系是一致的
-
<#if xxx> xxxx </#if>
和<#if 條件> xxx <else> </#if>
- include 指令: 例如
<# include "/xxxx.html">
這樣會(huì)將這個(gè)文件解析添加到這個(gè)ftl文件中 - 各種數(shù)據(jù)類(lèi)型的build-in
-
List 集合 指令
<pre>
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
//會(huì)被解析成下面的
<tr><td>mouse<td>50 Euros
<tr><td>elephant<td>5000 Euros
<tr><td>python<td>4999 Euros
</pre> -
Map類(lèi)型:遍歷Map:Map mushat
<pre>
<#list myMapper keys as k >
${k} : ${myMapper[k]}
</ #list>
</pre>
- 自定義Bean 通過(guò)調(diào)用屬性名字的來(lái)訪(fǎng)問(wèn)相應(yīng)屬性
<#if person??>
name : ${person.name}
age : ${person.age}
</#if>
- 處理不存在的變量
- 如果user 變量存在的話(huà)岛请,會(huì)將括號(hào)括中的標(biāo)簽內(nèi)容解析顯示出來(lái)
<#if object??>
object exist
<#else>
object not exist
<#/if>
- 如果 user 變量不存在 "anonymous" 會(huì)替代填充
<h1>Welcome ${user!"Anonymous"}!</h1>
- 子程序 P:
- 方法和函數(shù)
- 用戶(hù)自定義指令
- 宏指令:
Programmer Guild
- 在Freemarker模板中蕉鸳,可用的變量都是實(shí)現(xiàn)了freemarker.template.TemplateModel接口的Java對(duì)象。你自己的數(shù)據(jù)模型(例如你自定義的 一個(gè)JavaBean)會(huì)被替換成TemplateModel類(lèi)型。這種特性叫做Object Wraaper 對(duì)象包裝
- 各個(gè)Freemarker支持的標(biāo)量哎Java層的實(shí)現(xiàn)
- String : SimpleScalar
- Hash : SimpleHash,在FTL 中,容器是一成變的阅懦。就是說(shuō)和二,你不能替換和移除容器中的子變量
- List : SimpleSequence
- Collection : SimpleCollection
- Date : SimpleDate
- Method :
定義實(shí)現(xiàn)自定義宏
定義實(shí)現(xiàn)自定義方法
-
首先通過(guò)繼承
TemplateMethodModelEx
實(shí)現(xiàn)自己要定義的方法類(lèi)
<pre>
public class IndexMethod implements TemplateMethodModelEx {
@Override
public Object exec(List arguments) throws TemplateModelException {
if (arguments.size() != 2) {
throw new TemplateModelException("Wrong arguments");
}
int result = -1;
if (!(arguments.get(0) instanceof SimpleScalar &&arguments.get(1) instanceof SimpleScalar))
return new SimpleNumber(result);
String first = ((SimpleScalar)arguments.get(0)).getAsString();
String second = ((SimpleScalar)arguments.get(1)).getAsString();//arguments.stream().forEach(element -> System.out.println(element)); return new SimpleNumber(second.indexOf(first)); }
}
</pre> 在向template 傳值時(shí)徘铝,例如將上面的 類(lèi)
<pre>
Map root = new HashMap();
root.add("indexOf",new IndexMethod());
</pre>在flt 中這樣用
<pre>
<#assign x = "something">
${indexOf("met", x)}
${indexOf("foo", x)}
</pre>
FAQ
- SimpleHash VS DefaultMapAdapter
- SimpleHash相對(duì)于 DefalutMapAdapter 來(lái)說(shuō),效率更高
- 如果你從Template Entry只取出2次以下時(shí)惯吕,DefaultMapAdapter的效率高于SimpleHash.相反的就應(yīng)該使用DefaultMapAdapter