Spring MVC国际化的总结

Spring MVC国际化
1)基于浏览器请求的国际化实现:
在配置文件applicationContext.xml中添加的内容如下:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <!-- 国际化信息所在的文件名 -->                     
    <property name="basename" value="classpath:messages" />   
    <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称  -->               
    <property name="useCodeAsDefaultMessage" value="true" />           
</bean>
当一个请求到达,DispatcherServlet就会寻找LocaleResolver,如果找到就会试图通过他进行本地化。通过RequestContext.getLocale()方法我们可以得到locale resolver解释的本地化语言
Locale resolver和拦截器定义在org.springframework.web.servlet.i18n包中,并且可以在applicationContext中进行配置。
然后写一个Controller
@Controller
@RequestMapping(value = "/global")
public class GlobalController {    
    @RequestMapping(value="/test", method = {RequestMethod.GET})
    public String test(HttpServletRequest request,Model model){
        if(!model.containsAttribute("contentModel")){           
            //从后台代码获取国际化信息
            RequestContext requestContext = new RequestContext(request);
            model.addAttribute("money", requestContext.getMessage("money"));
            model.addAttribute("date", requestContext.getMessage("date"));
            
            FormatModel formatModel=new FormatModel();
            formatModel.setMoney(12345.678);
            formatModel.setDate(new Date());
            
            model.addAttribute("contentModel", formatModel);
        }
        return "globaltest";
    }    
}
这里还需要添加配置文件
messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件
添加一个视图
<body>
    下面展示的是后台获取的国际化信息:<br/>
    ${money}<br/>
    ${date}<br/>


    下面展示的是视图中直接绑定的国际化信息:<br/>
    <spring:message code="money"/>:<br/>
    <spring:eval expression="contentModel.money"></spring:eval><br/>
    <spring:message code="date"/>:<br/>
    <spring:eval expression="contentModel.date"></spring:eval><br/>    
</body>


2)基于Session的国际化实现
之前在applicationContext.xml中配置的要留下,即:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <!-- 国际化信息所在的文件名 -->                     
    <property name="basename" value="classpath:messages" />   
    <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称  -->               
    <property name="useCodeAsDefaultMessage" value="true" />           
</bean>
<mvc:interceptors>  
    <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> 
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />  
</mvc:interceptors>  
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
视图层这里采用可选,中文和英文
<body>
    <a href="test?langType=zh">中文</a> | <a href="test?langType=en">英文</a><br/>
    下面展示的是后台获取的国际化信息:<br/>
    ${money}<br/>
    ${date}<br/>
    下面展示的是视图中直接绑定的国际化信息:<br/>
    <spring:message code="money"/>:<br/>
    <spring:eval expression="contentModel.money"></spring:eval><br/>
    <spring:message code="date"/>:<br/>
    <spring:eval expression="contentModel.date"></spring:eval><br/>   
</body>
在Controller中加入一个判断
public String test(HttpServletRequest request,Model model, @RequestParam(value="langType", defaultValue="zh") String langType)
{
    。。。。。。
    if(langType.equals("zh")){
       Locale locale = new Locale("zh", "CN"); 
       request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); 
    }else if(langType.equals("en")){
       Locale locale = new Locale("en", "US"); 
       request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
    }else 
        request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale());
。。。。。
}  
**关于Locale的一些讲解
public final class Locale extends Object  其中Locale对象表示了特定的地理、政治和文化地区
字段摘要:
         Locale.CANADA 表示中国常量
         Locale.US 表示美国常量
Locale.JAPAN 表示日本常量
。。。
三个构造方法
    1)Locale(String language) 根据语言代码构造一个语言环境
2)Locale(String language,String country) 根据语言和国家构造一个语言环境
3)Locale(String language,String country,String variant)根据语言、国家和变量构造一个语言环境

3)基于Cookie的国际化实现
将Session在applicationContext.xml中配置的注释掉,换成
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
修改Controller
@Controller
@RequestMapping(value = "/global")
public class GlobalController {   
    @RequestMapping(value="/test", method = {RequestMethod.GET})
    public String test(HttpServletRequest request, HttpServletResponse response, Model model, @RequestParam(value="langType", defaultValue="zh") String langType){
        if(!model.containsAttribute("contentModel")){        
            if(langType.equals("zh")){
                Locale locale = new Locale("zh", "CN"); 
                (new CookieLocaleResolver()).setLocale (request, response, locale);
            }
            else if(langType.equals("en")){
                Locale locale = new Locale("en", "US"); 
                (new CookieLocaleResolver()).setLocale (request, response, locale);
            }
            else 
                (new CookieLocaleResolver()).setLocale (request, response, LocaleContextHolder.getLocale());            
            //从后台代码获取国际化信息
            RequestContext requestContext = new RequestContext(request);
            model.addAttribute("money", requestContext.getMessage("money"));
            model.addAttribute("date", requestContext.getMessage("date"));
            
            FormatModel formatModel=new FormatModel();
            formatModel.setMoney(12345.678);
            formatModel.setDate(new Date());            
            model.addAttribute("contentModel", formatModel);
        }
        return "globaltest";
    }  
}
关于<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />3个属性的说明(可以都不设置而用其默认值):
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <!-- 设置cookieName名称,可以根据名称通过js来修改设置,也可以像上面演示的那样修改设置,默认的名称为 类名+LOCALE(即:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE-->
    <property name="cookieName" value="lang"/>
    <!-- 设置最大有效时间,如果是-1,则不存储,浏览器关闭后即失效,默认为Integer.MAX_INT-->
    <property name="cookieMaxAge" value="100000">
    <!-- 设置cookie可见的地址,默认是“/”即对网站所有地址都是可见的,如果设为其它地址,则只有该地址或其后的地址才可见-->
    <property name="cookiePath" value="/">
</bean>


4)基于URL请求的国际化
添加一个类
public class MyAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver {


    private Locale myLocal;


    public Locale resolveLocale(HttpServletRequest request) {
        return myLocal;
    } 


    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        myLocal = locale;
    }
  
}
将上面配置的localeResolver注释掉,换成
<bean id="localeResolver" class="xx.xxx.xxx.MyAcceptHeaderLocaleResolver"/>
此时可以在请求后附上locale=zh_CN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值