由于springmvc国际化标签spring:message不包括语言类型参数,web项目通常是根据cookie来实现整个项目的国际化,如果对于特定的页面也实现独立的国际化,springmessage标签就力不从心了。下面我们来探讨一下如何实现单独页面的国际化。
首先tld文件中加入(自定义标签所需文件)
<tag>
<name>message</name>
<tag-class>包名.MessageTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>key</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>language</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
最重要的当然是MessageTag类的代码
<pre name="code" class="html">import java.io.IOException;
import java.util.Locale;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.web.servlet.tags.RequestContextAwareTag;
import org.springframework.web.util.ExpressionEvaluationUtils;
//继承spring库中的的RequestContextAwareTag
public class MessageTag extends RequestContextAwareTag{
/**标签事例
* <h:message key='questionnairsurvey' language="${param.language}"/>
*/
private static final long serialVersionUID = -7395069023491526881L;
private String key;
private String language;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
@Override
protected int doStartTagInternal() throws Exception {
try {
//获得期望得到的内容
String msg = resolveMessage();
//将获得的内容输出到jsp中标签对应的位置
writeMessage(msg);
return EVAL_BODY_INCLUDE;
}
catch (NoSuchMessageException ex) {
throw new JspTagException(ex.getMessage());
}
}
protected String resolveMessage() throws JspException, NoSuchMessageException {
<span style="color:#ff0000;">//获取spring中缓存国际化资源文件内容的类
MessageSource messageSource = getRequestContext().getMessageSource();</span>
if (messageSource == null) {
throw new JspTagException("No corresponding MessageSource found");
}
//若key中包含el表达式,获取解析后的值
String resolvedKey = ExpressionEvaluationUtils.evaluateString("code", this.key, pageContext);
//若language中包含el表达式,获取解析后的值
String resolvedLanguage = ExpressionEvaluationUtils.evaluateString("text", this.language, pageContext);
Locale locale = null;
if ("zh".equals(resolvedLanguage)){
locale = new Locale("zh", "CN");
} else if("en".equals(resolvedLanguage)){
locale = new Locale("en", "US");
} else if ("ja".equals(resolvedLanguage)) {
locale = new Locale("ja", "JA");
}else {
locale = Locale.getDefault();
}
if (resolvedKey != null ) {
<span style="color:#ff0000;">return messageSource.getMessage(
resolvedKey, null,locale);//获取特定语言文件中key对应的value</span>
}
return resolvedKey;
}
protected void writeMessage(String msg) throws IOException {
pageContext.getOut().write(String.valueOf(msg));
}
}
jsp页面事例代码
<h:message key='questionnairsurvey' language="${param.language}"/> //key为properties资源文件中的key值 language为语言参数