【问题标题】:Freemarker directive or method with boolean return带有布尔返回的 Freemarker 指令或方法
【发布时间】:2017-01-30 07:38:34
【问题描述】:

我正在尝试在 Freemarker 中创建一个执行布尔检查的自定义指令或方法,例如

<#if foo = 'bar'>
do something
</#if>

应该等价于

<@mycheck 'bar'>
do somethng
</@mycheck>

我已经在 Freemarker 中使用了自定义指令和方法,但我没有找到任何方法来创建它并返回布尔值。

更新

为了更清楚地说明我想要做什么,请考虑以下几点:如果模板显示在某个 URL 上,我想检查它。

所以不要将变量传递给模板并通过 if 进行检查,比如

<#if location = '/home/bar'>
do something
</#if>

我想像这样流利一点

<@location is='/home/bar'>
do somethng
</@location>

【问题讨论】:

    标签: java customization freemarker


    【解决方案1】:

    那里没有任何返回值(除非我们认为输出本身就是这样)。你可以这样写一个宏:

    <#macro mycheck value>
      <#if foo == value>
        <#nested>
      </#if>
    </#macro>
    

    然后这应该可以工作(假设您在数据模型或宏可以看到的其他地方有一个foo):

    <@mycheck 'bar'>
    do somethng
    </@mycheck>
    

    TemplateDirectiveModel 的解决方案非常相似,但不幸的是,参数必须通过名称(&lt;@mycheck expected='bar'&gt;... 或类似名称)传递,至少从 2.3.25 开始。而不是&lt;#nested&gt;,你只需在Java中调用TemplateDirectiveBody.render(...)#if当然只是一个Javaif

    TemplateMethodModel 不能用于此目的,因为它不能进行流量控制。

    【讨论】:

    • 其实我需要通过一个directie或者method来做到这一点,因为我需要对输入参数进行编程检查。
    • 谢谢。我会再次检查模型。但实际上我不清楚模型如何进行布尔检查,因为模型根本不返回布尔值。有了它在我看来的模型,我可以在执行方法中而不是在模板中处理做某事。
    • 假设您的原始问题是准确的,任何地方都不需要布尔(或任何其他)返回值。您只需调用TemplateDirectiveBody.render(...) 或不调用,这由execute 中的Java 代码决定。如果不调用,嵌套内容会被跳过,就像&lt;#if false&gt;...&lt;/#if&gt;一样。
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多