使用Spring MVC 实现 国际化
使用Spring MVC 实现 国际化
    博客分类: Spring 
 
1、 版本 Spring 3.1
 
2、 配置 LocaleResolver
 
 
LocaleResolver 是指用什么策略来检测请求是哪一种Local, Spring 提供以下几种策略:
 
2.1、AcceptHeaderLocaleResolver
根据浏览器Http Header中的accept-language域判定(accept-language域中一般包含了当前操作系统的语言设定,可通过HttpServletRequest.getLocale方法获得此域的内容)。 改变Local 是不支持的,即不能调用LocaleResolver接口的 setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale); 方法设置Local.
2.2、SessionLocaleResolver
    根据用户本次会话过程中的语言设定决定语言种类(如:用户登录时选择语言种类,则此次登录周期内统一使用此语言设定)。
2.3、CookieLocaleResolver
根据Cookie判定用户的语言设定(Cookie中保存着用户前一次的语言设定参数)。
 
2.4、FixedLocaleResolver 一直使用固定的Local, 改变Local 是不支持的 见(2.1)
 
如果需要使用哪一种策略,只需在DispatcherServlet 指定的Spring配置文件中配置就行, 例如需要使用CookieLocalResolver , 在配置文件如下配置:
 
< bean id = "localeResolver" class = "org.springframework.web.servlet.i18n.CookieLocaleResolver" ></ bean >
 
DispatchServlet 将在初始化的时候, 会调用initLocaleResolver(context) 方法去配置文件中找名字为“localeResolver" bean. 如果有就用配置文件配置的localResolver. 如果没有配置将用默认的localResolver " AcceptHeaderLocaleResolver".
 
3、使用Spring MVC时,  controller如何得到请求的 Local
 
DispatchServlet 会在 processRequest(HttpServletRequest request, HttpServletResponse response) 方法中设置LocaleContext, 把LocalContext 和当前线程关联起来. 代码如下:
 
LocaleContextHolder.setLocaleContext (buildLocaleContext(request), this. threadContextInheritable );
 
DispatchServlet 中buildLocalContext代码如下:
 
 
protected LocaleContext buildLocaleContext( final HttpServletRequest request) {
        return new LocaleContext() {
            public Locale getLocale() {
                return localeResolver .resolveLocale(request);
            }
            @Override
            public String toString() {
                return getLocale().toString();
            }
        };
}
 
这里的Local通过localResolver 解析得到,  localResolver 即是从Spring 配置文件配置的localResolver, 默认是"AcceptHeaderLocaleResolver".
 
如果你想要在 controller 中得到当前请求的Local,  代码可以如下写:
 Locale locale = LocaleContextHolder.getLocale();
 
或者你可以用Spring 中的RequestContextUtils 类方法getLocal得到 request 中保存的localResolver, 并用localResolver 解析得到Local.   代码如下:
 
 
public static Locale getLocale (HttpServletRequest request) {
        LocaleResolver localeResolver = getLocaleResolver (request);
        if (localeResolver != null ) {
            return localeResolver.resolveLocale(request);
        }
        else {
            return request.getLocale();
        }
}
 
localResolver 会在DispatcherServlet的doService 方法中,将localResolver保存到request 属性中 代码如下:
 
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
 
 
4、LocaleChangeInterceptor 的使用:
 
如果想要用户能改变Local, 我们需要配置 LocaleChangeInterceptor, 这个拦截器将检查传入的请求,如果请求中有“local" 的参数(参数可以配置),如http://localhost:8080/test?local=zh_CN. 该Interceptor将使用localResolver改变当前用户的
Local, 代码如下:
 
 
String newLocale = request.getParameter( this . paramName );
if (newLocale != null ) {
  LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver (request);
  if (localeResolver == null ) {
      throw new IllegalStateException( "No LocaleResolver found: not in a ..." );
  }
    //改变当前的Local
  localeResolver.setLocale (request, response, StringUtils.parseLocaleString (newLocale));
}
 
要使得LocaleChangeInterceptor 有效果,在Spring 的配置文件加入即可:
 
 
< mvc:interceptors >
     < bean class = "org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/ >
</ mvc:interceptors >
使用Spring MVC 实现 国际化的更多相关文章
- Java Web 学习(7) —— Spring MVC 之国际化
		
Spring MVC 之国际化 i18n 与 l10n internationalization:国际化,以 i 开头,以 n 结尾,中间 18 个字母,简称 i18n. localization:本 ...
 - Spring MVC 的国际化和本地化
		
