194

我有一个 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 是否存在,那么我可以避免添加这个额外的变量。

4

5 回答 5

341

要检查该值是否存在:

[#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>
于 2008-11-20T20:25:21.843 回答
102

这个似乎更合适:

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

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

于 2012-07-23T14:15:59.423 回答
70

我也认为if_exists被用作:

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

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

Hi , How are you?

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

Hi ${userName!}, How are you?

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

Hi ${userName!"John Doe"}, How are you?
于 2008-11-20T20:33:05.667 回答
6

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

<#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

于 2014-05-12T18:59:35.580 回答
4

对于 FreeMarker 2.3.7 之前的版本

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

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
于 2018-04-06T11:08:12.470 回答