SpringMVC之原始碼分析–ThemeResolver(三)

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

概述

上節介紹了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的知識點。

一個小小的問題,比如要實現,根據不同客戶端,介面顯示不同的國旗?提問題是希望能給大家互動,希望大家說說想法:)

相關文章

開發語言 最新文章