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

我有一个Freemarker模板,其中包含一些处理模板时为其提供值的占位符。 我想有条件地包含模板的一部分,如果提供userNamevariables,如下所示:

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

然而,FreeMarker手册似乎表明,if_exists已被弃用,但我找不到另一种方法来实现这一点。 当然,我可以简单地提供一个额外的布尔variablesisUserName,并使用如下所示:

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

但是,如果有一种方法来检查userName是否存在,那么我可以避免添加这个额外的variables。

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

或者使用标准的freemarker语法:

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

这似乎是一个更好的适合:

 <#if userName?has_content> ... do something </#if> 

http://freemarker.sourceforge.net/docs/ref_builtins_expert.html

另外我认为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? 

我想很多人都希望能够检查他们的variables是否不是空的以及是否存在。 我认为在很多情况下检查存在和空白是一个好主意,并且使你的模板更健壮,更不容易出现愚蠢的错误。 换句话说,如果你在使用它之前检查你的variables是否为空而不是空的,那么你的模板变得更加灵活,因为你可以把一个空variables或者一个空string引入它,在任一情况下。

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

假设你想确保p不仅仅是空格。 然后,您可以在检查它是否has_content之前修剪它。

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

UPDATE

请忽略我的build议 – has_content是所有需要的,因为它与空检查一起进行空检查。 做p?? && p?has_content p?? && p?has_content相当于p?has_content ,所以你可以直接使用has_content