博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC之源码分析--LocaleResolver(三)
阅读量:6172 次
发布时间:2019-06-21

本文共 3441 字,大约阅读时间需要 11 分钟。

概述

我们继续分析学习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等信息方法@Overridepublic 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@Overridepublic 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);}

实战

  • 项目结构

参考中的项目结构,本章与其一致。

  • 配置文件

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

  • 属性文件

参考中的项目结构,本章与其一致。

  • 控制器

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

@GetMapping(value = "/getSessionLocale", produces = "text/html;charset=UTF-8")@ResponseBodypublic 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";}
  • 测试

浏览器发起请求,结果如下图:

变更参数locale的值,请求,结果如下图:

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

总结

  • 使用SessionLocaleResolver与LocaleChangeInterceptor结合使用来设置国际化
  • 大致流程为:根据请求的语言参数,在过滤器中设置Locale,Spring就可以根据设置区不同的属性文件来实现国际化
  • 本系列主要分析了Spring MVC国际化的原理,有写的不到位的地方还望好好包涵,有不书面不清晰的地方可留言,真心地希望跟大家一起交流探讨。

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

转载地址:http://ahtba.baihongyu.com/

你可能感兴趣的文章
Win10大丰收的节奏 微软收编iOS全部150万应用
查看>>
智慧城市要除“城市病” 中兴通讯开辟新增长极
查看>>
Opera已确认解散iOS开发团队
查看>>
DevOps:新的业务浪潮
查看>>
CERT:启用EMET的Windows 7比Windows 10更加安全
查看>>
LINE上市:一场迟到、勇敢又无奈的IPO
查看>>
OA选型:OA系统工作流是核心
查看>>
如何发现“利用DNS放大攻击”的服务器
查看>>
《Arduino开发实战指南:LabVIEW卷》——第2章 Arduino软件
查看>>
京津冀大数据走廊起笔谋篇
查看>>
WIFI连网一“吻”通 黑科技让无线路由器更智能
查看>>
Ovum光器件首席分析师:硅光子不是唯一解决方案
查看>>
大数据发展进入快车道 未来会呈现高速增长
查看>>
JVM基础:JVM内存组成及分配
查看>>
数据库锁和数据库隔离级别
查看>>
Linux下的内核测试工具——perf使用简介
查看>>
《从问题到程序:用Python学编程和计算》——2.3 内置函数和数学函数包
查看>>
《Photoshop修饰与合成专业技法》目录—导读
查看>>
《Metasploit渗透测试手册》—第1章1.10节分析数据库中存储的渗透测试结果
查看>>
《Adobe Acrobat XI经典教程》—第2课减小文件大小
查看>>