国际化: i18n 本地化: l10n java.util.Locale 类表示一个语言区域.一个 Locale 对象包含 3 个主要元件:language.country.variant java. ...
 - [Spring]Spring Mvc实现国际化/多语言
		
1.添加多语言文件*.properties F64_en_EN.properties详情如下: F60_G00_M100=Please select data. F60_G00_M101=Are yo ...
 - Spring mvc i18n国际化的简单demo
		
在渲染视图的xml文件中,配置一个i18nBean 实现两个接口: SessionLocaleResolver --> 加载资源主题 ReloadableResourceBundleMessag ...
 - Spring MVC国际化配置
		
Spring MVC国际化配置 前言 项目开发中要考虑支持国际化,框架选用的是Spring MVC框架,那么问题来了Spring MVC如何配置并实现国际化. 实现过程(Maven项目) 对于Spri ...
 - Spring MVC(十六)--Spring MVC国际化实例
		
上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...
 - spring mvc+myBatis配置详解
		
一.spring mvc Spring框架(框架即:编程注解+xml配置的方式)MVC是Spring框架的一大特征,Spring框架有三大特征(IOC(依赖注入),AOP(面向切面),MVC(建模M- ...
 - Spring MVC的优势
		
Spring 框架提供了构建Web应用程序的全功能MVC模块--Spring MVC. Spring MVC框架提供了一个DispatcherServlet作为前端控制器来分派请求,同时提供灵活的配置 ...
 - Spring MVC(3)Spring MVC 高级应用
		
一.Spring MVC 的数据转换和格式化 前面的应用,都只是用HandlerAdapter去执行处理器. 处理器和控制器不是一个概念,处理器是在控制器功能的基础上加上了一层包装,有了这层包装,在H ...
 
随机推荐
- 从零开始学Python第0周:Python基本介绍(部分内容来源于网络)
			
Python入门介绍 一,Python的基本介绍 (1)概要 Python是一种解释型,面向对象,动态数据类型的高级程序设计语言.常被广泛用于处理系统管理任务和web编程.现如今Python已经成为了 ...
 - 应用服务器和Web服务器
			
如上图所示,绝大部分的公司会采用Apache+tomcat集群(或jetty集群)来部署公司的Web服务, Web服务器和应用服务器关系,先介绍一下我们常说的服务器: Tomcat服务器,是运行ser ...
 - 【FOL】第一周
			
本来打算按计划做下去的,发现原来那个sprite虽然功能强大,但是对我想要做的东西来说,冗余似乎有些多,决定自己写一个. 之前做了一段时间的h5游戏,用的是panda.js,发现这个引擎封装的还不错, ...
 - Javascript——闭包、作用域链
			
1.闭包:是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见方式:在一个函数内部创建另一个函数. function f(name){ return function(object){ var ...
 - 树链剖分求LCA
			
树链剖分中各种数组的作用: siz[]数组,用来保存以x为根的子树节点个数 top[]数组,用来保存当前节点的所在链的顶端节点 son[]数组,用来保存重儿子 dep[]数组,用来保存当前节点的深度 ...
 - Typescript 中类的继承
			
Typescript中类的定义与继承与后端开发语言java/C#等非常像,实现起来非常方便,而且代码便于阅读. 用Typescript写较大项目时是非常有优势的. /** * BaseClass */ ...
 - jQuery Wookmark Load 瀑布流布局实例演示
			
瀑布流布局非常适合大量图片的展示,一改过去裁剪图片尺寸统一的排版,每张图片都能完全展示,并错落有致,让人眼前一亮. 版本: jQuery v1.4.3+ jQuery Wookmark Load v1 ...
 - 详细解读XMLHttpRequest(一)同步请求和异步请求
			
本文主要参考:MDN XMLHttpRequest 让发送一个HTTP请求变得非常容易.你只需要简单的创建一个请求对象实例,打开一个URL,然后发送这个请求.当传输完毕后,结果的HTTP状态以及返回的 ...
 - 避开unity的坑(转摘)
			
避开unity的坑(转摘) 以下总结一部分来自经验之谈,一部分来自其他人的分享.总的来讲,unity开发原型和效果.验证想法,确实是无比便利.可能一个月就把核心玩法做得差不多.强大的编辑器功能让我们也 ...
 - 由Vue引发的getter和setter思考
			
公司的新项目决定使用Vue.js来做,当我打印出Vue实例下的data对象里的属性时,发现了一个有趣的事情: 它的每个属性都有两个相对应的get和set方法,我觉的这是多此一举的,于是去网上查了查Vu ...