资讯专栏INFORMATION COLUMN

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

VishKozus / 831人阅读

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

概述

我们继续分析学习Spring MVC LocaleResolver,本节我们分析使用的是SessionLocaleResolver。
SessionLocaleResolver与CookieLocaleResolver类似,运用用户会话(session)实现LocaleResolver功能。

解析器(SessionLocaleResolver)

SessionLocaleResolver类继承关系如下图:

AbstractLocaleResolver抽象类,实现LocaleResolver,在该抽象类中定义默认的Locale属性

LocaleContextResolver接口,继承LocaleResolver,增加了TimeZone操作

AbstractLocaleContextResolver抽象类,继承AbstractLocaleResolver类并实现LocaleContextResolver接口,定义了默认的TimeZone属性

SessionLocaleResolver实现类,继承AbstractLocaleContextResolver类,即完成操作Locale和TImeZone的功能

SessionLocaleResolver类允许从用户请求会话中获取Locale和TimeZone,和CookieLocaleResolver对比,该策略在Servlet容器的HttpSession中存储客户端使用Locale等设置,这是设置对于每个会话(session)都是临时的,会话终止时信息丢失。
入口是resolveLocaleContext(final HttpServletRequest request)方法,即Spring MVC接收到客户端请求后,如果配置了SessionLocaleResolver,会调用此方法,源码如下:

// 解析Locale等信息方法
@Override
public LocaleContext resolveLocaleContext(final HttpServletRequest request) {
    // 返回Locale和TimeZone
    return new TimeZoneAwareLocaleContext() {
        @Override
        public Locale getLocale() {
            // 从请求的会话中返回Locale
            Locale locale = (Locale) WebUtils.getSessionAttribute(request, localeAttributeName);
            if (locale == null) {
                locale = determineDefaultLocale(request);
            }
            return locale;
        }
        @Override
        @Nullable
        public TimeZone getTimeZone() {
            // 从请求的会话中返回TimeZone
            TimeZone timeZone = (TimeZone) WebUtils.getSessionAttribute(request, timeZoneAttributeName);
            if (timeZone == null) {
                timeZone = determineDefaultTimeZone(request);
            }
            return timeZone;
        }
    };
}

// 设置Locale和TimeZone
@Override
public void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response,
        @Nullable LocaleContext localeContext) {

    Locale locale = null;
    TimeZone timeZone = null;
    if (localeContext != null) {
        locale = localeContext.getLocale();
        if (localeContext instanceof TimeZoneAwareLocaleContext) {
            timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();
        }
    }
    // 把Locale设置到session中
    WebUtils.setSessionAttribute(request, this.localeAttributeName, locale);
    // 把TimeZone设置到session中
    WebUtils.setSessionAttribute(request, this.timeZoneAttributeName, timeZone);
}
实战

项目结构

参考https://segmentfault.com/a/1190000014797899中的项目结构,本章与其一致。

配置文件

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



    
    
    
    
    


    
    
        
        
    



    
    
    
    

属性文件

参考https://segmentfault.com/a/1190000014797899中的项目结构,本章与其一致。

控制器

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

@GetMapping(value = "/getSessionLocale", produces = "text/html;charset=UTF-8")
@ResponseBody
public String sessionLocaleResolver(HttpServletRequest request) {
    RequestContext requestContext = new RequestContext(request);
    String value = requestContext.getMessage("message.locale");
    HttpSession session = request.getSession();
    return "Session中设置的Locale是:"+session.getAttribute("locale")+" 
当前使用的Locale是:" + requestContext.getLocale() + "
使用的资源Locale文件是:messages_" + value+".properties"; }

测试

浏览器发起请求http://localhost:8089/getSessionLocale?locale=en_US,结果如下图:

变更参数locale的值,请求http://localhost:8089/getSessionLocale?locale=zh_CN,结果如下图:

测试结果表明Locale设置成功,本例验证了SessionLocaleResolver的使用。

总结

使用SessionLocaleResolver与LocaleChangeInterceptor结合使用来设置国际化

大致流程为:根据请求的语言参数,在过滤器中设置Locale,Spring就可以根据设置区不同的属性文件来实现国际化

本系列主要分析了Spring MVC国际化的原理,有写的不到位的地方还望好好包涵,有不书面不清晰的地方可留言,真心地希望跟大家一起交流探讨。

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

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

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

相关文章

  • SpringMVC源码分析--LocaleResolver和ThemeResolver应用

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

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

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

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

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

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

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

    OldPanda 评论0 收藏0
  • SpringMVC源码分析--ThemeResolver(一)

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

    Ocean 评论0 收藏0

发表评论

0条评论

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