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

概述

主題就是系統的總體樣式或風格,可經過Spring MVC框架提供的主題(theme)設置應用的總體樣式風格,提升用戶體驗。Spring MVC的主題就是一些靜態資源的集合,即包括樣式及圖片,用來控制應用的視覺風格。html

Spring MVC主題包括兩部份內容,分別是Theme和ThemeResolver,下面是對兩部份內容的介紹:web

Theme

應用中使用Theme主題時,必須實現org.springframework.ui.context.ThemeSource接口,web應用上下文WebApplicationContext接口繼承自ThemeSource,可是實現功能委派給具體的實現,默認的委派給org.springframework.ui.context.support.ResouceBundleThemeSource類實現,此類默認從classpath加載主題屬性文件。不管是自定義ThemeSource接口的實現仍是經過配置屬性文件路勁的ResourceBundleThemeSource實現,都須要在Spring上下文中定義此bean,而且bean的id必須爲themeSource,Spring會自動發現並使用。spring

ThemeResolver

在Spring上下文中定義了Theme後,DispatcherServlet會在Spring容器中查找id爲themeResolver的Bean並使用。ThemeResolver工做原理與LocaleResolver工做原理基本是同樣的,它在request中查找theme主題並能夠修改request的theme主題。Spring提供了以下的主題解析器:cookie

  • FixedThemeResolver 默認主題解析器,使用固定的主題,經過defaultThemeName屬性設置,即此屬性指定主題屬性文件的文件名。此解析器不能動態設置主題。
  • SessionThemeResolver 經過用戶會話來保持主題,每一個會話(session)僅須要設置一次,全部請求共享主題,可是不能兩個會話共享。
  • CookieThemeResolver 使用客戶端cookie存儲的主題

Spring提供了ThemeChangeInterceptor攔截器,經過request參數控制改變用戶請求的主題。session

FixedThemeResolver

默認的主題解析器(在DispatcherServlet.properties中配置默認策略),實現ThemeResolver接口,使用固定的主題,主題的名字(就是主題的屬性文件名)可經過defaultThemeName屬性指定,該值默認是theme,該類比較簡單,源碼以下,作下注釋介紹:mvc

public class FixedThemeResolver extends AbstractThemeResolver {
    // 解析主題文件名
    @Override
    public String resolveThemeName(HttpServletRequest request) {
        // 返回主題文件名,默認值爲theme(在父類中定義)
        return getDefaultThemeName();
    }
    // 設置主題文件名,此解析器不能設置。
    @Override
    public void setThemeName(
            HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable String themeName) {
        throw new UnsupportedOperationException("Cannot change theme - use a different theme resolution strategy");
    }

}

實戰

  • 目標

練習使用FixedThemeResolver解析器,最終效果以下:app

  • 項目結構

在resources下建立了主題文件夾及主題文件,webapp下建立了靜態資源文件。框架

  • 主題配置文件(myTheme.properties)

指定了一張測試圖片,以下:webapp

background=/img/wolf.jpg
  • Spring配置文件

配置themeSource和themeResolver,以下:jsp

<!-- 默認Servlet處理靜態資源 -->
<mvc:default-servlet-handler />
<!-- jsp視圖映射與視圖解析 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!-- 加載主題資源文件 -->
<bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
    <!-- 指定文件前綴,即文件所在目錄,若是放在classpath下,value爲空(默認從classpath下加載) -->
    <property name="basenamePrefix" value="theme."/>
</bean>
<!-- 使用FixedThemeResolver -->
<bean id="themeResolver" class="org.springframework.web.servlet.theme.FixedThemeResolver">
    <!-- 定義theme文件的名稱 -->
    <property name="defaultThemeName" value="myTheme"/>
</bean>

說明:

一、ResourceBundleThemeSource的屬性basenamePrefix即爲主題屬性文件所在目錄名稱,其後必須有"."或"/"。

二、FixedThemeResolver是Spring默認的解析器,再此配置是爲了自定義defaultThemeName屬性值,即屬性文件名稱。

  • 視圖

本例使用jsp視圖展現,代碼以下:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
    <title>Spring MVC Theme</title>
</head>
<body>

    <img src="<spring:theme code='background'/>" style="width: 500px;height: 300px;">

</body>
</html>
  • 控制器

爲了測試,編寫Controller控制器,跳轉至jsp頁面,代碼以下:

@RequestMapping("/theme")
public String theme(){
    return "theme";
}

至此,啓動程序並訪問/theme地址便可看到以前的效果圖。

總結

  • 本例主要分析了Spring MVC對Theme總體支持,並實戰了默認的ThemeResolver,後續繼續分析SessionThemeResolver和CookieThemeResolver。其實此解析器與LocaleResolver的實現原理基本相同。

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

相關文章
相關標籤/搜索