Freemarker插值详解


java中Freemarker插值就是${...}#{...}格式的部分,将使用数据模型中的部分替代输出。

通用插值${expr}

1. 插值结果为字符串值

直接输出表达式结果

2. 插值结果为数字值

根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值。

<#settion number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string}
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
${answer}

执行输出结果:

$42.00
$42.00
42
$42.00
4,200%

3. 插值结果为日期值

根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值。

${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}

执行输出结果:

2008-04-08 08:08:08 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)

4. 插值结果为布尔值

根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值。

<#assign foo=true/>
${foo?string("yes", "no")}

执行输出结果:

yes

数字格式化插值:#{expr}或#{expr;format} 采用#{expr;format}形式来格式化数字,其中format可以是: 1. mX:小数部分最小X位 2. MX:小数部分最大X位。

<#assign x=2.582/>
<#assign y=4/>
#{x; M2}
#{y; M2}
#{x; m2}
#{y; m2}
#{x; m1M2}
#{x; m1M2}

执行输出结果:

2.58
4
2.6
4.0
2.58
4.0

避免空值插值

!: 指定缺失变量的默认值

${sss!} <#--没有定义这个变量,默认值是空字符串! -->  
${sss!"abc"} <#--没有定义这个变量,默认值是字符串abc! -->

??:判断变量是否存在

variable??,如果变量存在,返回true,否则返回false。

插值规则

a) 表达式放置在插值语法${}之中,用于输出表达式的值。

b) 表达式的值的类型可以是:字符串、 数字、布尔、日期时间、序列、Hash结构

c) 表达式支持Java中的所有运算符:

- 算术运算符:+、-、*、/、%
 - 比较运算符:==(eq)、!=(ne)、>(gt)、>=(gte)、<(lt)、<=(lte)
 - 逻辑运算符:&&(and)、||(or)、!(not)
 - 三目运算符:? :

d) 内置函数:

- Ⅰ) 使用方式:表达式?函数名[(实参)]
- Ⅱ) 字符串的常用内置函数: substring(from[, to])、html、length、trim、url 示例:<#setting url_escaping_charset="UTF-8"> 、exp?url[("UTF-8")]
- Ⅲ) 数字的常用内置函数:c、string[(数字模式串)]、
- Ⅳ) 布尔的内置函数:string[("男", "女")]
- Ⅴ) 内置的常用日期时间函数:string[("格式模式串")]、datetime、date、time

e) 序列: 在FTL中定义的序列:由方括号包括,各元素用英文逗号分隔如:<#assign seq=["winter", "spring", "summer", "autumn"]>也可以用数字范围(递增、反递增)定义数字序列: <#assign nums=101..105> 或 <#assign nums=105..101> 在数据模型中可以是List对象、Set对象,序列的常用内置函数:size、sort[("指定字段作排序依据")]

f) Hash结构: 在FTL文件中直接定义时:由大括号包括,由逗号分隔键/值列表,键和值之间用冒号分隔。键必须是字符串。如: <#assign scores={"语文":78, "数学":89, "英语":87}> ${scores.语文} 在数据模型中可以是Map对象,Hash结构的内置函数:size、keys、values

例子

${book.name?if_exists } //用于判断如果存在,就输出这个值   
${book.name!"xxx"}//默认值xxx   
${book.date?string('yyyy-MM-dd')} //日期格式   
${book?string.number} 20 //三种不同的数字格式   
${book?string.currency} <#-- $20.00 -->   
${book?string.percent} <#-- 20% -->  
${.now?datetime}//当前时间戳