成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

OldPanda / 1802人閱讀

摘要:類繼承關(guān)系如下該類實(shí)現(xiàn)接口,實(shí)現(xiàn)解析設(shè)置主題功能繼承類,以具備操作功能。新增并更換一張不同的圖片。配置文件只要替換即可,代碼如下配置默認(rèn)的主題文件視圖和控制器視圖和控制器代碼與上一章一致,參考上章代碼。

概述

上節(jié)介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個解析器實(shí)現(xiàn)的功能是一樣的,只是使用的主題載體有區(qū)別而已,SessionThemeResolver是從session中獲取主題Theme,CookieThemeResolver是從客戶端cookie中獲取主題Theme。

CookieThemeResolver

CookieThemeResolver類繼承關(guān)系如下:

該類實(shí)現(xiàn)ThemeResolver接口,實(shí)現(xiàn)解析、設(shè)置主題Theme功能;繼承CookieGenerator類,以具備操作cookie功能。

核心代碼如下:

// 設(shè)置Theme,在請求到達(dá)Controller之前,進(jìn)行設(shè)置
@Override
public void setThemeName(
        HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable String themeName) {

    Assert.notNull(response, "HttpServletResponse is required for CookieThemeResolver");
    // 請求參數(shù)中傳來的themeName值
    if (StringUtils.hasText(themeName)) {
        // 把請求參數(shù)指定的主題設(shè)置request Attribute并寫cookie
        request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName);
        addCookie(response, themeName);
    }
    else {
        // 將默認(rèn)的主題設(shè)置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,在設(shè)置時指定了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中都無時,使用默認(rèn)theme
    if (themeName == null) {
        themeName = getDefaultThemeName();
    }
    request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName);
    return themeName;
}
實(shí)戰(zhàn)

項目結(jié)構(gòu)

與上一章項目結(jié)構(gòu)一致,參考https://segmentfault.com/a/1190000014868501

主題配置文件

myTheme.properties與上一章內(nèi)容一致,參考上章。

新增myTheme2.properties并更換一張不同的圖片。

Spring配置文件

只要替換SessionThemeResolver即可,代碼如下:


    
    

視圖和控制器

jsp視圖和Controller控制器代碼與上一章一致,參考上章代碼。

測試

啟動服務(wù),瀏覽器地址輸入http://localhost:8089/theme,界面如下:

從結(jié)果可知,使用的默認(rèn)配置的主題文件,并且無相關(guān)cookie信息。
接下來,我們通過請求參數(shù)設(shè)置主題,即訪問http://localhost:8089/theme?theme=myTheme2,此時看到的結(jié)果如下:

從結(jié)果看出,已經(jīng)替換了文件并且cookie也寫回客戶端了。

總結(jié)

經(jīng)過三篇文章,分析學(xué)習(xí)了Spring MVC 的ThemeResolver實(shí)現(xiàn)及源碼,希望能對大家有幫助,再此說明一下,ThemeResolver和LocaleResolver原理極其相似,兩者可以類比學(xué)習(xí),當(dāng)然日常開發(fā)中這兩種策略不常使用,我只是想系統(tǒng)的分析學(xué)習(xí)SpringMVC的知識點(diǎn)。

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

最后創(chuàng)建了qq群方便大家交流,可掃描加入,同時也可加我qq:276420284,共同學(xué)習(xí)、共同進(jìn)步,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69382.html

相關(guān)文章

  • SpringMVC源碼分析--ThemeResolver(一)

    摘要:此解析器不能動態(tài)設(shè)置主題。實(shí)戰(zhàn)目標(biāo)練習(xí)使用解析器,最終效果如下項目結(jié)構(gòu)在下創(chuàng)建了主題文件夾及主題文件,下創(chuàng)建了靜態(tài)資源文件。是默認(rèn)的解析器,再此配置是為了自定義屬性值,即屬性文件名稱。其實(shí)此解析器與的實(shí)現(xiàn)原理基本相同。 概述 主題就是系統(tǒng)的整體樣式或風(fēng)格,可通過Spring MVC框架提供的主題(theme)設(shè)置應(yīng)用的整體樣式風(fēng)格,提高用戶體驗。Spring MVC的主題就是一些靜態(tài)資...

    Ocean 評論0 收藏0
  • SpringMVC源碼分析--LocaleResolver和ThemeResolver應(yīng)用

    摘要:需求根據(jù)客戶端環(huán)境,界面顯示不同的國旗圖案。選擇的技術(shù)方案可利用提供的國際化和主題定制來解決。注意此時返回的中沒有國際化及主題相關(guān)的信息。修改請求參數(shù)的值為荷蘭,即后再發(fā)起請求,結(jié)果如下與預(yù)期一致,測試通過。 概述 以上分析了Spring MVC的LocaleResolver和ThemeResolver兩個策略解析器,在實(shí)際項目中很少使用,尤其是ThemeResolver,花精力去分析...

    qpal 評論0 收藏0
  • SpringMVC源碼分析--ThemeResolver(二)

    摘要:類實(shí)現(xiàn)接口,使用用戶會話中的主題。新增并更換一張不同的圖片。通過關(guān)閉瀏覽器,然后再訪問進(jìn)行測試總結(jié)本章通過攔截器和結(jié)合實(shí)現(xiàn)了通過請求參數(shù)控制會話主題。 概述 本章繼續(xù)分析ThemeResolver的另一個實(shí)現(xiàn)類SessionThemeResolver,需要了解Spring MVC Theme情況的,可參考上一篇文章https://segmentfault.com/a/119000001...

    antyiwei 評論0 收藏0
  • SpringMVC源碼分析--請求過程

    摘要:概述根據(jù)規(guī)范,當(dāng)用戶請求到達(dá)應(yīng)用時,由的方法進(jìn)行處理,對于而言,處理用戶請求的入口為,通過其父類的攔截處理。最后創(chuàng)建了群方便大家交流,可掃描加入,同時也可加我,共同學(xué)習(xí)共同進(jìn)步,謝謝 概述 根據(jù)Servlet規(guī)范,當(dāng)用戶請求到達(dá)應(yīng)用時,由Servlet的service()方法進(jìn)行處理,對于Spring MVC而言,處理用戶請求的入口為DispatcherServlet,通過其父類Fra...

    zxhaaa 評論0 收藏0
  • SpringMVC源碼分析--ViewResolver(

    摘要:概述本節(jié)學(xué)習(xí)下的功能,簡單來說,該類的作用就是把多個視圖解析器進(jìn)行組裝,內(nèi)部使用存儲配置使用的視圖解析器??偨Y(jié)本章介紹了類,根據(jù)測試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節(jié)學(xué)習(xí)下ViewResolverComposite的功能,簡單來說,該類的作用就是把多個ViewResolver視圖解析器進(jìn)行組裝,內(nèi)部使用list存儲配置使用的視圖解析器。 本系列文章是基于Spri...

    fox_soyoung 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<