主題就是系統的總體樣式或風格,可經過Spring MVC框架提供的主題(theme)設置應用的總體樣式風格,提升用戶體驗。Spring MVC的主題就是一些靜態資源的集合,即包括樣式及圖片,用來控制應用的視覺風格。html
Spring MVC主題包括兩部份內容,分別是Theme和ThemeResolver,下面是對兩部份內容的介紹:web
應用中使用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
在Spring上下文中定義了Theme後,DispatcherServlet會在Spring容器中查找id爲themeResolver的Bean並使用。ThemeResolver工做原理與LocaleResolver工做原理基本是同樣的,它在request中查找theme主題並能夠修改request的theme主題。Spring提供了以下的主題解析器:cookie
defaultThemeName
屬性設置,即此屬性指定主題屬性文件的文件名。此解析器不能動態設置主題。Spring提供了ThemeChangeInterceptor攔截器,經過request參數控制改變用戶請求的主題。session
默認的主題解析器(在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下建立了靜態資源文件。框架
指定了一張測試圖片,以下:webapp
background=/img/wolf.jpg
配置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地址便可看到以前的效果圖。
最後建立了qq羣方便你們交流,可掃描加入,同時也可加我qq:276420284,共同窗習、共同進步,謝謝!