• Spring MVC(十五)--SpringMVC国际化配置项


    Spring MVC中,当DispatcherServlet初始化的时候,会解析一个LocaleResolver接口的实现类,这个实现类就是用来解析国际化的。

    一、国际化解析器

    Spring MVC中提供了以下四个实现类:

    • AcceptHeaderLocaleResolver:spring默认的区域解析器,它通过校验http请求的accept-language头部来解析区域。这个头是由web浏览器根据底层操作系统的区域设置,这个区域无法改变用户的区域,所以只能根据操作系统设置而获取,一般不使用;
    • FixedLocaleResolver:使用固定的locale国际化,也是不可修改;
    • CookieLocaleResolver:根据cookie数据获取国际化数据,但是如果用户禁止或没有设置cookie,就会根据http头中的accept-language来获取;
    • SessionLocaleResolver:根据session进行国际化,即根据用户设置session的变量进行读取,所以它是可变的,也是使用最多的;

    为了修改国际化,Spring MVC还提供了一个拦截器-LocaleChangeInterceptor,通过它可以获取参数,然后根据参数来改变区域;

    它的配置方式如下:

    1、JAVA配置方式

    1⃣️配置CookieLocaleResolver

     1 /**
     2      * 配置CookieLocaleResolver 
     3      * bean名称必须是localeResolver
     4      * 
     5      * @return
     6      */
     7     @Bean(name = "localeResolver")
     8     public CookieLocaleResolver initCookieLocaleResolver() {
     9         CookieLocaleResolver clr = new CookieLocaleResolver();
    10         // 设置cookie名称
    11         clr.setCookieDomain("lang");
    12         // 设置超时秒数
    13         clr.setCookieMaxAge(3600);
    14         // 默认使用简体中文
    15         clr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
    16         return clr;
    17     }

    2⃣️配置SessionLocaleResolver

     1 /**
     2      * 配置SessionLocaleResolver 
     3      * bean名称必须是localeResolver
     4      * 
     5      * @return
     6      */
     7     @Bean(name = "localeResolver")
     8     public SessionLocaleResolver initSessionLocaleResolver() {
     9         SessionLocaleResolver slr = new SessionLocaleResolver();
    10         // 默认使用简体中文
    11         slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
    12         return slr;
    13     }

    2、XML配置方式

    1⃣️配置CookieLocaleResolver

     1 <!--第一种:配置cookie国际化解析器 -->
     2     <bean id="localeResolver"
     3         class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
     4         <!-- cookie变量的名称 -->
     5         <property name="cookieName" value="lang" />
     6         <!-- cookie超时时间 -->
     7         <property name="cookieMaxAge" value="20" />
     8         <!-- 默认使用简体中文 -->
     9         <property name="defaultLocale" value="zh_CN" />
    10     </bean>

    2⃣️配置SessionLocaleResolver

    1 <!--第一种:配置session国际化解析器 -->
    2     <bean id="localResolver"
    3         class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    4         因为session有其自身定义的超时时间和编码,所以此处不需要设置
    5         <property name="defaultLocale" value="zh_CN" />
    6     </bean>

    注意⚠️:

    • 不管配置哪种解析器,bean的名称都必须是localeResolver,这是Spring MVC默认的名称,不能修改,否则找不到;
    • session有其自定义的超时时间,所以无需配置;

    二、国际化文件加载

    在实现国际化之前,首先要加载相关的资源文件,即消息源,这个功能由Spring MVC提供的MessageSource接口完成,并且有四个非抽象的实现类:

    • StaticMessageSource:静态消息源;
    • DelegatingMessageSource:实现的是代理功能;
    • ResourceBundleMessageSource:由JDK提供的Bundle实现,只能把文件放置在对应的类路径下,不具备热加载功能,只有重启系统才能重新加载;
    • ReloadavleResourceBundleMessageSource:可以把文件放置在任何地方,并且在不重启系统的前提下也能重新加载资源文件,这样就可以在程序运行期修改并重新加载资源文件;

    其实在配置国际化解析器之前还要配置消息源,下面介绍如何配置,还是有两种方式:

    1、JAVA方式配置消息源

    1⃣️配置ResourceBundleMessageSource

     1 /**
     2      * 配置ResourceBundleMessageSource消息源 
     3      * bean名称必须为messageSource
     4      * 
     5      * @return
     6      */
     7     @Bean(name = "messageSource")
     8     public MessageSource initResourceBundleMessageSource() {
     9         ResourceBundleMessageSource rbms = new ResourceBundleMessageSource();
    10         rbms.setDefaultEncoding("UTF-8");
    11         rbms.setBasename("msg");
    12         return rbms;
    13     }

    2⃣️配置ReloadableResourceBundleMessageSource

     1 /**
     2      * 配置ReloadableResourceBundleMessageSource消息源 
     3      * bean名称必须为messageSource
     4      * 
     5      * @return
     6      */
     7     @Bean(name = "messageSource")
     8     public MessageSource initReloadableResourceBundleMessageSource() {
     9         ReloadableResourceBundleMessageSource rrbms = new ReloadableResourceBundleMessageSource();
    10         rrbms.setDefaultEncoding("UTF-8");
    11         // 因为是热加载,所以需要加上classpath
    12         rrbms.setBasename("classpath:msg");
    13         // 设置刷新的秒数,即多长时间刷新一次
    14         rrbms.setCacheSeconds(1800);
    15         // 设置刷新的毫秒数
    16         rrbms.setCacheMillis(1800000);
    17         return rrbms;
    18     }

    2、XML方式配置消息源

    1⃣️配置ResourceBundleMessageSource

    1 <!--第一种方式:配置ResourceBundleMessageSource:这种方式只能把资源文件放到指定的路径下,不能热加载,需要重启系统才能加载它 -->
    2     <bean id="messageResource"
    3         class="org.springframework.context.support.ResourceBundleMessageSource">
    4         <property name="defaultEncoding" value="UTF-8" />
    5         <property name="basename" value="msg" />
    6     </bean>

    2⃣️配置ReloadableResourceBundleMessageSource

     1 <!--第二种方式:配置ReloadableResourceBundleMessageSource:这种方式只能把资源文件放到任何位置,不需要重启就能加载文件,并且可以设置刷新时间 -->
     2     <bean id="messageSource"
     3         class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
     4         <!-- 默认编码方式 -->
     5         <property name="defaultEncoding" value="UTF-8" />
     6         <!-- 资源文件的前缀:多了一个classpath,如果资源文件在一个文件夹下,还要加上文件夹路径,否则报错 -->
     7         <property name="basename" value="classpath:message/msg" />
     8         <!-- 刷新时间 -->
     9         <property name="cacheSeconds" value="3600" />
    10     </bean>

    需要注意以下几点:

    • 无论何种方式配置何种消息源,bean的名称必须是messageSource;
    • ReloadableResourceBundleMessageSource可以热加载,所以需要配置刷新时间,并且配置资源文件的前缀时需要加classpath,如果资源文件在classpath的某个文件夹下,还需要加上文件夹的名称;

    三、配置拦截器

    通过请求参数去改变国际化的值时,可以使用Spring提供的拦截器LocaleChangeInterceptor,它继承了HandlerInterceptorAdapter,通过覆盖它的preHandle方法,然后使系统所配置的LocaleResolver实现国际化,这个一般是配置在Spring MVC的配置文件中:

    1 <!-- 配置国际化拦截器 -->
    2     <mvc:interceptors>
    3         <mvc:interceptor>
    4             <mvc:mapping path="/**" />
    5             <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    6                 <property name="paramName" value="language" />
    7             </bean>
    8         </mvc:interceptor>
    9     </mvc:interceptors>

    其中:

    • <mvc:mapping>的path属性值配置成/**,这样就能拦截所有/请求及其子路径中的请求了;
    • 拦截器的属性paramName的值就是url中传过来的参数,如language=zh_CN或language=en_US等;

    至此,国际化中所有的配置都已经介绍完毕,下一篇文章将举一个实现过程的例子。

  • 相关阅读:
    LeetCode OJ--Sort Colors
    LeetCode OJ--Single Number II **
    LeetCode OJ--Single Number
    LeetCode OJ--Subsets II
    LeetCode OJ--ZigZag Conversion
    3ds Max学习日记(三)
    3ds Max学习日记(二)
    3ds Max学习日记(一)
    PokeCats开发者日志(十三)
    PokeCats开发者日志(十二)
  • 原文地址:https://www.cnblogs.com/hellowhy/p/9751987.html
Copyright © 2020-2023  润新知