概述

上节介绍了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并写cookierequest.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName);addCookie(response, themeName);}else {// 将默认的主题设置request Attribute并写cookierequest.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, getDefaultThemeName());removeCookie(response);}
}// 解析请求的Theme
@Override
public String resolveThemeName(HttpServletRequest request) {// 从request中获取主题themeString 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中都无时,使用默认themeif (themeName == null) {themeName = getDefaultThemeName();}request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName);return themeName;
}

实战

  • 项目结构

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

  • 主题配置文件

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

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

  • Spring配置文件

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

<bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver"><!-- 配置默认的主题文件 --><property name="defaultThemeName" value="myTheme"/>
</bean>
  • 视图和控制器

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

  • 测试

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

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

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

总结

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

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

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

SpringMVC之源码分析--ThemeResolver(三)相关推荐

  1. hadoop作业初始化过程详解(源码分析第三篇)

    (一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...

  2. Flume 1.7 源码分析(三)程序入口

    Flume 1.7 源码分析(一)源码编译 Flume 1.7 源码分析(二)整体架构 Flume 1.7 源码分析(三)程序入口 Flume 1.7 源码分析(四)从Source写数据到Channe ...

  3. Anbox源码分析(三)——Anbox渲染原理(源码分析)

    Anbox源码分析(三) 上一篇,我们介绍了Anbox视频渲染的原理,这一篇,我们从源码入手,更深入的理解Anbox与渲染的机制和原理 session manager入口 session manage ...

  4. bytebuddy实现原理分析 源码分析 (三)- advice 详解

    advice详解 八.advice 8.1 AsmVisitorWrapper 8.1.1 ForDeclareFields 8.1.1.1 Entry 8.1.1.2 DispatchingVisi ...

  5. ceph-deploy源码分析(三)——mon模块 转

    ceph-deploy源码分析(三)--mon模块 原文: http://www.hl10502.com/2017/06/19/ceph-deploy-mon/#more ceph-deploy的mo ...

  6. kubelet源码分析(三)之 startKubelet

    本文个人博客地址:https://www.huweihuang.com/kubernetes-notes/code-analysis/kubelet/startKubelet.html kubelet ...

  7. kube-controller-manager源码分析(三)之 Informer机制

    本文个人博客地址:https://www.huweihuang.com/kubernetes-notes/code-analysis/kube-controller-manager/sharedInd ...

  8. photoshop-v.1.0.1源码分析第三篇–FilterInterface.p

    photoshop-v.1.0.1源码分析第三篇–FilterInterface.p 总体预览 一.源码预览 二.语法解释 三.结构预览 四:语句分析 五:思维导图 六:疑留问题 一.源码预览 {Ph ...

  9. React Native 源码分析(三)——Native View创建流程

    1.React Native 源码分析(一)-- 启动流程 2.React Native 源码分析(二)-- 通信机制 3.React Native 源码分析(三)-- Native View创建流程 ...

最新文章

  1. oracle11g的安装
  2. jQuery EasyUI DataGrid 分页 FOR ASP.NET
  3. 深度强化学习_深度学习理论与应用第8课 | 深度强化学习
  4. linux 查看发行版 名称 版本号
  5. 温州大学《深度学习》课程课件(十一、序列模型)
  6. 如何在苹果官网下载旧版本的Xcode 方法
  7. c语言中{的作用,C语言中Static和Const关键字的作用
  8. Ubuntu12.04下apache服务器的安装也配置
  9. 安装虚拟机时勾选增强型键盘驱动程序有什么用?(在软件安装或者升级时候没勾选怎么办)
  10. 电子秤PCBA方案的功能及设计
  11. Excel 电子表格文件格式剖析
  12. Unity5.6——VideoPlayer播放
  13. MFC:读取整个记事本文件
  14. 转座子可抑制mRNA翻译
  15. P(B|A)和P(AB)的理解
  16. 石家庄联通宽带DNS服务器地址
  17. 计算机为什么会出现网络用户,电脑登陆QQ经常提示异地登陆是怎么回事?
  18. selenium打开firefox无痕模式
  19. JAVA卸载报错无法访问网络位置
  20. 分享一个简单的抢购华为商城手机的js脚本,仅供学习交流

热门文章

  1. 360互联网技术训练营第七期 - “遇见”PIKA
  2. Alibaba Nacos 服务消费者工程接入nacos并实现调用服务提供者工程
  3. 异常的概念和Java异常体系结构
  4. ./configure --prefix
  5. xshell利用linux rz sz 命令上传、下载文件
  6. 如何在服务器上使用宝塔面板?
  7. 基础表比商户对账和汇总多了一笔退款数据
  8. 计算机会考补考时间安排,2019-2020学年第二学期初补考考试安排(实时更新)
  9. php 提取字段为key,从一个serialize过的array的字符串中取出中取对应KEY的value
  10. java 虚拟打印机_打印作业提交给打印机,使用虚拟打印机但不是真正的打印机 . Java的...