26、頂層變量
變量名不能以數字開頭。表達式中變量名可以包含字母(也可以是非拉丁文),數字,下劃線(_),美元符號($),at符號(@)和哈希表(#)。
27、從哈希表中檢索數據
同含義:book.author.name;book["author"].name;book.author.["name"];book["author"]["name"]。
28、從序列中檢索數據
只能用方括號語法形式,方括號內的表達式必須是一個數字而不是字符串。animals[0].name。
29、特殊變量
按照如下語法形式來進行:.variable_name。
30、插值
①、${“Hello ${user}!”
②、${“Hello “+user+”!”}
31、獲取一個字符
內建函數string 。例如:user?string[0]。
32、序列操作,連接
<#list ["Joe", "Fred"] + ["Julia", "Kate"] asuser>
- ${user}
</#list>
33、序列的切分
如seq存儲列"a","b", "c", "d", "e", "f",表達式seq[1..4]是"b", "c", "d", "e"的序列
34、算數計算
+號的一端是字符串,另外一端是數字,那麼數字就會自動轉換爲字符串類型。
例如:${3 + "5"}將會輸出35
只想獲取計算結果的整數部分,這可以使用內建函數int來解決。${(5/2)?int}輸出:2。
35、比較
表達式放括號內:<#if (x >y)>,或在比較處使用><:<#ifx >y>。可用lt代<,lte代<=,gt代>,gte代>=,FTL也支持\lt,\lte,\gt和\gte,和不帶反斜槓的一樣。
36、內建函數
內建函數以?形式提供變量的不同形式或者其他信息。例如:user?upper_case
①、字符串使用的內建函數:
html:字符串中所有的特殊HTML字符都需要用實體引用來代替(比如<代替<)
cap_first:字符串的第一個字母變爲大寫形式
lower_case:字符串的小寫形式
upper_case:字符串的大寫形式
trim:去掉字符串首尾的空格
②、序列使用的內建函數:
size:序列中元素的個數
③、數字使用的內建函數:
int:數字的整數部分(比如-1.9?int就是-1)
37、方法的調用
${repeat("What",3)} 輸出爲:WhatWhatWhat
38、默認值:
${mouse!"No mouse."}
<#assignmouse="Jerry">
${mouse!"No mouse."}
輸出爲:No mouse.
Jerry
39、檢測不存在的值
unsafe_expr??或(unsafe_expr)??
40、操作符的優先級
41、插值僅僅在2種位置使用:文本區(如<h1>Hello${name}!</h1>)和字符串表達式(如<#include"/footer/${company}.html">)
插值表達式的結果必須是字符串,數字或日期類型的。
42、自定義指令
可以使用macro指令來定義,也可用擴展:freemarker.template..TemplateDirectiveModel類來擴展。
一般使用<@...>稱爲宏調用。
43、內容嵌套
<#if ...>nestedcontent</#if>
44、模板中定義變量
①、簡單變量:它能從模板中的任何位置來訪問,或者從使用include指令引入的模板訪問。可以使用assign或macro指令來創建或替換這些變量。
②、局部變量:它們只能被設置在宏定義體內,而且只在宏內可見。一個局部變量的生存週期只是 宏的調用過程。可以使用local指令在宏定義體內來創建或替換局部變量。
③、循環變量:循環變量是由指令(如list)自動創建的,而且它們只在指令的開始和結束標記內有效。宏的參數是局部變量而不是循環變量。
45、命名空間的生命週期
輸出爲:
46、加在下面這些指令之間的空白會被忽略:macro,function,assign,global,local,ftl,import,但也是僅僅指令之間只有一個空白或FTL註釋。
使用compress指令,和剝離空白相反,這個工作是直接基於生成的輸出內容的。
47、替換語法
在FreeMarker指令和註釋中用[和]來代替和。
例如:①、調用預定義指令:[#listanimals as being]...[/#list]
②、調用用戶自定義指令:[@myMacro /]
③、註釋:[#-- the comment --]
48、創建配置實例
首先創建一個freemarker.template.Configuration實例,然後調整位置。
49、創建數據模型
可以使用java.lang和java.util下的類,用戶自定義的JavaBeans來構建數據對象。
n 使用java.lang.String來構建字符串。
n 使用java.lang.Number來派生數字。
n 使用java.lang.Boolean來構建布爾值。
n 使用java.util.List或Java數組來構建序列。
n 使用java.util.Map來構建哈希表。
n 使用你自己定義的bean類來構建哈希表,bean中的項和bean的屬性對應。
50、標準的輸出
51、數據模型
想從模板訪問的任何對象,早晚都要轉換爲實現了TemplateModel接口的對象。
有一個freemarker.template.TemplateModel粗略的子接口對應每種基本變量類型:
TemplateHashModel對哈希表,TemplateSequenceModel對序列,TemplateNumberModel對數字
52、4種標量
布爾值,字符串,數字,日期
字符串標量的接口是TemplateScalarModel不是TemplateStringModel。
TemplateDateModel接口有兩個方法:是java.util.Date getAsDate()和intgetDateType()。這個接口典型的實現是存儲一個java.util.Date對象,加上一個整數來辨別“數據庫存儲的類型”。這個整數的值必須是TemplateDateModel接口中的常量:DATE,TIME,DATETIME和UNKNOWN。
對要格式化參數使用了內建函數string,比如foo?string("MM/dd/yyyy")
53、哈希表
①、TemplateModel get(Stringkey),這個方法根據給定的名稱返回子變量,boolean isEmpty()這個方法表明哈希表是否含有子變量。
②、get方法當在給定的名稱沒有找到子變量時返回null。
54、序列
實現TemplateSequenceModel。兩法:TemplateModelget(int index)和int size()。
55、集合
實現TemplateCollectionModel。一法:TemplateModelIteratoriterator()。和java.util.Iterator相似,返回TemplateModels,拋出TemplateModelExceptions。
56、方法
實現TemplateMethodModel的模板內。一法:TemplateModel exec(java.util.Listarguments)。
57、指令
Java程序員可以使用TemplateDirectiveModel接口在Java代碼中實現自定義指令。
58、提示
TemplateDirectiveModel對象通常是有狀態的。
59、節點變量
節點變量有下列屬性,這些都由TemplateNodeModel接口的方法提供。
基本屬性:
TemplateSequenceModelgetChildNodes():一個節點有子節點序列。
TemplateNodeModelgetParentNode():一個節點只有一個父節點。
可選屬性。如果一個屬性在具體的使用中沒有意義,那對應的方法應該返回null:
StringgetNodeName():節點名稱也是宏的名稱,當使用recurse和visit指令時,它用來控制節點。
StringgetNodeType():在XML中:"element","text","comment"等。如果這些信息可用,就是通過recurse和visit指令來查找節點的默認處理宏。而且,它對其他有具體用途的應用程序也是有用的。
StringgetNamespaceURI():這個節點所屬的命名空間。例如,在XML中,這就是元素和屬性所屬的XML命名空間的URI。信息這個如果可用,就是通過recurse和visit指令來查找存儲控制宏的FTL命名空間。
在FTL這裏,節點屬性的直接使用可以通過內建函數node完成,還有visit和recurse宏。
60、配置
配置對象是freemarker.template.Configuration的實例,可以通過構造方法來創建它。一個應用程序通常只使用一個共享的Configuration實例
61、共享變量
用setSharedVariable方法向配置實例中添加共享變量。
它包含下列用戶自定義指令(用戶自定義指令使用時需要用@來代替#):
62、配置信息
有3層:configuration ; Template ;Environment 。分別是配置,模板,環境。
63、內建模板加載器
在Configuration中可以使用下面方便的方法來建立三種模板加載方法。
64、bean的包裝
freemarker.ext.beans.BeansWrapper是一個對象包裝器
65、哈希表鍵
66、特殊哈希表鍵的含義:
"elementName","prefix:elementName":返回元素名爲elementName的子節點的序列。
"*":返回所有子元素(直接後繼)節點的序列。
"**":返回所有後繼節點的序列。這個序列按文檔順序包含元素。
"@attName","@prefix:attrName":作爲一個大小爲1,包含屬性節點的序列的形式,返回元素的屬性名attName,如果屬性不存在時,作爲一個空序列返回(所以來檢查屬性是否存在,可以使用foo.@attName[0]??,而不是foo.@attName??)。
"@@"或"@*":返回屬於父節點的節點的屬性序列,這和XPath中的@*是相同。
"@@qname":返回元素的完全限定名(如e:book,和由?node_name返回本地名book形成對比)。
"@@markup":這會以字符串形式返回一個節點的完整XML標記。
"@@nested_markup":這個和"@@markup"相似,但是它返回不包括開放和封閉標記元素的XML標記。對於文檔節點,它返回和"@@markup"相同的內容。
"@@text":它返回文本節(所有後繼文本節點,而不是直接子節點)點的值,連接成一個單獨的字符串。如果節點沒有子文本節點,那麼返回的是空字符串。
"@@start_tag":返回元素節點開始標記的標記。
"@@end_tag":返回元素節點結束標記的標記
@@attributes_markup:返回元素節點屬性的標記,
67、substring取子串 exp?substring(from, toExclusive),
68、cap_first 首字母大寫 ${"green mouse"?cap_first}
69、uncap_first 首字母小寫
70、capitalize首字母大寫 字符串的所有單詞都大寫