FreeMarker-2

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)>,或在比較處使用&gt;&lt;:<#ifx &gt;y>。可用lt代<,lte代<=,gt代>,gte代>=,FTL也支持\lt,\lte,\gt和\gte,和不帶反斜槓的一樣。

36、內建函數

內建函數以?形式提供變量的不同形式或者其他信息。例如:user?upper_case

①、字符串使用的內建函數:

html:字符串中所有的特殊HTML字符都需要用實體引用來代替(比如<代替&lt;)

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首字母大寫   字符串的所有單詞都大寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章