FreeMarker是一款用java语言编写的模版引擎,它虽然不是web应用框架,但它很合适作为web应用框架的一个组件。
特点:
1. 轻量级模版引擎,不需要Servlet环境就可以很轻松的嵌入到应用程序中
2. 能生成各种文本,如html,xml,java,等
3. 入门简单,它是用java编写的,很多语法和java相似
freemarker模板文件(*.ftl)的基本组成部分:
1. 文本:直接输出的内容部分
2. 注释:不会输出的内容,格式为<#-- 注释内容 -->
3. 取值(插值):代替输出数据模型的部分,格式为${数据模型}或#{数据模型}
4. ftl指令:Freemarker指令,类似于HTML标记。( 至于什么是内建指令,什么是自定义指令 下面会叙述到)
-
- 内建指令:开始标签:<#directivename parameter> 结束标签:</#directivename> 空标签:<#directivename parameter/>
- 自定义指令:开始标签:<@directivename parameter> 结束标签:</@directivename> 空标签:<@directivename parameter/>
工作原理:(借用网上的图片)
语法及使用方法:
1. 取值(插值)指令及适用类型:
${var} 适用类型:java中常用的八大基本类型以及我们的String引用类型,但是,freemarker中boolean类型显示时true==yes false==no
//在后台文件中定义变量 String strVar = "世界你好"; int intVar = 10; boolean booVar = true; //在页面中获取变量: <font color="red"> ${strVar} </font><br> //String获取 <font color="red"> ${intVar} </font><br> //int获取 <font color="red"> ${booVar?string("yes","no")} </font> //boolean获取 //展示结果:String获取:世界你好 int获取:10 boolean获取:yes
${var!} 适用类型:对 null 或者不存在的对象进行取值,可以设置默认值,例:${var!'我是默认值'} 即,有值时显示正常值,无值时显示默认值
//在后台文件中定义变量 String strVar = "世界你好"; String str = null; //在页面中获取变量: <font color="red"> ${strVar!"我是空"} </font><br> //String获取 <font color="red"> ${str!} </font><br>//str获取 <font color="red"> ${str!"默认"} </font><br>//str获取 //展示结果:String获取:世界你好 str获取: str获取:默认
${封装对象.属性} 适用类型:对封装对象进行取值,例:${User.name}
//在后台文件中封装对象User[ name, age ] String name = "姓名"; int age = 18; //在页面中获取变量: <font color="red"> ${User.name} </font><br>//name获取 <font color="red"> ${User.age} </font><br>//age获取 //展示结果:name获取:姓名 age获取:18
${date?String('yyyy-MM-dd')} 适用类型:对日期格式进行取值,要强调的是,定义Date类型的变量时,java.util.Date无法输出日期,须使用java.sql.Date
//在后台文件中定义变量 java.sql.Date date = new Date().getTime(); java.sql.Date time = new Date().getTime(); java.sql.Date datetime = new Date().getTime(); //在页面中获取变量: <font color="red"> ${date?string('yyyy-MM-dd')} </font><br>//date获取 <font color="red"> ${date?string('HH:mm:ss')} </font><br>//time获取 <font color="red"> ${date?string('yyyy-MM-dd HH:mm:ss')} </font><br>//datetime获取 //展示结果:未给出
${var?html} 适用类型:转义HTML内容
//在后台文件中封装变量Menu[ name, model ] Menu m = new Menu(); m.setName(" freemarker "); m.setModel("<font color = 'red'>我只是个菜单</font>"); //在页面中获取变量: <font color="red"> ${m.model} </font><br>//非转义获取: ${m.model?html} </font><br>//转义获取: //展示结果: //非转义获取:我只是个菜单 //转义获取:<font color = 'red'>我只是个菜单</font>
<#assign num = 100 /> 适用类型:定义变量,支持计算和赋值
//在页面中定义变量: <#assign num = 100 /> //在页面中获取变量 <font color="red"> ${num)} </font><br>// num获取: <font color="red"> ${num * 10} </font><br>//计算结果: //展示结果:num获取:100 计算结果:1000
对List集合进行取值
<#list list集合 as item>
${item} --取值
</#list>
//在后台文件中定义变量 List<String> strList = new ArrayList<String>(); strList.add("第一个值"); strList.add("第二个值"); strList.add("第三个值"); //在页面中获取变量: <#list strList as item> ${item!}<br/> //取值 </#list> //展示结果: //第一个值 //第二个值 //第三个值
对Map集合进行取值
<#list map?keys as key>
${key}:${map[key]}
</#list>
//在后台文件中定义变量 Map<String, Object> m = new HashMap<String, Object>(); m.put("name","姓名"); m.put("age",18); m.put("sex","男"); //在页面中获取变量: <#list m?keys as key> ${key}:${m[key]} </#list> // 展示结果: //name:姓名 //age:18 //sex:男
2. 条件判断指令:
<#if 条件>输出</#if>
//在页面中定义变量并判断条件: <#assign age = 18 /><br> <#if age == 18> <font color="red"> age = 18</font> </#if> //展示结果: age = 18
<#if 条件> 输出 <#else> 输出 </#if>
//在页面中定义变量并判断条件: <#assign age = 20 /><br> <#if age == 18> <font color="red"> age = 18</font> <#else> <font color="red"> age != 18</font> </#if> //展示结果: age != 18
<#if 条件1> 输出 <#elseif 条件2> 输出 <#else> 输出 </#if>
//在页面中定义变量并判断条件: <#assign age = 20 /><br> <#if age > 18> <font color="red">青年</font> <#elseif age == 18> <font color="red"> 成年</font> <#else> <font color="red"> 少年</font> </#if> //展示结果:成年
switch --常与case break default一起使用 参数可为字符串
//在页面中定义变量并判断: <#switch var="星期一"> <#case "星期一"> 油焖大虾 <#break> <#case "星期二"> 炸酱面 <#break> <#default> 肯德基 </#switch> //展示结果: 油焖大虾
3. 自定义函数、自定义指令:
(1) 自定义函数 —— 实现TemplateMthodModelEx
(2) 自定义指令 —— 实现TemplateDirectiveModel
<@自定义指令名称 入参(key-value格式) ; 出参(list格式)> 运行条件 </@自定义指令名称> //不同的返回值用逗号( , )间隔开
4.常用内建函数、macro(宏指令)、function(函数指令):
(1) 常用内建函数
处理字符串 | |
---|---|
substring | 截取字符串,包头不包尾(下标) |
cap_first | 第一个字母大写 |
end_with | 以什么字母结尾 |
contains | 是否包含目标字符串 |
date datetime time | 转换成日期格式 |
starts_with | 以什么字母开头 |
index_of | 返回某个指定的字符串值在字符串中首次出现的位置(下标) |
last_index_of | 获取指定字符出现的最后位置(下标) |
split | 分隔 |
trim | 去两端空格 |
处理数字 | |
string x?string("0.##") | 变成小数点后几位 |
round | 四舍五入 |
floor | 去掉小数点 |
ceiling | 近1 变成整数 |
处理list | |
first | 取List值第一个值 |
last | 取List值最后一个值 |
seq_contains | 是否包含指定字符 |
seq_index_of | 指定字符所在位置 |
size | 集合大小 |
reverse | 集合倒序排列 |
sort | 对集合进行排序 |
sort_by | 根据某一个属性排序 |
chunk | 分块处理 |
其他 | |
is_string: | 是否为字符类型 |
is_number: | 是否为整数类型 |
is_method: | 是否为方法 |
(): | 判断整个变量 |
has_content: | 判断对象是否为空或不存在 |
eval: | 求值 |
(2) macro(宏指令)
调用:<@macro_name param />
语法:<#macro 变量名 参数>
<#nested/>
</#macro>
(3) function(函数指令)
调用:${function_name(param)}
语法:<#function 变量名 参数>
<#return>
</#function>