freemarker常见用法

来源:互联网 发布:企业qq群发软件 编辑:程序博客网 时间:2024/06/14 09:30
1 概述
1.模板与数据模型(动态网页技术)
我们使用freemarker写的.html文件均可称之为模板,而使用freemarker语法本身引用的数据,可称之为数据模型,所输出的就可认为是一个静态的html页面.
即:模板+数据模型=输出
∴FreeMarker的优先级高于html内(包含js)的任意语法.
2.文件中能被freemarker解析的特殊代码片段
${...}:最常见的用法,FreeMarker将会输出真实的值替换大括号内的表达式,称为interpolation(插值);
FTL标签(FreeMarker的语言标签):<#....>,是FreeMarker的指令,区分大小写,内部不能嵌套.(用户自定义的标签则用@代替#)
注释:<#-- -->:FreeMarker解析时会跳过,不会体现到静态html文件中,可嵌套
2 标量类型
1.字符串(string),就是文本,不能比较大小
2.数字(number),可以比较大小,不分int还是float(与js类似),但有内建函数int,float可转化
3.日期/时间(date/time),可以是日期-时间格式,或者日期格式,或者时间格式(此处特性待测试)
4.布尔值(boolean),没有可直接打印的值,一般都需要结合其他指令或函数使用
3 基本指令
1.if
<#if user_name=="cek">
cek
<#elseif user_name=="lg">
lg
<#else>
else
</#if>
1)if后面的要求为boolean值,可以直接为true/false(除非是变量状态,一般不会直接用此值),也可为类似a==b的结果为boolean值的表达式;
注:${...}内部不允许使用boolean值.
2)对于==表达式,等号两边必须为相同类型,或者同为数字(number),或者同为字符串(string).
注:字符串所用的引号,单引号双引号均可(类似js).
3)除了==,还可使用!=,或>,>=,<,<=,但后者必须转化为gt,gte,lt,lte的形式,且等号两边不能为字符串.
2.list
<#list lstUser as mUser>
user.user_name
</#list>
注:目前测试Java中的Array,List均可用list标签.
3.include
在模板中插入其他文件的内容,提高文件复用性
<#include "../../_footer.html">
4 内建函数
1.(boolean)flag?string("true","false"),基于flag的boolean值返回字符串
2.(string)user?html给出user的html转义版本,比如&会由&来代替(实际似乎很少用到,正常字符串均能按照原本的样式显示)
3.(string)user_name?upper_case给出user_name值的大写版本,如${"admin"?supper_case} -> "ADMIN"
4.(string)user_name?cap_firse给出user_name的首字母大写版本,如${"admin"?cap_firse} -> "Admin"
5.(string/number)user_name?length给出user_name的字符串长度,如${"admin"?length} -> 5
6.(string/number)user_name?starts_with("a"),根据首字母返回boolean值true或false
7.(list)lstUser?size给出lstUser中的集合容量,如${pagGDept.getList()?size} -> 5(可能的值)
8.(list内部)在list的FTL标签中,如<#list lstUser as mUser></#list>中:
mUser?index给出了基于0开始的mUser的索引值;
mUser?counter给出了基于1开始的mUser的索引值;
mUser?item_parity给出了基于1开始的奇偶性,返回"odd"(奇数)和"even"(偶数)的字符串
mUser?item_cycle("奇数","偶数")给出了基于1开始的奇偶性,返回值自定
9.(list from string)names?join(","),将列表转化为字符串,每个项之间插入参数分隔符
10.(通用)内建函数应用可以链式操作,如user_name?starts_with("a")?string("y","n")
5 处理不存在的变量
一个不存在的变量和一个为null的变量,对于FreeMarker是一样的.
一般有两种处理方式:
1.变量名后面通过放置??来询问一个变量是否可以存在,返回boolean值,所以通常与if联用
<#if user??></#if>
2.通过在变量名后面跟着一个!和默认值(选填)避免报错
${user_name!}
${user_name!"admin"}
${user_name!default_value!""}
建议:仅对可能会丢失值的情况使用该种方式处理,对于理论上不应丢失的变量建议不对此处理,以使意外情况时使异常暴露
6.处理字符串进行分割
<#list "${item.logistics_number!}"?split(",") as logistics_number >
<a onclick="look('${logistics_number!}');" href="javascript:;" title="查看物流">
${logistics_number!}<br><br>
</a>
</#list>
</td>
item.logistics_number 的结构是字符串:1213,4567,5042 freemaeker 在前台直接进行使用split分割,可以使别的模块在传入时批量传入(此处是财务项目开单时一个单号对应多个物流单号,传入的是“,”分开的字符串,前台进行解析,点击每个单号可以查看相应的物流信息)
原创粉丝点击