1、 模板+ 數據模型= 輸出
2、 MVC模式:Model-View-Controller的縮寫,中文翻譯爲"模型-視圖-控制器"。
3、 哈希表通過可查找的名稱來訪問存儲的其他空間
4、 用數組的方括號方式來訪問一個序列的子變量:animals[0].name;whatnot.fruits[1],索引通常從零開始。
5、 標量存儲單一的值,這種類型的值可以是字符串,數字,日期/時間或者是布爾值。
6、 ${…}:FreeMarker將會輸出真實的值來替換花括號內的表達式。
FTL tags標籤(FreeMarker 模板的語言標籤):這些標籤的使用一般以符號#開頭。(用戶自定義的FTL標籤使用@符號來代替#)。
Comments註釋:FreeMarker的註釋和HTML的註釋相似,但是它用<#--和-->來分隔。
directives指令就是所指的FTL標籤。這指令在HTML的標籤(如<table>和</table>)元素(如table元素)中的關係是相同的
7、 使用if指令可以有條件地跳過模板的一部分,
我們尊敬的領導是if條件中那唯一的user變量值,當它和“Big Joe”相同時才顯示出來。當condition的判斷結果爲false(布爾值)時,在<#ifcondition>和</#if>標籤之間的內容將會被略過。
8、 使用<#else>標籤可以指定當條件爲假時程序可以執行的內容。
9、 list指令的一般格式爲:<#list sequence asloopVariable>repeatThis</#list>
sequence:序列;repeatThis:在給定的sequence遍歷時的每項中重複,從第一項開始,一個接着一個。
10、include指令:插入其他文件的內容到當前的模板中。
Include裏面包含的是一個網址,顯示的是網址裏面的全部內容!
11、處理不存在變量
通過放置??在變量名後面來詢問FreeMarker一個變量是否存在。將它和if指令合併,那麼如果user變量不存在的話將會忽略整個問候代碼段
12、數值
不需要存儲的數值也可以稱之爲數值,例如:100
當模板被執行時,計算的臨時結果也稱爲數值,比如20,120(它會打印120)
14、支持的類型有:標量:字符串;數字;布爾值;日期
容器: 哈希表;序列;集
子程序:方法和函數;用戶自定義指令
其它/很少使用:節點
15、方法和函數:
數據模型中放置了一個方法變量avg,求平均值:
16、用戶自定義指令:
假設現在有一個變量,box,它的值是用戶自定義的指令,用來打印一些特定的HTML信息,這個指令定義了一個標題和其中的信息。
17、如果能夠實現,請用自定義指令而不用函數/方法
①、輸出(返回值)的是標記(HTML,XML等)。主要原因是函數的返回結果可以自動進行XML轉義(這是因爲${…}的特性),而用戶自定義指令的輸出則不是(這是因爲<@...>的特性所致,它的輸出假定爲是標記,因此就不再轉義)。
②、副作用是重要的,而不是返回值。例如一個指令的目的是往服務器日誌中添加一個條目。(事實上你不能得到自定義指令的返回值,但有些反饋的類型是有可能設置非本地變量的)
③、會進行流程的控制(就像list或if指令那樣),但是不能在函數/方法上這麼做。
18、節點
節點的主要作用是拓撲信息,還可以存儲節點名稱,類型(字符串),命名空間(字符串)。
19、模板的總體結構(FTL是區分大小寫的)
①、Text文本:文本會照着原樣來輸出。
②、Interpolation插值:這部分的輸出會被計算的值來替換。插值由${和}所分隔
③、FTLtags標籤:與HTML標籤很相似,但它們卻是給FreeMarker的指示且不會打印在輸出內容中。
④、Comments註釋:註釋和HTML的註釋很相似,但是由<#--和-->來隔的。
注:FTL是區分大小寫的,插值僅僅可以在文本中間使用(也可以在字符串表達式中)。FTL標籤不可以在其他FTL標籤和插值中使用。註釋可以放在FTL標籤和插值中間。
20、指令的調用:
如調用list指令:在語法上使用了兩個標籤:<#list animals asbeing>和</#list>。
對於用戶自定義的指令使用@來代替#。例如:<@mydirectiveparameters>...</@mydirective>
21、備忘單
㈠、直接指定值
①字符串:"Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者 r"C:\raw\string"
②數字:123.45
③布爾值:true, false
④序列:["foo", "bar",123.45], 1..100
⑤哈希表:{"name":"green mouse","price":150}
㈡、檢索變量
①頂層變量:user
②從哈希表中檢索數據:user.name, user[“name”]
③從序列中檢索:products[5]
④特殊變量:.main
㈢、字符串操作
①插值(或連接):"Hello ${user}!"(或"Free" + "Marker")
②獲取一個字符:name[0]
㈣、序列操作
①連接:users + ["guest"]
②序列切分:products[10..19] 或 products[5..]
③哈希表操作
④連接:passwords +{"joe":"secret42"}
㈤、算數計算: (x * 1.5 + 10) / 2 - y % 100
㈥、比較:x == y, x != y, x < y, x > y, x >= y, x <= y, x < y, 等等
㈦、邏輯操作:!registered&& (firstVisit ||fromEurope)
㈧、內建函數:name?upper_case
㈨、方法調用:repeat("What", 3)
㈩、處理不存在的值
①默認值:name!"unknown" 或者(user.name)!"unknown"或者name! 或者 (user.name)!
②檢測不存在的值:name?? 或者(user.name)??
22、字符串
如果文本本身包含用於字符引用的引號(雙引號”或單引號’)或反斜槓時,應該在它們的前面再加一個反斜槓,這就是轉義。
23、FreeMarker所支持的所有的轉義符序列
一種特殊的字符串就是原生字符串。在原生字符串中,反斜槓和${沒有特殊的含義,它們被視爲普通的字符。爲了表明字符串是原生字符串,在開始的引號或單引號之前放置字母r。
24、序列
指定一個文字的序列,使用逗號來遍歷子變量,然後把整個列表放到方括號內。
輸出:
25、哈希表
在模板中指定一個哈希表,就可以遍歷用逗號來分隔的“鍵/值”對,把列表放到花括號內。
例如:{"name":"green mouse","price":150}。