FreeMarker 是一個模版引擎

FreeMarker 是一個模版引擎,一個基於文本的模板輸出工具(生成任意的HTML表單代碼)。它是一個Java package,面向Java程序員的class library。它本身並不是針對最終用戶的應用,而是允許程序員將其嵌入到他們的產品中。
FreeMarker被設計用來生成HTML Web頁面,特別是基於MVC(Model View Controller)模式的應用程序。使用 MVC 模式作爲動態的WEB頁面的想法,是爲了分隔頁面設計者 (HTML 設計者) 和程序員。.每個人做自己擅長的那一部分。設計者可以不通過程序員的改變或修改代碼來改變網頁的樣子,因爲應用邏輯(Java程序)和頁面設計 (FreeMarker 模版)是分開的。模板不會被複雜繁瑣的程序框架所破壞。即使當一個項目的程序員和HIMTL頁面的製作者是同一個人時,這種分隔也是很有用,因爲這樣有助於保持應用的清晰並易於維護。
儘管FreeMarker有一些編程的能力,但它並不是一個象PHP那樣的成熟的編程語言。與Java不同的是,Java程序準備用來顯示的數據(如SQL queries),而Freemarker僅是生成文本頁,這個文本頁顯示用於模板的預備數據。
FreeMarker 不是一個Web應用框架,而更適合充當Web應用框架裏的一個組件的角色,但FreeMarker引擎本身對HTTPservlets並不關心,它僅僅是生成文本。在非Web應用環境中它同樣能夠展示完美的用途。然而值得注意的是:我們爲使用FreeMarker提供了方便的解決方案,作爲Model2框架(如Struts)的視圖組件,你也可以在模版中使用JSP標籤。
FreeMarker是免費的,有BSD-style license。它是由OSI認證的開源軟件。

一.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.

</@do_thrice>

FMPP 輸出結果:

Anything.

Anything.

Anything.

嵌套內容可以是有效的FTL,下面是一個有些複雜的例子,我們將上面三個宏組合起來:

<@border>

  <ul>

  <@do_thrice>

    <li><@greet person="Joe"/>

  </@do_thrice>

  </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

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