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

NO IMAGE

概述

本章繼續分析ThemeResolver的另一個實現類SessionThemeResolver,需要了解Spring MVC Theme情況的,可參考上一篇文章https://segmentfault.com/a/1190000014868501

SessionThemeResolver

SessionThemeResolver類的繼承關係如下:

說明:

1、與FixedThemeResolver解析器的繼承關係一樣,都繼承自AbstractThemeResolver抽象類,其中抽象類中定義了defaultThemeName屬性,用於設定屬性檔案的名稱,預設為theme

2、SessionThemeResolver類實現ThemeResolver介面,使用使用者會話(session)中的主題。

該類原始碼如下:


public class SessionThemeResolver extends AbstractThemeResolver {
// 用於設定session Attribute中的key使用
public static final String THEME_SESSION_ATTRIBUTE_NAME = SessionThemeResolver.class.getName()   ".THEME";
// 解析請求中使用的主題
@Override
public String resolveThemeName(HttpServletRequest request) {
// 從請求會話中獲取到主題
String themeName = (String) WebUtils.getSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME);
// 如果會話中不存在,使用預設的主題
return (themeName != null ? themeName : getDefaultThemeName());
}
// 設定請求的主題
@Override
public void setThemeName(
HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable String themeName) {
// 從客戶端請求獲取主題並設定到session的Attribute區中
WebUtils.setSessionAttribute(request, THEME_SESSION_ATTRIBUTE_NAME,
(StringUtils.hasText(themeName) ? themeName : null));
}
}

實戰

  • 專案結構

與上一章專案結構一致,參考https://segmentfault.com/a/1190000014868501

  • 主題配置檔案

myTheme.properties與上一章內容一致,參考上章。

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

  • Spring配置檔案

本節我們結合攔截器進行設定,配置如下:

<mvc:interceptors>
<!-- 該攔截器通過名為”theme”的引數來攔截HTTP請求,設定Theme主題 -->
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor">
<!-- 使用者請求引數的名稱為:theme -->
<property name="paramName" value="theme"/>
</bean>
</mvc:interceptors>
<!-- 指定ThemeResolver -->
<bean id="themeResolver" class="org.springframework.web.servlet.theme.SessionThemeResolver">
<!-- 配置預設的主題檔案 -->
<property name="defaultThemeName" value="myTheme"/>
</bean>
<!-- 其餘配置省略,參加上章 -->
...
  • 檢視和控制器

jsp檢視和Controller控制器程式碼與上一章一致,參考上章程式碼。

  • 測試

啟動應用服務,在瀏覽器客戶端輸入訪問地址http://localhost:8089/theme,此時使用的是預設設定的主題檔案,即:myTheme.properties,我使用的一張狼的圖片,效果如下:

接下來我們利用請求引數設定會話主題,輸入地址:http://localhost:8089/theme?theme=myTheme2,並回車,此時使用者會話已經設定為了myTheme2,我使用的一張狗的圖片,效果如下:

設定了會話主題後,在後續的訪問中將使用設定後的主題,但是使用者會話結束後,在訪問,系統將使用預設設定的主題。(通過關閉瀏覽器,然後再訪問進行測試)

總結

本章通過攔截器ThemeChangeInterceptor和SessionThemeResolver結合實現了通過請求引數控制會話主題。