部分转载自 [url]http://blog.youkuaiyun.com/pk490525/article/details/7590362[/url]
//以下引用官方描述:
//引用
The FreeMarker template language doesn't know the Java language null at all. It doesn't have null keyword, and it can't test if something is null or not.
1.判断是否存在,通过exists关键字或者"??"运算符。都将返回一个布尔值
user.name?exists
user.name??
[html] view plaincopy
<#if user.name?exists>
//TO DO
</#if>
<#if user.age??>
//TO DO
</#if>
2.忽略null值
假设前提:user.name为null
${user.name},异常
${user.name!},显示空白
${user.name!'vakin'},若user.name不为空则显示本身的值,否则显示vakin
${user.name?default('vakin')},同上
${user.name???string(user.name,'vakin')},同上
!语法 :
(1).原理:使用形式概览:unsafe_expr!default_expr或unsafe_expr!或 (unsafe_expr)!default_expr或(unsafe_expr)!
这个操作符允许你为可能不存在的变量指定一个默认值。
(2)例如:假设下面展示的代码中没有名为mouse的变量:
当这样定义时
${mouse!"no mouse"}
<#assign mouse="lala">
${mouse!"no mouse"}
将会输出
no mouse
lala
另外默认值可以是任何类型的表达式,也可以不必是字符串。你也可以这么写:
hits!0或colors!["red", "green", "blue"]。默认值表达式的复杂程度没有严格限制,你还可以这么来写:cargo.weight!(item.weight * itemCount + 10) 。
(3)警告:
如果在!后面有复合表达式,如1 + x,通常使用括号,像${x!(1 + y)}或${(x!1) + y)},这样就根据你的意思来确定优先级。由于FreeMarker 2.3.x版本的源码中的小失误所以必须这么来做。!(作为默认值操作)的优先级非常低。这就意味着${x!1 + y}会被FreeMarker误解为${x!(1 + y)},而真实的意义是${(x!1) + y}。这个源码的错误在FreeMarker 2.4中会得到修正。在编程中注意这个错误,要么就使用FreeMarker 2.4!
如果默认值被省略了,那么结果将会是空串,空序列或空哈希表。(这是FreeMarker允许多类型值的体现)如果想让默认值为0或false,则注意不能省略它。例如:
当这样定义时
(${mouse!})
<#assign mouse="lala">
(${mouse!})
将会输出
()
(lala)
另外注意点详见freemark文档
??语法: Missing value test operator ,测试是否为missing value
unsafe_expr?? :product.color??将只测试color是否为null
(unsafe_expr)??:(product.color)??将测试product和color是否存在null