我有一个 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 是否存在,那么我可以避免添加这个额外的变量。
要检查该值是否存在:
[#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>
这个似乎更合适:
<#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?
default 运算符还支持默认值,例如:
Hi ${userName!"John Doe"}, How are you?
if
语句中使用。
我想很多人都希望能够检查他们的变量是否不为空以及它是否存在。我认为在很多情况下检查存在性和空性是一个好主意,并且可以使您的模板更加健壮并且不易出现愚蠢的错误。换句话说,如果您在使用它之前检查以确保您的变量不为空且不为空,那么您的模板会变得更加灵活,因为您可以将空变量或空字符串放入其中,并且它的工作方式相同在任一情况下。
<#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
。
对于 FreeMarker 2.3.7 之前的版本
您不能使用 ??
处理缺失值,旧语法是:
<#if userName?exists>
Hi ${userName}, How are you?
</#if>