小编典典

是否有速记 ?

jsp

编写类似以下内容的代码既繁琐又丑陋:

<input type="button" value="<fmt:message key="submitKey" />" />

而且,如果您想将message标签嵌套在另一个标签的属性中,那就更糟了。

是否有任何速记。例如(例如在JSF中):

<h:commandButton value="#{msg.shareKey}" />

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


阅读 218

收藏
2020-06-08

共1个答案

小编典典

感觉有点像hack,但是您可以编写一个自定义实现,java.util.Map该实现在get(key)被调用时会从Spring获取消息MessageSource。这Map可以在下方添加到模型中msg的关键,让您使用解引用消息${msg.myKey}

也许除了JSP EL所能识别的以外,还有其他动态结构不是Map,但我想不到一个。

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;
        }

    }
}

作为备选:

<fmt:message key="key.name" var="var" />

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

2020-06-08