【问题标题】:How to check if a variable exists in a FreeMarker template?如何检查 FreeMarker 模板中是否存在变量?
【发布时间】:2010-09-23 07:59:01
【问题描述】:

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

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

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

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

但是如果有办法检查用户名是否存在,那么我可以避免添加这个额外的变量。

【问题讨论】:

    标签: java templates freemarker


    【解决方案1】:

    检查值是否存在:

    [#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 语法应该用小于和大于字符而不是括号括起来。例如:
    • 这个语法其实是可以用的,所以我只是按照问题的语法:见freemarker.sourceforge.net/docs/…
    • 这仅检查 var 是否存在。但是如果“userName”中有一个空字符串, 将返回 true !请参阅此页面上的@user1546081 答案以解决此问题。
    • 您好,有没有什么方法可以在没有“if”语句的情况下执行 ${userName!?size} ?还有 ${user!.userName!?size}
    【解决方案2】:

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

    【讨论】:

    • 默认值运算符不能用于计算布尔值。因此,它不能按操作要求在if 语句中使用。
    • 您好,有什么方法可以在没有“if”语句的情况下执行 ${userName!?size} 吗?还有 ${user!.userName!?size}
    【解决方案3】:

    这个似乎更合适:

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

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

    【讨论】:

    • 似乎检查 var 是否存在以及它的内容是否不为 null 或为空(这里指的是空字符串)。
    • 不得不对此投反对票,因为它在技术上是不正确的,并且如果变量 存在(op 想要检查的内容)但为空,则会导致意外(假阴性)行为。
    【解决方案4】:

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

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

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

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

    更新

    请忽略我的建议——has_content 就是所需要的,因为它会进行空检查和空检查。做p?? &amp;&amp; p?has_content相当于p?has_content,所以你也可以直接使用has_content

    【讨论】:

      【解决方案5】:

      对于 FreeMarker 2.3.7 之前的版本

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

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

      【讨论】:

        猜你喜欢
        • 2012-12-04
        • 1970-01-01
        • 2017-03-24
        • 2011-07-01
        • 1970-01-01
        • 2020-05-30
        • 2015-03-15
        • 2013-06-07
        • 2014-12-01
        相关资源
        最近更新 更多