50

我只想做这样的事情:

<a href="${ a? 'a.htm' : 'b.htm'}">
4

5 回答 5

92

如果您使用的是 freemarker 2.3.23 或更新版本,您可以使用then内置的:

<a href="${a?then('a.htm','b.html')}" target="${openTarget}">

如果您使用的是旧版本的 freemarker,则可以使用string内置的:

<a href="${a?string('a.htm','b.html')}" target="${openTarget}">

当应用于布尔值时,string内置函数将充当三元运算符。


于 2013-07-09T06:13:58.813 回答
8

如果您使用的是 2.3.23 之前的旧 Freemarker 版本,那么您可以使用这个宏,它提供了一种直接的方式来执行三元运算:

<#macro if if then else=""><#if if>${then}<#else>${else}</#if></#macro>

它易于使用,看起来不错且可读性强:

<@if someBoolean "yes" "no"/>

请注意,它是@if- 而不是#if内置指令中的。这里还有一些例子。

<!-- `else` is optional -->
<@if someBoolean "someBoolean is true"/>  

<!-- expressions -->
<@if (someBoolean||otherBoolean)  "hello,"+user.name  1+2+3 />  

<!-- with parameter names -->
<@if someBoolean then="yes" else="no" />  

<!-- first in list? -->
<#list seq as x>
    <@if (x_index==0)  "first"  "not first"/> 
<#list> 

出于某种原因,如果它们是非布尔表达式,则不能在无名参数周围添加括号。这可能会进一步提高可读性。

于 2015-02-07T03:36:49.660 回答
4

您可以定义一个if声明如下的自定义函数:

<#function if cond then else="">
  <#if cond>
    <#return then>
  <#else>
    <#return else>
  </#if>
</#function>

该函数可用于任何${...}表达式。您的代码如下所示:

<a href="${if(a, 'a.htm', 'b.htm')}">

与@kapep 相比,我认为您应该使用函数,而不是宏。宏产生(文本)输出,而函数返回一个值,例如可以分配给变量,但也可以写入输出,因此使用函数更加灵活。此外,应用函数的方式更接近于使用三元运算符,它也可以在${...}表达式内部使用,而不是作为指令。

例如,如果您多次需要条件链接目标,则将其分配给局部变量是有意义的:

<#assign targetUrl=if(a, 'a.htm', 'b.htm')/>
<a href="${targetUrl}">link 1</a>
...
<a href="${targetUrl}">link 2</a>

使用函数而不是宏,@kapep 的示例如下所示:

<!-- `else` is optional -->
${if(someBoolean, "someBoolean is true")}  

<!-- expressions -->
${if(someBoolean||otherBoolean, "hello,"+user.name, 1+2+3)} 

<!-- with parameter names: not possible with functions,
     but also not really helpful -->

<!-- first in list? -->
<#list seq as x>
    ${if(x_index==0, "first", "not first")}
<#list>
于 2015-05-20T12:09:00.107 回答
3

从 FreeMarker 2.3.23 开始,您可以编写a?then('a.htm', 'b.htm'). condition?then(whenTrue, whenFalse)over的优点condition?string(whenTrue, whenFalse)是它适用于非字符串whenTrueand whenFalse,并且它只计算whenTrueandwhenFalse表达式之一(无论选择哪个分支)。

于 2015-07-05T17:19:14.350 回答
2

使用插值语法:

"${(a?has_content)?string('a.htm','b.htm')}"

has_content :可用于处理 STRING(如果为空字符串,则返回 FALSE)

于 2019-03-15T08:14:15.290 回答