Freemarker学习归纳

<script type="text/javascript"> </script>

 

一.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十进制数学计算.

nBOOL

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

其中空值判断可以写成<#if book.name?? >

 

</#if>

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

<script type="text/javascript"> </script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值