上節介紹了SessionThemeResolver解析器,本章分析下CookieThemeResolver,兩個解析器實現的功能是同樣的,只是使用的主題載體有區別而已,SessionThemeResolver是從session中獲取主題Theme,CookieThemeResolver是從客戶端cookie中獲取主題Theme。web
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
只要替換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,共同窗習、共同進步,謝謝!