首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有<fmt:message key="key“/>的简写?

有没有<fmt:message key="key“/>的简写?
EN

Stack Overflow用户
提问于 2010-07-04 18:28:31
回答 4查看 10.8K关注 0票数 18

写这样的东西既乏味又丑陋:

代码语言:javascript
复制
<input type="button" value="<fmt:message key="submitKey" />" />

如果您想将消息标记嵌套在另一个标记的属性中,情况会变得更糟。

有没有什么速记。例如(就像在JSF中):

代码语言:javascript
复制
<h:commandButton value="#{msg.shareKey}" />

(仅适用于spring-mvc的解决方案)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-04 19:01:07

这感觉有点像黑客,但您可以编写一个自定义的java.util.Map实现,当get(key)被调用时,它将从Spring MessageSource中获取消息。此Map可以添加到msg密钥下的模型中,允许您使用${msg.myKey}取消对消息的引用。

也许还有其他动态结构不是JSP所能识别的,它不是Map,但我想不出一个。

代码语言:javascript
复制
public class I18nShorthandInterceptor extends HandlerInterceptorAdapter {

    private static final Logger logger = Logger.getLogger(I18nShorthandInterceptor.class);

    @Autowired
    private MessageSource messageSource;

    @Autowired
    private LocaleResolver localeResolver;

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        request.setAttribute("msg", new DelegationMap(localeResolver.resolveLocale(request)));

        return true;
    }

    private class DelegationMap extends AbstractMap<String, String> {
        private final Locale locale;

        public DelegationMap(Locale locale) {
            this.locale = locale;
        }

        @Override
        public String get(Object key) {
            try {
                return messageSource.getMessage((String) key, null, locale);
            } catch (NoSuchMessageException ex) {
                logger.warn(ex.getMessage());
                return (String) key;
            }
        }
        @Override
        public Set<Map.Entry<String, String>> entrySet() {
            // no need to implement this
            return null;
        }

    }
}

作为另一种选择:

代码语言:javascript
复制
<fmt:message key="key.name" var="var" />

然后使用${var}作为常规EL。

票数 12
EN

Stack Overflow用户

发布于 2010-07-10 02:51:55

如果你想要的只是一个快捷方式,你可以创建一个标记文件,比如btn.tag

代码语言:javascript
复制
<%@tag%>
<%@ attribute name="key" required="true" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<input type="button" value="<fmt:message key="${key}" />" />

并像这样使用它

代码语言:javascript
复制
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags"%>
...
<tags:btn key="submitKey" >
...
票数 4
EN

Stack Overflow用户

发布于 2011-12-07 16:38:13

我找到了一种不用拦截器的方法:

代码语言:javascript
复制
${pageScope["org.springframework.web.servlet.tags.REQUEST_CONTEXT"]
    .getMessage("hello")}

但是它太长了,而且密钥"org.springframework.web.servlet.tags.REQUEST_CONTEXT“可能并不适用于所有版本的spring。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3174373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档