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

 /**
* 配置CookieLocaleResolver
* bean名称必须是localeResolver
*
* @return
*/
@Bean(name = "localeResolver")
public CookieLocaleResolver initCookieLocaleResolver() {
CookieLocaleResolver clr = new CookieLocaleResolver();
// 设置cookie名称
clr.setCookieDomain("lang");
// 设置超时秒数
clr.setCookieMaxAge(3600);
// 默认使用简体中文
clr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return clr;
}

2⃣️配置SessionLocaleResolver

 /**
* 配置SessionLocaleResolver
* bean名称必须是localeResolver
*
* @return
*/
@Bean(name = "localeResolver")
public SessionLocaleResolver initSessionLocaleResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
// 默认使用简体中文
slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return slr;
}

2、XML配置方式

1⃣️配置CookieLocaleResolver

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

2⃣️配置SessionLocaleResolver

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

注意⚠️:

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

二、国际化文件加载

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

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

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

1、JAVA方式配置消息源

1⃣️配置ResourceBundleMessageSource

 /**
* 配置ResourceBundleMessageSource消息源
* bean名称必须为messageSource
*
* @return
*/
@Bean(name = "messageSource")
public MessageSource initResourceBundleMessageSource() {
ResourceBundleMessageSource rbms = new ResourceBundleMessageSource();
rbms.setDefaultEncoding("UTF-8");
rbms.setBasename("msg");
return rbms;
}

2⃣️配置ReloadableResourceBundleMessageSource

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

2、XML方式配置消息源

1⃣️配置ResourceBundleMessageSource

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

2⃣️配置ReloadableResourceBundleMessageSource

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

需要注意以下几点:

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

三、配置拦截器

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

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

其中:

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

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


Spring MVC(十五)--SpringMVC国际化配置项的更多相关文章

  1. Spring MVC(十四)--SpringMVC验证表单

    在Spring MVC中提供了验证器可以进行服务端校验,所有的验证都必须先注册校验器,不过校验器也是Spring MVC自动加载的,在使用Spring MVC校验器之前首先要下载相关的jar包,下面是 ...

  2. Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

    Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...

  4. Spring MVC(十六)--Spring MVC国际化实例

    上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...

  5. 面渣逆袭:Spring三十五问,四万字+五十图详解

    大家好,我是老三啊,面渣逆袭 继续,这节我们来搞定另一个面试必问知识点--Spring. 有人说,"Java程序员都是Spring程序员",老三不太赞成这个观点,但是这也可以看出S ...

  6. JSR教程2——Spring MVC数据校验与国际化

    SpringMVC数据校验采用JSR-303校验. • Spring4.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架. • Spring在进行数据绑定时,可同时调用校验框架完成数据 ...

  7. spring MVC(十)---spring MVC整合mybatis

    spring mvc可以通过整合hibernate来实现与数据库的数据交互,也可以通过mybatis来实现,这篇文章是总结一下怎么在springmvc中整合mybatis. 首先mybatis需要用到 ...

  8. Spring MVC基础知识整理➣国际化和异常处理

    概述 Spring框架为WEB项目提供了国际化以及异常处理机制.所谓的国际化也就是不同国籍,显示不同国籍的语言与符号.异常处理,也就是能够捕获WEB项目下的所有异常信息,并能处理记录这些异常信息机制. ...

  9. spring mvc 返回乱码SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题

    原文地址:https://www.cnblogs.com/fzj16888/p/5923232.html 先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文 ...

随机推荐

  1. [JZOJ6355] 【NOIP2019模拟】普 24/100

    题目 题目大意 给你一个序列,对于所有\(k\in [1,n]\),求长度为\(k\)的子序列的最大权值,权值为\(a_1-a_2+a_3-...\pm a_k\) 思考历程 这题显然可以背包对吧-- ...

  2. php给每个数组元素加上前缀

    比如原数组是 array('1','2','3','4'); 我需要得到的结果 array('aaa1','aaa2','aaa3','aaa4'); 用内置函数如何实现? array_walk() ...

  3. 一次Spring Transactional嵌套事务使用不同的rollbackFor的分析

    起因: 项目期间由于一次异常回滚问题,发现自己在事务知识方面知识的遗漏,趁着这次机会,做了几次rollbackFor的测试. 测试:   现在有两个事务,事务oute包含事务Inner.事务A回滚规则 ...

  4. NX二次开发-UFUN发射线函数UF_MODL_trace_a_ray的用法

    今天是国庆节,放假休息懒得动,没有出去玩,在家研究一下发射线函数UF_MODL_trace_a_ray.小弟以前在软件公司混的时候,当时我做的那个项目就用到了UF_MODL_trace_a_ray,当 ...

  5. NX二次开发-NXOpen方式遍历所有体workPart->Bodies();

    NX11+VS2013 #include <NXOpen/DisplayManager.hxx> #include <NXOpen/Body.hxx> #include < ...

  6. FZU - 2295 Human life:网络流-最大权闭合子图-二进制优化-第九届福建省大学生程序设计竞赛

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 http://acm.fzu.edu.cn/problem.php?pid=2295 htt ...

  7. Python中的动态类

    Python中的动态类 有这样一个需求,我有SegmentReader.PostagReader.ConllReader这三个Reader,他们都继承于一个Reader类.在程序运行中,由用户通过se ...

  8. topjui.core.js

    var defaultConfig = { pageLoadComplete: false, config: { ctx: "", mainPage: false, pkName: ...

  9. 高手总结CSS书写技巧

    这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果.这个针对不同的浏览器写不同的CSS code的过程,就叫CSS hack ...

  10. QT5+Pylon

    VS+QT+Pylon:配置一下包含文件和libs,具体参考pylon说明文档. Windows下  Qtcreator+Pylon:建议把include和libs文件夹拷贝至工作目录,然后修改.pr ...