freemarker中的以下内容有什么区别?
!
has_content
??
if_exists
我用了 ??而不是has_content,它会导致如此巨大的问题。搞砸了我的一天。我真的需要弄清楚这件事。
当我使用
!(xyz.abc!)?? -- it dint work
当我使用
!(xyz.abc!)?has_content ... it did work
不是吗?或has_content或if_exists检查同一件事?
Answers:
??
告诉左操作数的值是否丢失(意味着它是Javanull
或您那里有未定义的变量),并相应地返回false
(丢失)或true
(不丢失)。
?has_content
类似于??
,不同之处在于它还会返回false
长度为0的字符串或空的FTL序列(如java.util.List
Java数组等)或空的FTL哈希(如java.util.Map
等等)。(不退还false
的0
,布尔false
等)
!
用于在缺少值(再次表示它是Javanull
或您有未定义的变量)时提供默认值,例如color!"no color"
。如果省略右手操作的!
,则默认值是一个空字符串和空序列和空散列在同一时间(多输入值),这是非常方便的书写之类的东西<#list things! as thing>
,${foo!}
。
?if_exists
是旧的写作方式??
。不要使用它。
当我们在这里时,请注意所有这些运算符仅覆盖点或[]
表达式的最后一步,就像user.price!0
仅处理,如果price
缺少user
,则处理,而如果user
本身缺失则不进行处理。为了涵盖这两种可能性,请使用(user.price)!0
,它处理在评估时抛出的所有遗漏的变量错误()
,而不管它们来自何处。
?has_content
是有用的,除非值是Boolean
或Number 1/0 for yes/no
<#elseif buyer.company?has_content >
就会给别人一个不确定的答案:如何检查买家是否存在我在以上的一切尝试了!
buyer
丢失,但如果company
一直存在,则始终存在,则为<#elseif buyer??>
,否则为<#elseif (buyer.company)??>
或<#elseif (buyer.company)?has_content>
。在()
使存在处理运营商覆盖整个表达式。