FreeMarker模板的编写语言为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据,而在模板之外注意于要展示什么数据。
注意:freemarker中显示某对象使用${name}, freeMarker控制较严格,对于null,或者miss value,freemarker会报错。
1. 需要判断对象是否为空;
2. 也可以通过设置默认值来避免对象为空的错误。
判断为空具体方法:
!:default value operator,语法结构为:unsafe_expr!default_expr,
${name!''}如果name为空,就以默认值(“!”后的字符)显示。
对象user,name为user的属性的情况,user,name都有可能为空,可以写成${(user.name)!''},
表示user或者name为null,都显示为空。
??: Missing value test operator ,测试是否为missing value
product.color??将只测试color是否为null
(product.color)??将测试product和color是否存在null
?exists:旧版本的用法
常用语法:
<#-- --> freemark的注释
前提:将数据封装到map中,每个元素可以是个对象,有属性,有关联的对象
properties 为准备好的Map对象集合,
${ package } packge为变量,为map的key,${}后可以直接显示内容;
${.now} 当前时间
className=dept
${ className?cap_first } 首字母大写
${ className?uncap_first } 首字母小写
全小写
<#if (list.title?length>15)> 字符串长度
${ package?replace(".","/") } 替换
== html
html 用于将字符串中的<、>、&和“替换为对应得<>":&
== 特殊字符替换
$ ${'$'}
# ${'#'}
== FreeMarker不会自动进行类型的转换
常见的转换:
String --> int ?eval
int --> String ?c
freemarker中的c函数是将数字转换成字符串,当你在页面中要显示带小数的数字时,一定要写成${x?c}而不能写成${x?default('')},否则显示出的数字都变成了整数,小数位都被自动截掉了。切记!!!
== 遍历集合
<#list properties as pro>
private ${pro.proType} ${pro.proName};<#if pro.proComment != "">//${pro.proComment}#if>
#list>
== 定义变量,显示变量
<#assign x=pro.proName?index_of("createBy")>
${x}
布尔类型转换为字符串显示
<#assign x=pro.primary?string('yes', 'no')>
${x}
Boolean类型不能使用isXxx,需要使用getXxx,因为Freemarker使用java会对isXxx映射返回boolean基本型,但是freemarker不支持基本类型boolean,会抛异常。
freemarker中输出时可以使用这种方式输出${xxx?string("true","flase")}当xxx为true时显示字符串true,否则为字符串false,当然true,false字符串也可以换成其他字符串,比如yes和no。
==布尔判断
<#if pro.primary>
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
#if>
<#if pro.primary?string('yes', 'no')=="no">
<#if "createBy,createDept,createTime,updateBy,updateTime"?index_of(pro.proName) == -1>
public ${pro.proType} get${pro.proName?cap_first}() {
return this.${pro.proName};
}
public void set${pro.proName?cap_first}(${pro.proType} ${pro.proName}) {
this.${pro.proName} = ${pro.proName};
}
#if>
#if>
==判断空串
<#if pro.proComment != "">//${pro.proComment}#if>
1. 判断对象是否存在(null)
例如判断 target 是否为null,如果不为 nll 则做xxx动作
<#if target??>
xxxx
#if>
(目标变量后面连续两个??)
2. 字符串或数字比较
java里标准字符串比较需要 .equals() 方法,在freemarkder中进行了简化,字符串的比较方法和数字做到完全一样
<#if str == "success">
xxx
#if>
<#if str !== "error">
xxx
#if>
==判断是否包含子串:
pro.proName为子串
<#if "CreateBy,CreateDept,CreateTime"?index_of(pro.proName)==-1>
== 高级应用:宏 --常用场景:实现每个文件引入版本
example:
在CopyRight.ftl中定义:
<#macro CopyRight>
/**
* @Description: ${ className }Service接口
* @Author: 米米米
* @Company: http://java.cn
* @CreateDate: ${.now}
*/
#macro>
调用:
<#import "CopyRight.ftl" as my>
<@my.CopyRight/>