自定义国际化标签

由于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为语言参数



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值