SpringMVC之源碼分析--ThemeResolver(二)

概述

本章繼續分析ThemeResolver的另外一個實現類SessionThemeResolver,須要瞭解Spring MVC Theme狀況的,可參考上一篇文章http://www.javashuo.com/article/p-tcauonfx-dq.htmlweb

SessionThemeResolver

SessionThemeResolver類的繼承關係以下:spring

說明:segmentfault

一、與FixedThemeResolver解析器的繼承關係同樣,都繼承自AbstractThemeResolver抽象類,其中抽象類中定義了defaultThemeName屬性,用於設置屬性文件的名稱,默認爲theme瀏覽器

二、SessionThemeResolver類實現ThemeResolver接口,使用用戶會話(session)中的主題。session

該類源代碼以下:mvc

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));
    }

}

實戰

  • 項目結構

與上一章項目結構一致,參考http://www.javashuo.com/article/p-tcauonfx-dq.htmljsp

  • 主題配置文件

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

新增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結合實現了經過請求參數控制會話主題。

最後建立了qq羣方便你們交流,可掃描加入,同時也可加我qq:276420284,共同窗習、共同進步,謝謝!

相關文章
相關標籤/搜索