spring对国际化的支持

spring对国际化的支持,需要3步:

    1. 配置bean,增加spring对国际化的支持  ReloadableResourceBundleMessageSource
    2. 资源文件  messages_zh_CN.properties
    3. 使用国际化  <s:message code=”hello”/>   context.getMessage(“hello”);

spring-service.xml,之前在spring-web.xml,导致获取不到bean
    <bean id=”messageSource” 
            class=”org.springframework.context.support.ReloadableResourceBundleMessageSource”> 
        <property name=”basenames”> 
    <list> 
        <value>classpath:/messages</value> 
    </list> 
    </property> 
    <property name=”defaultEncoding” value=”UTF-8″ /> 
    <property name=”useCodeAsDefaultMessage” value=”true”></property> 
</bean> 
<bean id=”localeResolver” class=”org.springframework.web.servlet.i18n.SessionLocaleResolver”> 
        <property name=”defaultLocale” value=”zh_CN”></property> 
</bean>

spring-web.xml 语言切换的时候拦截
  <mvc:interceptors> 
    <bean id=”localeChangeInterceptor” 
            class=”org.springframework.web.servlet.i18n.LocaleChangeInterceptor”> 
    <property name=”paramName” value=”lang” /> 
</bean> 
</mvc:interceptors>

资源文件在resources目录下,直接在classpath下


使用:jsp:标签使用,java:上下文.getMessage()

错误分析:
1. 加载资源文件的时候,会去判断beanFactory中有没有包含bean id=”messageSource”的bean,这也是为什么ReloadableResourceBundleMessageSource类的bean的id一定要为“messageSource”。这个时候可以通过beanFactory.getBeanDefinition(“messageSource”),如果没有包含,则不走if语句,spring就没有加载资源文件,那么当你在使用<s:message code=”hello”/>

将会报错:No message found under code ‘title’ for locale ‘zh_CN’, 换句话说此错误是没有加载到bean messageSource。

2. 语言切换无效。通过地址栏http://localhost:8080/page/index.jsp?lang=en 

地址栏请求是*.jsp,参照tomcat home/conf/web.xml截图


所有的*.jsp 会被tomcat容器拦截,根据servlet匹配原则,就不会走DispatcherServlet,就不会走拦截器LocaleChangeInterceptor,所以设置语言无效。

方案:
现在将切换语言的功能通过访问controller

http://localhost:8080/page/index?lang=en 

让拦截LocaleChangeInterceptor去设置语言