在您展示的具体案例中,也许您应该只写
<#if myBoolean><@spring.messageText ...><#else><@spring.messageText ...></#if>
如果经常需要,那就做一个#macro
。
在更一般的情况下,问题是您不能从表达式中调用宏(或指令),Spring 也应该提供一个函数变体message
。我不知道 Spring MVC,但是看着spring.ftl
,似乎springMacroRequestContext.getMessage(code, text)
应该可以解决这个问题。但这很冗长,所以您可能想创建一个/lib/springutils.ftl
内容如下:
<#function message code text=''>
<#if text != ''>
<#return springMacroRequestContext.getMessage(code, text)>
<#else>
<#return springMacroRequestContext.getMessage(code)>
</#if>
</#function>
然后在您的模板中:
<#import "/lib/springutils.ftl" as su>
${myBoolean?string(su.message(...), su.message(...))}
但是,请注意,如果您使用 打印一个值${...}
,它会受到#escape
(当然,如果您使用它)的影响,而如果您使用 打印一些东西<@...>
,它永远不会转义(作为<@...>
/<#...>
意味着打印标记)。因此,如果您的消息包含 HTML,${...}
那么您最终可能会按字面意思为用户显示 HTML 标记(如<
将转义到<
等等)。除非,你写<#noescape>${...}</#noescape>
.
(转义更新:FreeMarker 2.3.24 支持不带 的自动转义#escape
,你可以使用${su.message(...)?no_esc}
。更好的是,如果你在message
函数内部知道消息是 HTML,你可以使用<#return springMacroRequestContext.getMessage(...)?no_esc>
,然后只写${su.message(...)}
,FreeMarker 不会加倍-逃脱它。)