springMVC源码分析--动态样式ThemeResolver(二)
在上一篇博客springMVC源码分析--动态样式ThemeResolver(一)中我们介绍了多样式ThemeResolver的使用方法,接下来我们对源码进行简单的分析一下。
ThemeResolver的体系结构如下:
1、接口ThemeResolver中定义的接口是比较简单的,提供两个接口:
(1)resolveThemeName获取样式名
(2)setThemeName设置样式名
public interface ThemeResolver { /** * Resolve the current theme name via the given request. * Should return a default theme as fallback in any case. * @param request request to be used for resolution * @return the current theme name */ String resolveThemeName(HttpServletRequest request); /** * Set the current theme name to the given one. * @param request request to be used for theme name modification * @param response response to be used for theme name modification * @param themeName the new theme name * @throws UnsupportedOperationException if the ThemeResolver implementation * does not support dynamic changing of the theme */ void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName); }
2、抽象类AbstractThemeResolver,提供两个方法:
(1)setDefaultThemeName 设置默认的样式名
(2)getDefaultThemeName 获取默认的样式名
public abstract class AbstractThemeResolver implements ThemeResolver { public final static String ORIGINAL_DEFAULT_THEME_NAME = "theme"; private String defaultThemeName = ORIGINAL_DEFAULT_THEME_NAME; public void setDefaultThemeName(String defaultThemeName) { this.defaultThemeName = defaultThemeName; } public String getDefaultThemeName() { return this.defaultThemeName; } }
3、实现类CookieThemeResolver,其实现原理其实是比较简单的,就是在Cookie中设置样式名
(1)在setThemeName函数中中将theme设置到cookie中
public class CookieThemeResolver extends CookieGenerator implements ThemeResolver { public final static String ORIGINAL_DEFAULT_THEME_NAME = "theme"; /** * Name of the request attribute that holds the theme name. Only used * for overriding a cookie value if the theme has been changed in the * course of the current request! Use RequestContext.getTheme() to * retrieve the current theme in controllers or views. * @see org.springframework.web.servlet.support.RequestContext#getTheme */ public static final String THEME_REQUEST_ATTRIBUTE_NAME = CookieThemeResolver.class.getName() + ".THEME"; public static final String DEFAULT_COOKIE_NAME = CookieThemeResolver.class.getName() + ".THEME"; private String defaultThemeName = ORIGINAL_DEFAULT_THEME_NAME; public CookieThemeResolver() { setCookieName(DEFAULT_COOKIE_NAME); } /** * Set the name of the default theme. */ public void setDefaultThemeName(String defaultThemeName) { this.defaultThemeName = defaultThemeName; } /** * Return the name of the default theme. */ public String getDefaultThemeName() { return defaultThemeName; } @Override public String resolveThemeName(HttpServletRequest request) { // Check request for preparsed or preset theme. String themeName = (String) request.getAttribute(THEME_REQUEST_ATTRIBUTE_NAME); if (themeName != null) { return themeName; } // Retrieve cookie value from request. Cookie cookie = WebUtils.getCookie(request, getCookieName()); if (cookie != null) { String value = cookie.getValue(); if (StringUtils.hasText(value)) { themeName = value; } } // Fall back to default theme. if (themeName == null) { themeName = getDefaultThemeName(); } request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName); return themeName; } @Override public void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName) { if (StringUtils.hasText(themeName)) { // Set request attribute and add cookie. request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName); addCookie(response, themeName); } else { // Set request attribute to fallback theme and remove cookie. request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, getDefaultThemeName()); removeCookie(response); } } }
3、实现类SessionThemeResolver的实现也是比较简单的,就是将themeName保存到session中就可以了。
public class SessionThemeResolver extends AbstractThemeResolver { /** * Name of the session attribute that holds the theme name. * Only used internally by this implementation. * Use {@code RequestContext(Utils).getTheme()} * to retrieve the current theme in controllers or views. * @see org.springframework.web.servlet.support.RequestContext#getTheme * @see org.springframework.web.servlet.support.RequestContextUtils#getTheme */ public static final String THEME_SESSION_ATTRIBUTE_NAME = SessionThemeResolver.class.getName() + ".THEME"; @Override public String resolveThemeName(HttpServletRequest request) { String themeName = (String) WebUtils.getSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME); // A specific theme indicated, or do we need to fallback to the default? return (themeName != null ? themeName : getDefaultThemeName()); } @Override public void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName) { WebUtils.setSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME, (StringUtils.hasText(themeName) ? themeName : null)); } }
4、FixedThemeResolver中没有具体的实现操作
public class FixedThemeResolver extends AbstractThemeResolver { @Override public String resolveThemeName(HttpServletRequest request) { return getDefaultThemeName(); } @Override public void setThemeName(HttpServletRequest request, HttpServletResponse response, String themeName) { throw new UnsupportedOperationException("Cannot change theme - use a different theme resolution strategy"); } }
springMVC源码分析--动态样式ThemeResolver(二)的更多相关文章
- springMVC源码分析--动态样式ThemeResolver(一)
Spring MVC中通过ThemeSource接口来提供对动态更换样式的支持,并提供了ResourceBundleThemeSource这个具体实现类来提供通过properties配置文件对them ...
- springMVC源码分析--容器初始化(二)DispatcherServlet
在上一篇博客springMVC源码分析--容器初始化(一)中我们介绍了spring web初始化IOC容器的过程,springMVC作为spring项目中的子项目,其可以和spring web容器很好 ...
- springMVC源码分析--DispatcherServlet请求获取及处理
在之前的博客springMVC源码分析--容器初始化(二)DispatcherServlet中我们介绍过DispatcherServlet,是在容器初始化过程中出现的,我们之前也说过Dispatche ...
- SpringMVC源码分析--容器初始化(三)HttpServletBean
在上一篇博客springMVC源码分析--容器初始化(二)DispatcherServlet中,我们队SpringMVC整体生命周期有一个简单的说明,并没有进行详细的源码分析,接下来我们会根据博客中提 ...
- springMVC源码分析--国际化实现Session和Cookie(二)
上一篇博客springMVC源码分析--国际化LocaleResolver(一)中我们介绍了springMVC提供的国际化的解决方案,接下来我们根据springMVC提供的解决方案来简单的实现一个多语 ...
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
- springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)
在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...
- springMVC源码分析--SimpleServletHandlerAdapter(二)
上一篇博客springMVC源码分析--HandlerAdapter(一)中我们主要介绍了一下HandlerAdapter接口相关的内容,实现类及其在DispatcherServlet中执行的顺序,接 ...
- springMVC源码分析--AbstractHandlerMapping(二)
上一篇博客springMVC源码分析--HandlerMapping(一)中我们简单的介绍了HandlerMapping,接下来我们介绍一下它的抽象实现类AbstractHandlerMapping
随机推荐
- 三 Django模型层之Meta
模型的Meta选项 本文阐述所有可用的元数据选项,你可以在模型的Meta类中设置他们 Meta选项 abstract 如果为True,就表示抽象基类 app_label 如果模型在INSTALLED_ ...
- 网易云安全两篇论文入选计算机视觉顶级会议ICCV
本文由 网易云发布. 10月22日至29日,全球计算机视觉顶尖专家们共聚威尼斯,参加ICCV2017国际计算机视觉大会,就领域内最新成果展开集中研讨,大会论文集也代表了计算机视觉领域最新的发展方向和 ...
- [HNOI 2014]江南乐
Description 题库链接 给你指定一个数 \(f\) ,并给你 \(T\) 组游戏,每组有 \(n\) 堆石子, \(A,B\) 两人轮流对石子进行操作,每次你可以选择其中任意一堆数量不小于 ...
- [NOIp 2017]逛公园
Description 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N$号点是公园的出口,每条边有一个非负权值, 代表策策经 ...
- [HNOI 2011]XOR和路径
Description 给定一个无向连通图,其节点编号为 1 到 N,其边的权值为非负整数.试求出一条从 1 号节点到 N 号节点的路径,使得该路径上经过的边的权值的“XOR 和”最大.该路径可以重复 ...
- 51nod 1981 如何愉快地与STL玩耍
Description 驴蛋蛋在愉快地与STL玩耍 突然间小A跳了出来对驴蛋蛋说,看你与STL玩的很开心啊,那我给你一个大小为N的vector,这个vector上每个位置上是一个set, 每次我会在闭 ...
- 51 nod 1495 中国好区间
1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...
- 【USACO07NOV】电话线Telephone Wire
题目描述 电信公司要更换某个城市的网线.新网线架设在原有的 N(2 <= N <= 100,000)根电线杆上, 第 i 根电线杆的高度为 height_i 米(1 <= heigh ...
- hdu 3948 后缀数组
The Number of Palindromes Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (J ...
- Linux中LCD设备驱动-framebuffer(帧缓冲)【】
转自:https://blog.csdn.net/linux_devices_driver/article/details/7079442 1.framebuffer 帧缓冲 帧缓冲(fram ...