摘要:類繼承關(guān)系如下該類實(shí)現(xiàn)接口,實(shí)現(xiàn)解析設(shè)置主題功能繼承類,以具備操作功能。新增并更換一張不同的圖片。配置文件只要替換即可,代碼如下配置默認(rèn)的主題文件視圖和控制器視圖和控制器代碼與上一章一致,參考上章代碼。
概述
上節(jié)介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個解析器實(shí)現(xiàn)的功能是一樣的,只是使用的主題載體有區(qū)別而已,SessionThemeResolver是從session中獲取主題Theme,CookieThemeResolver是從客戶端cookie中獲取主題Theme。
CookieThemeResolverCookieThemeResolver類繼承關(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
摘要:此解析器不能動態(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)資...
摘要:需求根據(jù)客戶端環(huán)境,界面顯示不同的國旗圖案。選擇的技術(shù)方案可利用提供的國際化和主題定制來解決。注意此時返回的中沒有國際化及主題相關(guān)的信息。修改請求參數(shù)的值為荷蘭,即后再發(fā)起請求,結(jié)果如下與預(yù)期一致,測試通過。 概述 以上分析了Spring MVC的LocaleResolver和ThemeResolver兩個策略解析器,在實(shí)際項目中很少使用,尤其是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...
摘要:概述根據(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...
摘要:概述本節(jié)學(xué)習(xí)下的功能,簡單來說,該類的作用就是把多個視圖解析器進(jìn)行組裝,內(nèi)部使用存儲配置使用的視圖解析器??偨Y(jié)本章介紹了類,根據(jù)測試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節(jié)學(xué)習(xí)下ViewResolverComposite的功能,簡單來說,該類的作用就是把多個ViewResolver視圖解析器進(jìn)行組裝,內(nèi)部使用list存儲配置使用的視圖解析器。 本系列文章是基于Spri...
閱讀 2447·2021-11-19 09:40
閱讀 3617·2021-10-12 10:12
閱讀 1916·2021-09-22 15:04
閱讀 2926·2021-09-02 09:53
閱讀 806·2019-08-29 11:03
閱讀 1152·2019-08-28 18:11
閱讀 1751·2019-08-23 15:28
閱讀 3606·2019-08-23 15:05