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.ListJava数组等)或空的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>。在()使存在处理运营商覆盖整个表达式。