摘要:類繼承關系如下該類實現接口,實現解析設置主題功能繼承類,以具備操作功能。新增并更換一張不同的圖片。配置文件只要替換即可,代碼如下配置默認的主題文件視圖和控制器視圖和控制器代碼與上一章一致,參考上章代碼。
概述
上節介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個解析器實現的功能是一樣的,只是使用的主題載體有區別而已,SessionThemeResolver是從session中獲取主題Theme,CookieThemeResolver是從客戶端cookie中獲取主題Theme。
CookieThemeResolverCookieThemeResolver類繼承關系如下:
該類實現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即可,代碼如下:
視圖和控制器
jsp視圖和Controller控制器代碼與上一章一致,參考上章代碼。
測試
啟動服務,瀏覽器地址輸入http://localhost:8089/theme,界面如下:
從結果可知,使用的默認配置的主題文件,并且無相關cookie信息。
接下來,我們通過請求參數設置主題,即訪問http://localhost:8089/theme?theme=myTheme2,此時看到的結果如下:
從結果看出,已經替換了文件并且cookie也寫回客戶端了。
總結經過三篇文章,分析學習了Spring MVC 的ThemeResolver實現及源碼,希望能對大家有幫助,再此說明一下,ThemeResolver和LocaleResolver原理極其相似,兩者可以類比學習,當然日常開發中這兩種策略不常使用,我只是想系統的分析學習SpringMVC的知識點。
一個小小的問題,比如要實現,根據不同客戶端,界面顯示不同的國旗?提問題是希望能給大家互動,希望大家說說想法:)
最后創建了qq群方便大家交流,可掃描加入,同時也可加我qq:276420284,共同學習、共同進步,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69382.html
摘要:此解析器不能動態設置主題。實戰目標練習使用解析器,最終效果如下項目結構在下創建了主題文件夾及主題文件,下創建了靜態資源文件。是默認的解析器,再此配置是為了自定義屬性值,即屬性文件名稱。其實此解析器與的實現原理基本相同。 概述 主題就是系統的整體樣式或風格,可通過Spring MVC框架提供的主題(theme)設置應用的整體樣式風格,提高用戶體驗。Spring MVC的主題就是一些靜態資...
摘要:需求根據客戶端環境,界面顯示不同的國旗圖案。選擇的技術方案可利用提供的國際化和主題定制來解決。注意此時返回的中沒有國際化及主題相關的信息。修改請求參數的值為荷蘭,即后再發起請求,結果如下與預期一致,測試通過。 概述 以上分析了Spring MVC的LocaleResolver和ThemeResolver兩個策略解析器,在實際項目中很少使用,尤其是ThemeResolver,花精力去分析...
摘要:類實現接口,使用用戶會話中的主題。新增并更換一張不同的圖片。通過關閉瀏覽器,然后再訪問進行測試總結本章通過攔截器和結合實現了通過請求參數控制會話主題。 概述 本章繼續分析ThemeResolver的另一個實現類SessionThemeResolver,需要了解Spring MVC Theme情況的,可參考上一篇文章https://segmentfault.com/a/119000001...
摘要:概述根據規范,當用戶請求到達應用時,由的方法進行處理,對于而言,處理用戶請求的入口為,通過其父類的攔截處理。最后創建了群方便大家交流,可掃描加入,同時也可加我,共同學習共同進步,謝謝 概述 根據Servlet規范,當用戶請求到達應用時,由Servlet的service()方法進行處理,對于Spring MVC而言,處理用戶請求的入口為DispatcherServlet,通過其父類Fra...
摘要:概述本節學習下的功能,簡單來說,該類的作用就是把多個視圖解析器進行組裝,內部使用存儲配置使用的視圖解析器。總結本章介紹了類,根據測試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節學習下ViewResolverComposite的功能,簡單來說,該類的作用就是把多個ViewResolver視圖解析器進行組裝,內部使用list存儲配置使用的視圖解析器。 本系列文章是基于Spri...
閱讀 2410·2021-11-19 09:40
閱讀 3575·2021-10-12 10:12
閱讀 1883·2021-09-22 15:04
閱讀 2898·2021-09-02 09:53
閱讀 762·2019-08-29 11:03
閱讀 1122·2019-08-28 18:11
閱讀 1724·2019-08-23 15:28
閱讀 3580·2019-08-23 15:05