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

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