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的时候,最开始的时候在配置文 ...
随机推荐
- 使用sqlyog工具同步两个相同结构的数据库之间的数据
compare two database data 因为工作上遇到 同一个项目被部署到不同服务器上,原项目(后统称"源")在运行中,后部署的项目(后统称"目标" ...
- leetcode-第11场双周赛-5088-等差数列中缺失的数字
题目描述: 自己的提交: class Solution: def missingNumber(self, arr: List[int]) -> int: if len(arr) == 2: re ...
- bzoj1002题解
[题意分析] 给你一张特殊的,被称为“轮状基”的无向图,求其生成树个数. [解题思路] 引理: 基尔霍夫矩阵: 基尔霍夫矩阵=度数矩阵-邻接矩阵(邻接矩阵权=两点连边数) Matrix-Tree定理: ...
- NX二次开发-UFUN将目录与文件名组合在一起uc4575
NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_cfi.h> UF_initialize() ...
- 2018-2019-2-20175323 java实验四 Android程序设计
(一)安装及配置Andriod Studio,执行HelloWorld 我选择的安装网址下载了3.2.0版本的Andriod Studio 此处应该选择cancel 报错 点击所给链接,安装相应SDK ...
- 转-pycharm建立项目
转自:https://blog.csdn.net/m0_37544464/article/details/79171913 本文针对环境已经配置好的Pycharm建立新项目 1.第一步 2.第二步 在 ...
- 使用Docker创建数据容器
使用Docker创建数据容器 翻译自: Data-only container madness 1.什么是数据容器? 数据容器就是本身只创建一个volume供其他容器共享,创建完后即退出,不执行任何任 ...
- 8张图带你轻松温习Java知识
年初四好,一图胜千言,下面图解均来自Program Creek 网站,目前它们拥有最多的票选. 如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟. 1 字符串不变性 下面这张图展示了这段代码做了 ...
- C#& Screen 类&(&多&屏&幕&开&发)
原文:C#& Screen 类&(&多&屏&幕&开&发) Screen 类 下面的代码示例演示如何使用 Screen 类的各种方法和属性. 该示 ...
- FlyMcu下载时的问题
引用:http://www.openedv.com/forum.php?mod=viewthread&tid=69398&page=1#pid396135 和楼下李智鹏用普中科技的ST ...