资讯专栏INFORMATION COLUMN

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

OldPanda / 1752人阅读

摘要:类继承关系如下该类实现接口,实现解析设置主题功能继承类,以具备操作功能。新增并更换一张不同的图片。配置文件只要替换即可,代码如下配置默认的主题文件视图和控制器视图和控制器代码与上一章一致,参考上章代码。

概述

上节介绍了SessionThemeResolver解析器,本章分析下CookieThemeResolver,两个解析器实现的功能是一样的,只是使用的主题载体有区别而已,SessionThemeResolver是从session中获取主题Theme,CookieThemeResolver是从客户端cookie中获取主题Theme。

CookieThemeResolver

CookieThemeResolver类继承关系如下:

该类实现ThemeResolver接口,实现解析、设置主题Theme功能;继承CookieGenerator类,以具备操作cookie功能。

核心代码如下:

// 设置Theme,在请求到达Controller之前,进行设置
@Override
public void setThemeName(
        HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable String themeName) {

    Assert.notNull(response, "HttpServletResponse is required for CookieThemeResolver");
    // 请求参数中传来的themeName值
    if (StringUtils.hasText(themeName)) {
        // 把请求参数指定的主题设置request Attribute并写cookie
        request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName);
        addCookie(response, themeName);
    }
    else {
        // 将默认的主题设置request Attribute并写cookie
        request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, getDefaultThemeName());
        removeCookie(response);
    }
}

// 解析请求的Theme
@Override
public String resolveThemeName(HttpServletRequest request) {
    // 从request中获取主题theme
    String themeName = (String) request.getAttribute(THEME_REQUEST_ATTRIBUTE_NAME);
    if (themeName != null) {
        return themeName;
    }

    // 从客户端cookie中获取指定名字的theme,在设置时指定了cookie名字
    String cookieName = getCookieName();
    if (cookieName != null) {
        Cookie cookie = WebUtils.getCookie(request, cookieName);
        if (cookie != null) {
            String value = cookie.getValue();
            if (StringUtils.hasText(value)) {
                themeName = value;
            }
        }
    }

    // 请求和cookie中都无时,使用默认theme
    if (themeName == null) {
        themeName = getDefaultThemeName();
    }
    request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName);
    return themeName;
}
实战

项目结构

与上一章项目结构一致,参考https://segmentfault.com/a/1190000014868501

主题配置文件

myTheme.properties与上一章内容一致,参考上章。

新增myTheme2.properties并更换一张不同的图片。

Spring配置文件

只要替换SessionThemeResolver即可,代码如下:


    
    

视图和控制器

jsp视图和Controller控制器代码与上一章一致,参考上章代码。

测试

启动服务,浏览器地址输入http://localhost:8089/theme,界面如下:

从结果可知,使用的默认配置的主题文件,并且无相关cookie信息。
接下来,我们通过请求参数设置主题,即访问http://localhost:8089/theme?theme=myTheme2,此时看到的结果如下:

从结果看出,已经替换了文件并且cookie也写回客户端了。

总结

经过三篇文章,分析学习了Spring MVC 的ThemeResolver实现及源码,希望能对大家有帮助,再此说明一下,ThemeResolver和LocaleResolver原理极其相似,两者可以类比学习,当然日常开发中这两种策略不常使用,我只是想系统的分析学习SpringMVC的知识点。

一个小小的问题,比如要实现,根据不同客户端,界面显示不同的国旗?提问题是希望能给大家互动,希望大家说说想法:)

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

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

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

相关文章

  • SpringMVC源码分析--ThemeResolver(一)

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

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

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

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

    摘要:类实现接口,使用用户会话中的主题。新增并更换一张不同的图片。通过关闭浏览器,然后再访问进行测试总结本章通过拦截器和结合实现了通过请求参数控制会话主题。 概述 本章继续分析ThemeResolver的另一个实现类SessionThemeResolver,需要了解Spring MVC Theme情况的,可参考上一篇文章https://segmentfault.com/a/119000001...

    antyiwei 评论0 收藏0
  • SpringMVC源码分析--请求过程

    摘要:概述根据规范,当用户请求到达应用时,由的方法进行处理,对于而言,处理用户请求的入口为,通过其父类的拦截处理。最后创建了群方便大家交流,可扫描加入,同时也可加我,共同学习共同进步,谢谢 概述 根据Servlet规范,当用户请求到达应用时,由Servlet的service()方法进行处理,对于Spring MVC而言,处理用户请求的入口为DispatcherServlet,通过其父类Fra...

    zxhaaa 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(

    摘要:概述本节学习下的功能,简单来说,该类的作用就是把多个视图解析器进行组装,内部使用存储配置使用的视图解析器。总结本章介绍了类,根据测试,了解到属性不影响中配置使用的视图解析器顺序。 概述 本节学习下ViewResolverComposite的功能,简单来说,该类的作用就是把多个ViewResolver视图解析器进行组装,内部使用list存储配置使用的视图解析器。 本系列文章是基于Spri...

    fox_soyoung 评论0 收藏0

发表评论

0条评论

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