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

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

概述

本章繼續分析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結合實現了通過請求引數控制會話主題。

相關文章

開發語言 最新文章