为了让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头部确定默认区域。

  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头部确定默认区域。

  1. <bean id="localeResolver" class="org.springframework.web.servlet
  2. .i18n.CookieLocaleResolver"/>

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

  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属性进行自定义。如果这种参数出现在当前请求中,拦截器就会根据参数值来改变用户的区域。

  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分别将用户的区域语言改成了美式

英语和德语。

  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 和当前线程关联起来. 代码如下:

  1. LocaleContextHolder.setLocaleContext (buildLocaleContext(request), this. threadContextInheritable );

DispatchServlet 中buildLocalContext代码如下:

  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,  代码可以如下写:

  1. Locale locale = LocaleContextHolder.getLocale();

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

  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 属性中 代码如下:

  1. request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver)

Spring MVC之LocaleResolver(解析用户区域)的更多相关文章

  1. Spring MVC Controller中解析GET方式的中文参数会乱码的问题(tomcat如何解码)

    Spring MVC Controller中解析GET方式的中文参数会乱码的问题 问题描述 在工作上使用突然出现从get获取中文参数乱码(新装机器,tomcat重新下载和配置),查了半天终于找到解决办 ...

  2. Spring MVC之LocaleResolver详解

    2019独角兽企业重金招聘Python工程师标准>>> 对于LocaleResolver,其主要作用在于根据不同的用户区域展示不同的视图,而用户的区域也称为Locale,该信息是可以 ...

  3. Spring MVC之视图解析器

    Spring MVC提供的视图解析器使用ViewResolver进行视图解析,实现浏览器中渲染模型.ViewResolver能够解析JSP.Velocity模板.FreeMarker模板和XSLT等多 ...

  4. spring mvc 扩展 标签解析

    spring mvc 标签解析 InterceptorsBeanDefinitionParser http://www.cnblogs.com/fangjian0423/p/springMVC-int ...

  5. Spring MVC Xml视图解析器

    XmlViewResolver用于在xml文件中定义的视图bean来解析视图名称.以下示例演示如何在Spring Web MVC框架使用XmlViewResolver. XmlViewResolver ...

  6. Spring MVC的视图解析器

    一.视图解析器简介 在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进 ...

  7. Spring MVC 注解 @RequestParam解析

    在Spring MVC 后台控制层获取参数的方式主要有两种,一种是requset.getParameter(“name”),另一种是用注解@Resquest.Param直接获取. 一.基本使用获取提交 ...

  8. spring mvc源码解析

    1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...

  9. Spring MVC之视图解析器和URL-Pattern的配置方案

    上期讲解了第一入门案例之后接下来了解一下视图解析器与URL-Pattern的配置方案 先来说视图解析器,在上次博客文章中我们完成了入门案例,接下来我们就在上一个例子中完善一下体出视图解析器 <? ...

随机推荐

  1. 关于异常的疑难解答:System.Runtime.InteropServices.COMException

    COMException exception is thrown when an unrecognized HRESULT is returned from a COM method call.&qu ...

  2. 织梦DEDECMS小说模块使用和安装全攻略

    转之--http://www.51dedecms.com/news/dedecms/2012/0223/3380.html 小说模块功能很强大,可以用他做小说或者漫画站.他们都可以按某章节收费或免费供 ...

  3. asp.net 微信公众平台我也来搞一搞(看看和大家的有什么不一样)

    去年10月份左右接触的微信,今年又要在上面做新的改动(好烦人,为什么我这么懒),小菜用了2天的工作日,做了一个微信解析器,方便大家调用. 好处: 1.屌丝们不用再去做微信验证. 2.屌丝们不用去解析x ...

  4. Solr配置集群

    1.主机SolrConfig.xml <requestHandler name="/replication" class="solr.ReplicationHand ...

  5. hdu1102 Constructing Roads (简单最小生成树Prim算法)

    Problem Description There are N villages, which are numbered from 1 to N, and you should build some ...

  6. 【USACO 2.4.2】穿越栅栏

    [描述] 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找 ...

  7. recvmsg和sendmsg函数

    这两个函数是最通用的I/O函数.实际上我们把所有read.readv.recv和recvfrom调用替换成recvmsg调用.类似地,各种输出函数调用也可以替换成sendmsg调用 #include ...

  8. Activiti 工作流得到最后一次批注的时间

    我们有时候在工作流开发中可能会遇到这样的需求,就是已经审批结束的流程,可能我们还是仍然需要修改业务表的结果,而且我们需要一个时间期限,比如:在5天内可以进行修改 ,这个时候我们就需要得到我们最后一步审 ...

  9. 事后调试之MiniDump转储

    程序发布后,针对在用户使用过程中出现的一些问题进行调试,这个过程可以称为是事后调试.在程序Crash时转储MiniDump文件供软件开发工程师分析是一种比较常用的方法.下面介绍两种常用的在程序Cras ...

  10. C# FTP操作

    using System; using System.Collections.Generic; using System.Net; using System.IO; namespace FTP操作 { ...