概述
上节介绍了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即可,代码如下:
<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,共同学习、共同进步,谢谢!