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

概述

上節介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個解析器實現的功能是同樣的,只是使用的主題載體有區別而已,SessionThemeResolver是從session中獲取主題Theme,CookieThemeResolver是從客戶端cookie中獲取主題Theme。web

CookieThemeResolver

CookieThemeResolver類繼承關係以下:spring

該類實現ThemeResolver接口,實現解析、設置主題Theme功能;繼承CookieGenerator類,以具有操做cookie功能。segmentfault

核心代碼以下:瀏覽器

// 設置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;
}

實戰

  • 項目結構

與上一章項目結構一致,參考http://www.javashuo.com/article/p-tcauonfx-dq.htmlcookie

  • 主題配置文件

myTheme.properties與上一章內容一致,參考上章。session

新增myTheme2.properties並更換一張不一樣的圖片。jsp

  • Spring配置文件

只要替換SessionThemeResolver便可,代碼以下:ide

<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,共同窗習、共同進步,謝謝!

相關文章
相關標籤/搜索