spring mvc国际化资源实现

来源:互联网 发布:战龙三国旗子进阶数据 编辑:程序博客网 时间:2024/05/16 15:54

springMVC给我们提供了国际化支持,简单来说就是设置整个系统的运行语言,然后根据系统的运行语言来展示对应语言的页面,一般我们称之为多语言。通过源码我们可以了解到springMVC对多语言的支持就是设置Locale的语言信息来实现的,只不过是设置了通过cookie、session等方式设置而已。

springMVC多语言具体由拦截器LocaleChangeInterceptor,解析器LocaleResolver,资源管理器来实现。

LocaleChangeInterceptor需要在配置文件中设置,用来获取客户端的Local信息。

解析器LocaleResolver接口有四个默认实现的类AcceptHeaderLocaleResolver,FixedLocaleResolver、CookieLocaleResolver和SessionLocaleResolver。

AcceptHeaderLocaleResolver:其实没有任何具体实现,是通过浏览器头部的语言信息来进行多语言选择。

FixedLocaleResolver:设置固定的语言信息,这样整个系统的语言是一成不变的,用处不大。

CookieLocaleResolver:将语言信息设置到Cookie中,这样整个系统就可以获得语言信息

SessionLocaleResolver:与CookieLocaleResolver类似将语言信息放到Session中,这样整个系统就可以从Session中获得语言信息。




资源管理器同样需要在配置文件中配置,主要有两个实现类:ResourceBundleMessageSource 和ReloadableResourceBundleMessageSource

要关心的是这两个的区别:

1.ResourceBundleMessageSource在xml配置中无法指定编码:
     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
     <property name="basenames">
          <list>
               <value >error</value >
               <value >message</value >
          </list>    
</property>
     </bean>


而ReloadableResourceBundleMessageSource可以指定编码,譬如:
     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="defaultEncoding" value ="gbk" />
        <property name="basename" value ="message" />
    </bean>


2.加载资源文件的方式不同:
  ResourceBundleMessageSource的加载,使用ClassUtils.getDefaultClassLoader()加载器,getDefaultClassLoader方法;
  JVM默认的加载方式,先从当前线程中获取类加载器,如果没有,就获取这个类本身的类加载器
  ReloadableResourceBundleMessageSource默认也使用ClassUtils.getDefaultClassLoader()加载器。
  ReloadableResourceBundleMessageSource加载时,默认使用DefaultResourceLoader,他会先判断资源path是否带有classpath:前缀,如果有,用 ClassPathResource去加载资源文件,如果没有试着用文件协议的url去访问,再没有就在contextPath即WEB-INF下查找。


资源配置文件的时候注意useCodeAsDefaultMessage属性设置,默认为false,这样当Spring在ResourceBundle中找不到messageKey的话,就抛出NoSuchMessageException,   把它设置为True,则找不到不会抛出异常,而是使用messageKey作为返回值。