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
/**
* 配置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国际化配置项的更多相关文章
- Spring MVC(十四)--SpringMVC验证表单
在Spring MVC中提供了验证器可以进行服务端校验,所有的验证都必须先注册校验器,不过校验器也是Spring MVC自动加载的,在使用Spring MVC校验器之前首先要下载相关的jar包,下面是 ...
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例
Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...
- Spring MVC(十六)--Spring MVC国际化实例
上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...
- 面渣逆袭:Spring三十五问,四万字+五十图详解
大家好,我是老三啊,面渣逆袭 继续,这节我们来搞定另一个面试必问知识点--Spring. 有人说,"Java程序员都是Spring程序员",老三不太赞成这个观点,但是这也可以看出S ...
- JSR教程2——Spring MVC数据校验与国际化
SpringMVC数据校验采用JSR-303校验. • Spring4.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架. • Spring在进行数据绑定时,可同时调用校验框架完成数据 ...
- spring MVC(十)---spring MVC整合mybatis
spring mvc可以通过整合hibernate来实现与数据库的数据交互,也可以通过mybatis来实现,这篇文章是总结一下怎么在springmvc中整合mybatis. 首先mybatis需要用到 ...
- Spring MVC基础知识整理➣国际化和异常处理
概述 Spring框架为WEB项目提供了国际化以及异常处理机制.所谓的国际化也就是不同国籍,显示不同国籍的语言与符号.异常处理,也就是能够捕获WEB项目下的所有异常信息,并能处理记录这些异常信息机制. ...
- spring mvc 返回乱码SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题
原文地址:https://www.cnblogs.com/fzj16888/p/5923232.html 先说一下我的经历,以及解决问题的而过程. 在使用SpringMVC的时候,最开始的时候在配置文 ...
随机推荐
- apache httpd.conf alias
参考 Apache alias目录配置 我的环境是 Ubuntu apache2,配置文件目录在 /etc/apache2/sites-available/000-default.conf 在这个配置 ...
- 小程序学习三 一切的开始app() 小程序的注册
现在打开 app.js //app.js App({ onLaunch(options) { //小程序初始化 // console.log("小程序初始化", options) ...
- Bribing FIPA
Bribing FIPA 给出多棵有n个节点的有根树,第i个节点有一个权值\(a_i\),定义一个点能控制的点为其所有的子节点和它自己,询问选出若干个点的最少的权值之和,并且能够控制大于等于m个点,\ ...
- C#中反射的基础基础基础
class Program { static void Main(string[] args) { Type t = typeof(Student);//typeof(类) 取类的类型 并且存储在Ty ...
- Java 基础 - JDK 和 JRE 有什么区别
总结 JRE(Java Runtime Environment),就是 Java 运行环境,包括JVM虚拟机(java.exe等)和基本的类库(rt.jar等). JDK (Java Developm ...
- Windows API DOC
{ /* https://docs.microsoft.com/zh-cn/?view=sql-server-ver15 */ }
- kafka拦截器原理|案例实操
拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于producer而言,interceptor使得用 ...
- CocoaPods更新2018年11月06日16:06:48
https://gems.ruby-china.org点进去就知道了…… CocoaPods命令 更新 sudo gem install -n /usr/local/bin cocoapods --p ...
- 史上最全Html和CSS布局技巧
单列布局水平居中 水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元 ...
- Dubbo 3.0 预览版解读,6到飞起~
, false).start(); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new St ...