在您展示具體的案例,也許你應該只寫
<#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(...))}
但是,要小心,如果您打印的值與${...}
,它的(當然,如果你使用的話),而如果你用<@...>
打印東西,它永遠不會被轉義(因爲<@...>
/<#...>
打算打印標記)。因此,如果您的郵件包含HTML,則可能最終會爲用戶顯示HTML標記(因爲<
將被轉義爲<
等等)。除非你寫<#noescape>${...}</#noescape>
。
(更新來逃避:FreeMarker的2.3.24支持自動無#escape
逃逸,在那裏你會使用${su.message(...)?no_esc}
更妙的是,如果你不知何故知道message
功能,該消息是HTML裏面,你可以使用<#return springMacroRequestContext.getMessage(...)?no_esc>
,然後只寫${su.message(...)}
和FreeMarker不會雙重轉義它。)
謝謝!非常完整的答案。 – 2013-02-24 10:33:24