`

Spring MVC之LocaleResolver(解析用户区域)

    博客分类:
  • java
阅读更多

为了让web应用程序支持国际化,必须识别每个用户的首选区域,并根据这个区域显示内容。

在Spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须实现LocaleResolver接口。Spring MVC提供了几个LocaleResolver实现,让你可以按照不同的条件来解析区域。除此之外,你还可以实现这个接口,创建自己的区域解析器。

要定义一个区域解析器,只需在web应用程序上下文中注册一个LocaleResolver类型的Bean就可以了。你必须将区域解析器的Bean名称设置为localeResolver,这样DispatcherServlet才能自动侦测到它。请注意,每DispatcherServlet只能注册一个区域解析器。

 

 

1.按HTTP请求头部解析区域

Spring采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。

 

 

2.按会话属性解析区域

解析区域的另一种方法是通过SessionLocaleResolver。它通过检验用户会话中预置的属性来解析区域。如果该会话属性

不存在,它会根据accept-language HTTP头部确定默认区域。

 

Xml代码  收藏代码
  1. <bean id="localeResolver" class="org.springframewrok.web.servlet  
  2.     .i18n.SessionLocaleResolver">  
  3.     <property name="defaultLocale" value="en"/>  
  4. </bean>  

如果会话属性不存在,可以为这个解析器设置defaultLocale属性。请注意,通过修改保存该区域的会话属性,这个区域

解析器可以改变用户的区域设置。

 

 

3.按Cookie解析区域

你也可以检验用户浏览器中的Cookie,用CookieLocaleResolver来解析区域。如果Cookie不存在,它会根据accept-language HTTP头部确定默认区域。 

 

Xml代码  收藏代码
  1. <bean id="localeResolver" class="org.springframework.web.servlet  
  2.     .i18n.CookieLocaleResolver"/>  

这个区域解析器所采用的Cookie可以通过cookieName和cookieMaxAge属性进行定制。cookieMaxAge属性表示这个Cookie应该持续多少秒,-1表示这个Cookie在浏览器关闭之后就失效。 

 

Xml代码  收藏代码
  1. <bean id="localeResolver" class="org.springframework.web.servlet  
  2.     .i18n.CookieLocaleResolver">  
  3.     <property name="cookieName" value="language"/>  
  4.     <property name="cookieMaxAge" value="3600"/>  
  5.     <property name="defaultLocale" value="en"/>  
  6. </bean>     

如果用户浏览器中不存在该Cookie,你也可以为这个解析器设置defaultLocale属性。通过修改保存该区域的Cookie,这个区域解析器能够改变用户的区域。

 

 

4.FixedLocaleResolver 

 一直使用固定的Local, 改变Local 是不支持的 。

 

5.修改用户的区域

除了显式调用LocaleResolver.setLocale()来修改用户的区域之外,还可以将LocaleChangeInterceptor拦截器应用到处理程序映射中,它会发现当前HTTP请求中出现的特殊参数。其中的参数名称可以通过拦截器的paramName属性进行自定义。如果这种参数出现在当前请求中,拦截器就会根据参数值来改变用户的区域。

 

Xml代码  收藏代码
  1. <beans...>  
  2.     ...  
  3.     <bean id="localeChangeInterceptor"  
  4.         class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">  
  5.         <property name="paramName" value="language"/>  
  6.     </bean>  
  7.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  8.         <property name="interceptors">  
  9.             <list>  
  10.                 ...  
  11.                 <ref bean="localeChangeInterceptor"/>  
  12.             </list>  
  13.         </property>  
  14.     </bean>  
  15.     <bean class="org.springframework.web.servlet.mvc.support  
  16.         .ControllerClassNameHandlerMapping">  
  17.         <property name="interceptors">  
  18.             <list>  
  19.                 ...  
  20.                 <ref bean="localeChangeInterceptor"/>  
  21.             </list>  
  22.         </property>  
  23.     </bean>  
  24. <beans>  

LocaleChangeInterceptor只能为启用了它的那些处理程序映射侦测参数。因此,如果web应用程序上下文中配置了不止一个处理程序映射,就必须在所有处理程序映射中注册这个拦截器,以便能在任意URL中改变它们的区域设置。

现在,利用language参数,可以通过任意URL修改用户的区域。例如,下面两个URL分别将用户的区域语言改成了美式

英语和德语。 

 

Java代码  收藏代码
  1. http://localhost:8080/court/welcome.htm?language=en_US  
  2. http://localhost:8080/court/welcome.htm?language=de  
 
6.使用Spring MVC时,  controller如何得到请求的 Local

DispatchServlet 会在 processRequest(HttpServletRequest request, HttpServletResponse response) 方法中设置LocaleContext, 把LocalContext 和当前线程关联起来. 代码如下:

 

[java] view plain copy
 
  1. LocaleContextHolder.setLocaleContext (buildLocaleContext(request), this. threadContextInheritable );  

 

DispatchServlet 中buildLocalContext代码如下:

 

[java] view plain copy
 
  1. protected LocaleContext buildLocaleContext( final HttpServletRequest request) {  
  2.         return new LocaleContext() {  
  3.             public Locale getLocale() {  
  4.                 return localeResolver .resolveLocale(request);  
  5.             }  
  6.             @Override  
  7.             public String toString() {  
  8.                 return getLocale().toString();  
  9.             }  
  10.         };  
  11. }  

 

 

这里的Local通过localResolver 解析得到,  localResolver 即是从Spring 配置文件配置的localResolver, 默认是"AcceptHeaderLocaleResolver".

 

如果你想要在 controller 中得到当前请求的Local,  代码可以如下写:

 

[java] view plain copy
 
  1. Locale locale = LocaleContextHolder.getLocale();  

 

或者你可以用Spring 中的RequestContextUtils 类方法getLocal得到 request 中保存的localResolver, 并用localResolver 解析得到Local.   代码如下:

 

[java] view plain copy
 
  1. public static Locale getLocale (HttpServletRequest request) {  
  2.         LocaleResolver localeResolver = getLocaleResolver (request);  
  3.         if (localeResolver != null ) {  
  4.             return localeResolver.resolveLocale(request);  
  5.         }  
  6.         else {  
  7.             return request.getLocale();  
  8.         }  
  9. }  

 

localResolver 会在DispatcherServlet的doService 方法中,将localResolver保存到request 属性中 代码如下:

 

[java] view plain copy
 
  1. request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);  

 

分享到:
评论

相关推荐

    精通Spring MVC 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    一种基于Spring MVC技术优化Vuejs用户界面的方法.docx

    一种基于Spring MVC技术优化Vuejs用户界面的方法.docx一种基于Spring MVC技术优化Vuejs用户界面的方法.docx一种基于Spring MVC技术优化Vuejs用户界面的方法.docx一种基于Spring MVC技术优化Vuejs用户界面的方法.docx...

    spring mvc 官方文档

    本文详细介绍spring MVC的原理和开发心得体会。

    精通Spring MVC 4 中文

    精通Spring MVC 4 中文

    Spring MVC 基于注解实例

    Spring MVC 基于注解实例Spring MVC 基于注解实例Spring MVC 基于注解实例Spring MVC 基于注解实例Spring MVC 基于注解实例Spring MVC 基于注解实例Spring MVC 基于注解实例Spring MVC 基于注解实例Spring MVC 基于...

    Spring MVC+MyBatis开发从入门到项目实战

    第3篇是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和拦截...

    [免费]Spring MVC学习指南(高清)

    Spring MVC是Spring框架中用于Web应用快速开发的一个模块,其中的MVC是Model-View-Controller的缩写。作为当今业界最主流的Web开发框架,Spring MVC已经成为当前最热门的开发技能,同时也广泛用于桌面开发领域。 ...

    深入解析Spring+MVC与Web+Flow.pdf

    《深入解析Spring MVCgn Web Flow》来自Spring开发团队的权威之作前所未有地深入剖析Spring MVC技术内幕大量专家经验和技巧,全面提升你的Web开发境界 Spring MVC和Spring Web Flow是Spring平台上两个极为灵活而且...

    _第一课:spring mvc 原理深度解析1

    _第一课:spring mvc 原理深度解析1

    Spring MVC所需jar包

    Spring MVC所需jar包,包含java开发中 Spring MVC架构中最常用的jar包

    Spring MVC Cookbook.pdf英文版

    本书由浅入深地介绍了当今流行的Java Web框架Spring MVC的方方面面,从基础的环境搭建到微服务设计与架构,再到持久化、REST API构建、认证与测试……涵盖了Spring MVC诸多重要且常用的特性。值得一提的是,本书针对...

    Spring MVC jar包

    关于构建Sping MVC的Jar包,包括Sping2.5.6和Hibernate3.6.8

    Spring MVC 入门实例

    首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...

    spring mvc源代码

    spring mvc4.1.4 源代码 spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码

    大优惠 Spring MVC学习指南(第2版)2017.pdf

    Spring MVC是Spring框架中用于Web应用快速开发的一个模块,其中的MVC是Model-View-Controller的缩写。作为当今业界最主流的Web开发框架,Spring MVC已经成为当前最热门的开发技能,同时也广泛用于桌面开发领域。 ...

    Spring MVC 4.2.3

    Spring mvc jar包

    spring MVC数据绑定大全

    spring MVC数据绑定 含例子 转载自疯芒毕露的专栏 刚开始用spring mvc 做web开发时 经常会不知道如何合适绑定页面数据 用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便 本人最开始也是这么认为 经过一段...

    Servlet JSP和Spring MVC初学指南

    Servlet JSP和Spring MVC初学指南

Global site tag (gtag.js) - Google Analytics