使用FreeMarker
1. 创建Configuration实例,setDirectoryForTemplateLoading
2. 生成Template实例
3. 填充数据,数据就是一个Map对象
4. 调用Template的process方法完成合并
5. 在jsp页面中使用 ${} 访问
FreeMarker模板文件
由四部分组成:
文本
注释<#-- -->,不会输出
变量 ${}。
FTL指令 名字前加#区分
变量规则
通用变量
变量为字符串类型,直接输出表达式结果 ${answer}
变量为数字值,根据默认格式(#setting指定)转换为文本输出,也可以使用内建的字符串格式化单个差值,如
<#setting number_format=”currency” />
<#assign answer=42 />
${answer} 输出为$42.00
${answer?string.number} 输出为 42
变量为日期型,根据默认格式(#setting指定)转换为文本输出,也可以使用内建的字符串格式化单个差值,如
${operatingDate?string(“yyyy-MM-dd HH:mm:ss”) }
${operatingDate?string(“EEE, MMM d”) } //输出为 Tue,Apr 8
变量为bool,
<#assign foo=true />
${foo?string(“yes”,”no”) } //输出为 yes
数字格式化变量
#{expr; format} 其中format可以是 mX(小数部分最小X位) MX(小数部分最大X位)
表达式
常量
字符串
字符串中包括大量符号,可通过 r进行转义,如 ${r”${foo”};
数值
数值直接输出,不需要引号,如 ${num}
布尔值
直接使用true或者false,不使用引号
集合
以方括号包括,类似于js中的数组,如 [1,2,3]
Map
类似于js中对象,key必须是字符串,如 {“语文”:78,”数学”:83}
变量
顶层变量
变量名只能是字母、数字、下划线、¥、@、#,且不以数字开头
${name}
集合元素
${week[2]} 从0开始
返回子集合 ${week[3..5]} 从第3个到5个
Map元素
可以包含 javaBean作为value,如 ${root.person.name}
字符串操作
连接: 使用 +, 如 ${“hello, ”+user+” ! ”}
截取字串: ${book[0]} ${book[1..4]}
连接运算符
将两个集合连接成一个新集合,使用 + ,如 [“星期一”,”星期二”]+[“星期三”]
将两个Map连接成一个新Map,使用 +, 如
<#assign score={“语文”:86}+{“英文”:54}>
语文成绩是 ${score.语文}
算术运算符
完全支持 + - * / %,如:
<#assign x=5> ${x*x-5} ${12%10}
运算符两边必须为数字;使用+时,如果一边为字符串,会自动将数字转换为字符串,如 ${3+”5”} 输出为 35
使用内建的int函数对数值取整,如 ${3.2?int} 为3
其他运算符
比较运算符:
使用> <时,加上(),如 <#if (x>y)>
逻辑运算符
&& || !
空值处理运算符
当变量为定义,或在java中定义而值为null,则会在FreeMarker中抛出异常。有两个运算符,!(指定变量的默认值),??(判断某个变量是否存在),如
Num! 默认为0 或”” num!23 默认值为23 v??存在则为true,否则为false
内建函数
支持对字符串、数字、日期、bool、序列、hashMap、xml、和常用的判断语句,一些常用的:
字符串:
Cap_first (第一个单词首字母大写) substring uncap_first(首字母小写)
Captitalize(所有单词都大写) ends_with(以…结尾)
Index_of last_index_of contains matches(支持正则表达式)
lower_case(字符串全部小写) upper_case
left_pad(在左边插入空别,直到字符达到 指定长度)
数值的格式化和四舍五入处理
日期的格式化
序列处理:
First last seq_contains(序列包含) seq_index_of(第一次出现位置) size
Reverse sort sort_by
hashMap处理
keys ${map?keys} 获得键的序列
常用指令
<#if (age>60)>
<#elseif (age>40) >
<#else>
</#if>
<#switch value>
<#case refValue>
<#break>
<#default>
。。。。
</#switch>
List指令用于迭代输出,可使用item_index代表当前变量的索引值;item_has_next 是否存在下一对象,使用 <#break />跳出迭代,实例如下:
<#list [1,2,3,4] as num>
${num_index}. ${x} <#if x_has_next>,</#if>
</#list>
Include
用于包含指定页
Noparse:
指令指定FreeMarkers不处理该指令内包含的内容
Escape noescape
在html格式中有用
Assign:
用于给变量赋值,如<#assign name=”hello ” />
Setting:
设置freeMarker的运行环境,如<#setting name=value>,其中name可以为 locale number_format Boolean_format date_format time_format time_zone
Macro nested return:
用于自定义函数