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

概述

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

CookieThemeResolver

CookieThemeResolver类继承关系如下:

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

该类实现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并更换一张不同的图片。

  • Spring配置文件

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

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

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

  • 测试

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

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

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

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

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

总结

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

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

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

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

相关推荐