一.Freemarker簡介
什麼是Freemarker:.
Freemaker是一個”模板引擎”,也可以說是一個基於模板技術的生成文本輸出的一個通用工具.它是一個JAVA的包,一個JAVA程序員可以使用的類庫.本身並不是一個對最終用戶的應用程序.但是,程序員可以把它應用到他們的產品中.
FreeMarker是設計爲可以生成WEB PAGES.它是基於SERVLET遵循MVC模式的.這個思路是應用MVC模式要降低分離,網頁設計人員和程序員的耦合.每個人都可以做他們擅長的工 作.網頁設計人員可以改變網頁的面貌,而並不需要程序員的重新編譯.因爲業務邏輯和頁面的設計已經被分離開了.模板是不能由複雜的程序片斷組成的.即便網 頁設計人員和程序員是一個人. 分離是有必要的.它能使程序更加的靈活和清晰.
雖然Freemarker能編程,但是它並不是一個編程語言.它是爲程序顯示數據而準備的.(像數據庫SQL語句的查詢.)以及.Freemarker僅僅是利用模板加上數據生成文本頁面.
Freemarker並不是一個WEB應用程序框架.可以說是一個WEB應用框架的一個組件.但是FREEMARKER引擎本身並不瞭解HTTP或 者SERVLETS.它只不過生成文本而已.注意,它是MVC框架的一個組件(如STRUTS),也可以在模板中使用JSP標籤.
Freemarker下載地址爲:http://www.freemarker.org/index.html
一般的用途:
l 能用來生成任意格式的文本:HTML,XML,RTF,JAVA源碼,等等.
l可以更好的嵌入到你的產品中,輕量級的.並不需要servlet環境.不依賴javax.servlet.classes.
l可插入的模板讀取器:你可以從任意的源碼讀取任意的模板.本地的文件,數據庫等等.
l你可以做任意你想生成的文本.存儲爲本地文件.可以用來發送EMAIL或返回到WEB瀏覽器中.
強大的模板語言
l完整的指令:include,if/elseif/else,loop.
l 建立和修改模板中的變量.
l 能用複雜的表達式在任意地方指定變量.
n字符串操作:concateration,sub-string,uppercase,capitalize,escaping.等等
n十進制數學計算.
n BOOL
n讀取數組和相關的數組元素.
n可以自己添加特殊的計算方法.
l宏指令
l 命名空間用來創建和維護宏指令庫或者把大的項目分成許多模塊.並不用擔心命名衝突
二.環境搭建與配置
<!—freemarker初始配置-->
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html</param-value>
</init-param>
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>locale</param-name>
<param-value>zh_CN </param-value>
</init-param>
<init-param>
<param-name>number_format</param-name>
<param-value>0.##########</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
----------------------------------------------------------------------------
三.常用語法
EG.一個對象BOOK
1.輸出 ${book.name}
空值判斷:${book.name?if_exists },
${book.name?default(‘xxx’)}//默認值xxx
${ book.name!"xxx"}//默認值xxx
日期格式:${book.date?string('yyyy-MM-dd')}
數字格式:${book?string.number}--20
${book?string.currency}--<#-- $20.00 -->
${book?string.percent}—<#-- 20% -->
插入布爾值:
<#assign foo=ture />
${foo?string("yes","no")} <#-- yes -->
2.邏輯判斷
a:
<#if condition>...
<#elseif condition2>...
<#elseif condition3>......
<#else>...
其中空值判斷可以t;
b:
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
3.循環讀取
<#list sequence as item>
...
</#list>
空值判斷<#if bookList?size = 0></#list>
e.g.
<#list employees as e>
${e_index}. ${e.name}
</#list>
輸出:
1. Readonly
2. Robbin
4.FreeMarker 3 宏/模板
宏Macro
宏是在模板中使用macro指令定義
l.1 基本用法
宏是和某個變量關聯的模板片斷,以便在模板中通過用戶定義指令使用該變量,下面是一個例子:
<#macro greet>
<font size="+2">Hello Joe!</font>
</#macro>
調用宏時,與使用FreeMarker的其他指令類似,只是使用@替代FTL標記中的#。
<@greet></@greet> <#--<@greet/>-->
在macro指令中可以在宏變量之後定義參數,如:
<#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
可以這樣使用這個宏變量:
<@greet person="Fred"/>
但是下面的代碼具有不同的意思:
<@greet person=Fred/>
這意味着將Fred變量的值傳給person參數,該值不僅是字符串,還可以是其它類型,甚至是複雜的表達式。
宏可以有多參數,下面是一個例子:
<#macro greet person color>
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
可以這樣使用該宏變量,其中參數的次序是無關的:
<@greet person="Fred" color="black"/>
可以在定義參數時指定缺省值,否則,在調用宏的時候,必須對所有參數賦值:
<#macro greet person color="black">
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
注意:宏的參數是局部變量,只能在宏定義中有效。
嵌套內容
FreeMarker的宏可以有嵌套內容,<#nested>指令會執行宏調用指令開始和結束標記之間的模板片斷,舉一個簡單的例子:
<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</tr></td></table>
</#macro>
執行宏調用:
<@border>The bordered text</@border>
輸出結果:
<table border=4 cellspacing=0 cellpadding=4><tr><td>
The bordered text
</tr></td></table>
<#nested>指令可以被多次調用,每次都會執行相同的內容。
<#macro do_thrice>
<#nested>
<#nested>
<#nested>
</#macro>
<@do_thrice>
Anything.
FMPP 輸出結果:
Anything.
Anything.
Anything.
嵌套內容可以是有效的FTL,下面是一個有些複雜的例子,我們將上面三個宏組合起來:
<@border>
<ul>
<@do_thrice>
<li><@greet person="Joe"/>
</ul>
</@border>
輸出結果:
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<ul>
<li><font size="+2">Hello Joe!</font>
<li><font size="+2">Hello Joe!</font>
<li><font size="+2">Hello Joe!</font>
</ul>
</tr></td></table>
宏定義中的局部變量對嵌套內容是不可見的,例如:
<#macro repeat count>
<#local y = "test">
<#list 1..count as x>
${y} ${count}/${x}: <#nested>
</#list>
</#macro>
<@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat>
輸出結果:
test 3/1: ? ? ?
test 3/2: ? ? ?
test 3/3: ? ? ?
在宏定義中使用循環變量
nestted指令也可以有循環變量(循環變量的含義見下節),調用宏的時候在宏指令的參數後面依次列出循環變量的名字,格式如下:
<@ macro_nam