写这样的东西既乏味又丑陋:
<input type="button" value="<fmt:message key="submitKey" />" />
如果您想将消息标记嵌套在另一个标记的属性中,情况会变得更糟。
有没有什么速记。例如(就像在JSF中):
<h:commandButton value="#{msg.shareKey}" />
(仅适用于spring-mvc的解决方案)
发布于 2010-07-04 19:01:07
这感觉有点像黑客,但您可以编写一个自定义的java.util.Map
实现,当get(key)
被调用时,它将从Spring MessageSource
中获取消息。此Map
可以添加到msg
密钥下的模型中,允许您使用${msg.myKey}
取消对消息的引用。
也许还有其他动态结构不是JSP所能识别的,它不是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。
发布于 2010-07-10 02:51:55
如果你想要的只是一个快捷方式,你可以创建一个标记文件,比如btn.tag
<%@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}" />" />
并像这样使用它
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags"%>
...
<tags:btn key="submitKey" >
...
发布于 2011-12-07 16:38:13
我找到了一种不用拦截器的方法:
${pageScope["org.springframework.web.servlet.tags.REQUEST_CONTEXT"]
.getMessage("hello")}
但是它太长了,而且密钥"org.springframework.web.servlet.tags.REQUEST_CONTEXT“可能并不适用于所有版本的spring。
https://stackoverflow.com/questions/3174373
复制相似问题