`

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 Locale 的使用 中文 英文 等语言 切换

    `LocaleResolver`是Spring MVC用来解析和设置`Locale`的接口。最常用的实现是`CookieLocaleResolver`和`SessionLocaleResolver`。`CookieLocaleResolver`将用户的选择保存在cookie中,而`SessionLocaleResolver`则...

    Spring MVC 4.2.3

    10. **国际化和本地化**:通过消息源和LocaleResolver,Spring MVC可以轻松实现应用的多语言支持。 在实际开发中,我们可以通过Maven或Gradle等构建工具将Spring MVC 4.2.3依赖引入项目。同时,使用IDE如IntelliJ ...

    spring mvc 4.0

    10. **国际化支持**:通过消息源(MessageSource)和LocaleResolver,Spring MVC提供了强大的国际化支持,能够根据用户语言环境展示不同的内容。 11. **错误处理**:通过@ControllerAdvice和@ExceptionHandler,...

    Spring MVC 项目+ 源码解析

    6. **国际化与主题**:Spring MVC提供对多语言支持,可以通过LocaleResolver和ThemeResolver来实现。这允许你根据用户的选择展示不同语言或主题的界面。 7. **异常处理**:你可以自定义异常处理器,通过@...

    spring MVC_快速入门

    Spring MVC通过分离关注点,将业务逻辑、数据处理和用户界面解耦。Controller接收HTTP请求,调用Service层处理业务,Service层与DAO层交互操作数据,最后Controller将处理结果传递给View进行渲染展示。 2. **配置...

    Spring MVC Cookbook(PACKT,2016).pdf

    《Spring MVC Cookbook》是由PACKT Publishing在2016年出版的一本专著,主要针对Spring MVC框架提供了实用的解决方案和技巧。Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-...

    spring-mvc-官方中文文档

    1. **Spring MVC 概述**:Spring MVC 是基于 Spring 框架构建的,它遵循 MVC 设计模式,将业务逻辑、数据和用户界面分离,提高代码的可重用性和可测试性。Spring MVC 通过 DispatcherServlet 进行请求分发,并使用 ...

    spring MVC基础学习

    在Spring MVC中,开发者可以利用模型-视图-控制器(MVC)架构模式来分离业务逻辑、数据处理和用户界面。下面我们将深入探讨Spring MVC的基础知识。 1. **核心组件**: - DispatcherServlet:作为Spring MVC的前端...

    Spring MVC 4.2.4.RELEASE 中文文档

    Accept 请求头解析器和多种 LocaleResolver 实现允许根据用户的偏好来显示相应的语言和地区信息。 关于主题的概览、定义主题和主题解析器部分则是讨论了如何在 Spring MVC 中定义和使用主题来动态更改应用的外观。...

    spring MVC要注意的地方

    Spring MVC 是一个强大的Java web应用程序开发框架,它简化了基于模型-视图-控制器(MVC)架构的应用程序构建过程。在使用Spring MVC时,有若干关键点需要注意,以确保高效、稳定和易于维护的代码。 1. **配置**: ...

    Spring MVC 配套资料

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 MVC(Model-View-Controller)架构的 web 应用程序。本配套资料包含 SpringMvc 学习笔记与代码示例,是学习 ...

    Spring MVC 1 资源文件

    Spring MVC 提供了支持国际化和本地化的能力,可以通过 LocaleResolver 和 MessageSource 来实现。 7. **异常处理** 通过 @ExceptionHandler 或 ExceptionResolver,Spring MVC 允许自定义异常处理,提供友好的...

    spring mvc完整demo

    通过 `LocaleResolver` 和 `MessageSource`,我们可以轻松实现根据用户设置的语言环境显示不同的消息。 11. **RESTful 风格的 URL** 利用 `@RequestMapping` 和其变种,可以轻松创建符合 RESTful 风格的 URL,这...

    spring MVC框架技术

    8. **国际化与本地化**: Spring MVC支持多语言环境,可以通过消息资源文件和LocaleResolver实现。这使得应用可以根据用户的浏览器设置显示相应的语言。 9. **异常处理**: Spring MVC提供了全局异常处理机制,通过@...

    Spring Web MVC入门教程

    文件上传和下载功能是Web应用中常见的需求之一,Spring Web MVC通过MultipartResolver组件提供了对文件上传的支持。对于表单标签的支持,Spring Web MVC不仅简化了传统JSP标签的使用,还扩展了表单相关的处理能力。 ...

    Spring MVC中文翻译文档

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者将业务逻辑、数据展示和用户交互分离,提高代码的可维护性和可测试性。本文将深入...

    spring-mvc学习文档资料

    Spring MVC 提供了多种国际化机制,如 LocaleResolver、AcceptHeaderLocaleResolver 等。国际化机制可以根据客户端的语言和地区设置来显示正确的语言和日期格式。 本文档还涵盖了 Spring MVC 的高级定制、多文件...

    spring2.5 mvc 完整项目

    《Spring 2.5 MVC 完整项目:深入解析与实践》 在IT行业中,Spring框架作为Java领域的重要支柱,其MVC(Model-View-Controller)模块在Web应用程序开发中占据着举足轻重的地位。本文将针对“Spring 2.5 MVC 完整...

    Spring MVC 框架学习总结

    - Spring MVC 提供了对多语言的支持,通过 LocaleResolver 和 MessageSource 实现。 11. **Tiles & Layouts** - 可以集成第三方框架如 Tiles,实现页面布局和重用。 12. **RESTful 风格** - 使用@...

Global site tag (gtag.js) - Google Analytics