Cricket 2019-06-27
上节介绍了SessionThemeResolver解析器,本章分析下CookieThemeResolver,两个解析器实现的功能是一样的,只是使用的主题载体有区别而已,SessionThemeResolver是从session中获取主题Theme,CookieThemeResolver是从客户端cookie中获取主题Theme。
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; }
myTheme.properties与上一章内容一致,参考上章。
新增myTheme2.properties并更换一张不同的图片。
只要替换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,共同学习、共同进步,谢谢!