如何检查FreeMarker模板中是否存在变量?


175

我有一个Freemarker模板,其中包含一堆占位符,在处理模板时会为其提供值。如果要提供userName变量,我想有条件地包括模板的一部分,例如:

[#if_exists userName]
  Hi ${userName}, How are you?
[/#if_exists]

但是,FreeMarker手册似乎表明if_exists已过时,但是我找不到其他方法来实现这一目标。当然,我可以简单地提供一个额外的布尔变量isUserName,并像这样使用它:

[#if isUserName]
  Hi ${userName}, How are you?
[/#if]

但是,如果有一种方法可以检查userName是否存在,那么我可以避免添加此额外变量。

Answers:


302

要检查该值是否存在:

[#if userName??]
   Hi ${userName}, How are you?
[/#if]

或使用标准的freemarker语法:

<#if userName??>
   Hi ${userName}, How are you?
</#if>

要检查该值是否存在并且不为空:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>

1
如果其他人对此不满意,则#if语法应使用小于和大于字符而不是方括号括起来。例如:<#if userName ??>
Cameron 2010年

它实际上是可以使用这种语法,所以我就跟着这个问题的语法:看freemarker.sourceforge.net/docs/...
乌尔夫Lindback

10
这仅检查var是否存在。但是,如果“ userName”中的字符串为空,则<#if userName ??>将返回true!请参阅此页面上的@ user1546081答案以解决此问题。
Adrien Be


65

我也认为if_exists的用法如下:

Hi ${userName?if_exists}, How are you?

如果userName为null,则不会中断,如果为null,则结果为:

Hi , How are you?

if_exists现在已被弃用,并已替换为默认运算符!如

Hi ${userName!}, How are you?

默认运算符还支持默认值,例如:

Hi ${userName!"John Doe"}, How are you?

1
默认值运算符不能用于评估布尔值。因此,不能在ifop要求的语句中使用它。
Madbreaks 2014年

5

我认为很多人都希望能够检查其变量是否不为空以及是否存在。我认为在许多情况下检查是否存在和是否为空是个好主意,它使您的模板更健壮,更不容易出现愚蠢的错误。换句话说,如果在使用变量之前检查以确保变量不为null且不为空,则模板将变得更加灵活,因为您可以向其中抛出null变量或空字符串,并且其作用相同在任一情况下。

<#if p?? && p?has_content>1</#if>

假设您要确保p不只是空格。然后,您可以在检查是否修剪之前对其进行修剪has_content

<#if p?? && p?trim?has_content>1</#if>

更新

请忽略我的建议- has_content仅此而已,因为它会执行空检查和空检查。这样做p?? && p?has_content等效p?has_content,因此您最好只使用has_content


2

对于FreeMarker 2.3.7之前的版本

您不能使用它??来处理缺失值,旧语法是:

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.