资讯专栏INFORMATION COLUMN

SpringMVC之源码分析--LocaleResolver(一)

HtmlCssJs / 426人阅读

摘要:概述为我们提供国际化支持,通过设置系统的环境,根据运行环境使用不同的语言显示。提供接口的作用是解析客户端使用的地区,目的是为了根据这些信息实现视图多语言即国际化。接口继承接口,增加时区支持。

概述

Spring MVC为我们提供国际化支持,通过设置系统的环境,根据运行环境使用不同的语言显示。
Spring提供LocaleResolver接口的作用是解析客户端使用的地区(Locale),目的是为了根据这些信息实现视图多语言即国际化。

LocaleContextResolver接口继承LocaleResolver接口,增加时区(TimeZone)支持。

解析器(默认AcceptHeaderLocaleResolver)

AcceptHeaderLocaleResolver解析器implements LocaleResolver接口,重写resolverLocale(HttpServletRequest request)方法,通过检查客户端发送请求中的Accept-Language头来确定客户端Locale(地区信息)。

此解析器不支持程序设置Locale,只能通过改变客户端Accept-Language头信息来改变设置,核心源码如下:

/**
 * 从当前的request中解析Locale
 */
@Override
public Locale resolveLocale(HttpServletRequest request) {
    // 获取默认设置,可在配置AcceptHeaderLocaleResolver Bean中设置defaultLocale属性
    Locale defaultLocale = getDefaultLocale();
    // 设置了默认值并且请求中没有Accept-Language头信息时,使用默认设置
    if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
        return defaultLocale;
    }
    // 从当前请求中获取Locale
    Locale requestLocale = request.getLocale();
    // 从配置中获取支持的Locale集合,可在AcceptHeaderLocaleResolver Bean中设置supportedLocales属性
    List supportedLocales = getSupportedLocales();
    // 未设置supportedLocales或者supportedLocales中包括请求Locale,则使用请求Locale
    if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
        return requestLocale;
    }
    // 找到设置的Locale集合中是否有请求的Locale
    Locale supportedLocale = findSupportedLocale(request, supportedLocales);
    if (supportedLocale != null) {
        return supportedLocale;
    }
    return (defaultLocale != null ? defaultLocale : requestLocale);
}

/**
 * 不支持程序设置Locale
 */
@Override
public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {
    throw new UnsupportedOperationException(
            "Cannot change HTTP accept header - use a different locale resolution strategy");
}
实战

项目结构

配置文件

在Spring MVC配置文件中配置资源加载以及AcceptHeaderLocaleResolver Bean,配置如下:



    
    
    
    
    



    

属性文件

在类路径下创建配置文件,本项目放置路径为:resources/i18n/messages_*.proerties,详见项目结构,配置文件中配置信息如下:

messages_en.properties

message.locale=en

messages_en _US.properties

message.locale=en_US

messages_zh _CN.properties

message.locale=zh_CN

控制器

编写Controller控制器,以便测试,代码如下:

@GetMapping(value = "/acceptHeaderLocaleResolver" , produces = "text/html;charset=UTF-8")
@ResponseBody
public String test(HttpServletRequest request) {
    String clientLocale = "";
    Enumeration enus =  request.getLocales();
    while (enus.hasMoreElements()){
        Locale locale = enus.nextElement();
        clientLocale += locale + ",";
    }
    RequestContext requestContext = new RequestContext(request);
    String value = requestContext.getMessage("message.locale");
    return "客户端支持的Locale有:"+clientLocale+" 
当前使用的Locale是:" + requestContext.getLocale() + "
使用的资源Locale文件是:" + value ; }

测试

以chrome为例,首先确认chrome的语言设置,如下:

有上图可见,测试的第一语言为中文(简体),我们在地址栏访问我们的Controller,返回信息如下:

由于客户端设置的为zh-CN,Spring MVC国际化使用的属性文件是messages_zh _CN.properties,我们通过修改客户端属性进行测试,调整chrome语言,即把英语设置到第一位,再次访问Controller,返回信息如下:

此时的系统使用语言已经切换为message_en.properties。

总结

各浏览器默认的语言各不相同,可通过设置进行修改调整;

客户端请求头Accept-Languages的第一个(权重最大)为Spring MVC使用的Locale;

权重最大的Locale名必须与属性文件一致,否则找不到,如Accept-Languages的第一个为en,则资源文件名必须设置为messages_en.properties,如果第一个是zh-CN,则资源名称为messages_zh _CN.properties;

使用messageSource Bean时,如果资源文件放在类路径下,basename的值必须以classpath:开头。

最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69326.html

相关文章

  • SpringMVC源码分析--LocaleResolver(三)

    摘要:概述我们继续分析学习,本节我们分析使用的是。与类似,运用用户会话实现功能。最后创建了群方便大家交流,可扫描加入,同时也可加我,共同学习共同进步,谢谢 概述 我们继续分析学习Spring MVC LocaleResolver,本节我们分析使用的是SessionLocaleResolver。SessionLocaleResolver与CookieLocaleResolver类似,运用用户会...

    VishKozus 评论0 收藏0
  • SpringMVC源码分析--LocaleResolver和ThemeResolver应用

    摘要:需求根据客户端环境,界面显示不同的国旗图案。选择的技术方案可利用提供的国际化和主题定制来解决。注意此时返回的中没有国际化及主题相关的信息。修改请求参数的值为荷兰,即后再发起请求,结果如下与预期一致,测试通过。 概述 以上分析了Spring MVC的LocaleResolver和ThemeResolver两个策略解析器,在实际项目中很少使用,尤其是ThemeResolver,花精力去分析...

    qpal 评论0 收藏0
  • SpringMVC源码分析--LocaleResolver(二)

    摘要:概述上一篇就默认的进行了分析,详细请参考,本节我们继续分析学习,主要分析解析器类继承关系如下图由上面类图可知,继承并实现接口,主要是操作的工具类,继承接口,增加了信息操作。即通过实现的选择。 概述 上一篇就Spring MVC默认的LocaleResovler(AcceptHeaderLocaleResolver)进行了分析,详细请参考https://segmentfault.com/...

    RichardXG 评论0 收藏0
  • SpringMVC源码分析--ThemeResolver(

    摘要:此解析器不能动态设置主题。实战目标练习使用解析器,最终效果如下项目结构在下创建了主题文件夹及主题文件,下创建了静态资源文件。是默认的解析器,再此配置是为了自定义属性值,即属性文件名称。其实此解析器与的实现原理基本相同。 概述 主题就是系统的整体样式或风格,可通过Spring MVC框架提供的主题(theme)设置应用的整体样式风格,提高用户体验。Spring MVC的主题就是一些静态资...

    Ocean 评论0 收藏0
  • SpringMVC源码分析--ThemeResolver(三)

    摘要:类继承关系如下该类实现接口,实现解析设置主题功能继承类,以具备操作功能。新增并更换一张不同的图片。配置文件只要替换即可,代码如下配置默认的主题文件视图和控制器视图和控制器代码与上一章一致,参考上章代码。 概述 上节介绍了SessionThemeResolver解析器,本章分析下CookieThemeResolver,两个解析器实现的功能是一样的,只是使用的主题载体有区别而已,Sessi...

    OldPanda 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<