这是之前做后台开发的时候,用到了freemarker,然后自己整理的freemarker的基础知识和用法,一直想发,一直忘记发。。
Freemarker是一款模板引擎,是一个基于模板和数据模型,并用来生成输出的文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不面向最终用户,而是一个java类库,是一款程序员可以嵌入他们所开发产品的组件。模板是用FreeMarker Template Language(FTL)编写的,这是一种简单的、专用的语言。简单来说,模板就是用来定义如何展示数据,比如数据的格式、展示方式等等,而数据模型,就是为模板准备的数据整体,也就是要展示什么数据。
基本知识和用法:
一、首先,FreeMarker模板文件主要由以下4个部分组成:1.文本:直接输出的部分
2.注释:<#--...-->
3.插值:用${...}或#{...}表示,将使用数据模型中的数据代替插值输出
4.FTL指令:和html标记类似,名字前有#,<#...></#...>或<#.../>,不会输出 另外,当使用的指令是用户指令而不是系统内建指令时,应该把#改成@
二、表达式
表达式是FreeMarker模板的核心功能,它的功能非常强大,不仅支持直接指定值、输出变量值,也支持字符串格式化输出和集合访问等功能。
1.直接指定值
使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值
·字符串
${"K2DATA"} 输出:K2DATA //字符串中包含特殊字符需要转译,如果某段文本中包含大量特殊字符,可以在指定字符串内容的引号前加r标记,r标记后的文本会直接输出
·布尔型
${true} 输出:false //不使用引号
·集合
["K2","DATA"] //还可以使用数字范围定义数字集合,例如2..5等同于[2,3,4,5]
·Map对象
{"男生"20:,"女生":10} //key-value之间用英文冒号分隔,多组key-value之间用英文逗号分隔
2.输出变量值
输出变量值时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量
·顶层变量(直接放在数据模型中的值)
例如有如下数据模型:
Map root=new HashMap(); root.put("name","k2data");
${name} 输出:k2data
·集合元素
${data[3]} 输出:data集合的第四个元素 //data[3..5] 返回data集合的子集合,子集合中的元素是data集合的第4-6个元素
3.运算符
·算术运算符
包括:+,-,*,/,%
·比较运算符
包括:=或==,!=,>或gt,>=或gte,<或lt,<=或lte
·逻辑运算符
包括:逻辑与&&,逻辑或||,逻辑非! //逻辑运算符只能作用与布尔值
4.内建函数
·FreeMarker还提供了一些内建函数用来转换输出,可以在变量后跟?,?后跟内建函数
·html:对字符串进行HTML编码
·cap_first:将字符串第一个字符大写
·lower_case:将字符串转成小写
·upper_case:将字符串转成大写
·trim:去掉字符串前后的空白字符
·size:获取集合中元素的个数
·int:获取数字的整数部分,结果带符号
三、常用指令
FreeMarker的FTL指令也是模板的重要组成部分,这些指令可以实现对数据模型的迭代输出、分支控制等功能
1.assign指令
assign指令是用来定义变量的,语法<#assign name=value>
2.list指令
list指令是一个迭代输出指令(类似与java中的循环),用于迭代输出数据模型中的集合,语法:
<#list sequence as item>
...
</#list>
sequence是一个集合对象,也可以是一个返回集合对象表达式,item可以是任意名字,代表被迭代输出的集合元素,此外,还有两个特殊的循环变量,item-index:当前变量的索引值,item_has_next:是否存在下一个元素,可以使用<#break指令跳出迭代>
3.if指令
if指令是分支控制指令,和java中的if类似,语法:
<#assign money=50>
<#if (money>200)>有钱人
<#else if(money<100)>穷人
<#else>普通人
</#if>
输出:穷人
4.switch指令
分支控制指令,类似java中的switch语句,语法:
<#switch value>
<#case refValue>...<#break>
<#default>...
</#switch>
5.include指令
include指令用于包含指定页,类似与jsp中的包含指令,语法:<#include filename>
6.noparse指令
noparse指令中间的内容会原样输出,语法:<#noparse>...</#noparse>
7.escape指令
escape指令可以使body区的插值都自动加上escape表达式,语法
<#escape x as x?lower_case>
First name:${firstName}
Last name:${lastName}
</#escape>
等同于:
First name:${firstName?lower_case}
Last name:${lastName?lower_case}
因为我也是刚接触并学习freemarker没多久,所以有些地方可能理解的不到位,欢迎大家批评指正。以上只是FreeMarker的一点点,一点点点,有兴趣的童鞋可以和我一起讨论,一起学习。
各IDE的FreeMarker插件: 点击打开链接