gpt4 book ai didi

spring-mvc - Spring MVC/Freemarker : using a message from a bundle in a Freemarker expression

转载 作者:行者123 更新时间:2023-12-02 05:13:19 24 4
gpt4 key购买 nike

在 Fremarker 模板中,我需要在 Freemarker 表达式中访问从 Spring MVC 提供的 i18n 资源包中获取的消息。

我已经从 spring.ftl 中导入了 Spring 宏,我可以使用带有以下宏的消息:

<@spring.messageText "my.key" "Default message" />

但实际上我无法从内部表达式访问消息,例如内置插件:

${myBoolean?string( ###here I want my true message###, ###here I want my false message###)}

我该怎么做?

最佳答案

在你展示的具体案例中,也许你应该写

<#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 标记(因为 < 将被转义为 &lt; 等等)。除非,你写<#noescape>${...}</#noescape> .

(转义更新:FreeMarker 2.3.24 支持不使用 #escape 的自动转义,在那里您可以使用 ${su.message(...)?no_esc} 。更好的是,如果您以某种方式知道 message 函数内部消息是 HTML,您可以使用 <#return springMacroRequestContext.getMessage(...)?no_esc> ,然后只写 ${su.message(...)} 并且 FreeMarker 不会对其进行双重转义。)

关于spring-mvc - Spring MVC/Freemarker : using a message from a bundle in a Freemarker expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15041632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com