主題

您可以套用 Spring Web MVC 框架主題來設定應用程式的整體外觀和風格,從而增強使用者體驗。主題是靜態資源的集合,通常是樣式表和影像,會影響應用程式的視覺樣式。

自 6.0 起,已棄用對主題的支援,轉而使用 CSS,且伺服器端沒有任何特殊支援。

定義主題

若要在您的 Web 應用程式中使用主題,您必須設定 org.springframework.ui.context.ThemeSource 介面的實作。WebApplicationContext 介面擴充了 ThemeSource,但將其職責委派給專用的實作。預設情況下,委派是 org.springframework.ui.context.support.ResourceBundleThemeSource 實作,它從類別路徑的根目錄載入屬性檔案。若要使用自訂 ThemeSource 實作或配置 ResourceBundleThemeSource 的基本名稱前綴,您可以在應用程式 Context 中以保留名稱 themeSource 註冊 Bean。Web 應用程式 Context 會自動偵測具有該名稱的 Bean 並使用它。

當您使用 ResourceBundleThemeSource 時,主題會在簡單的屬性檔案中定義。屬性檔案列出構成主題的資源,如下列範例所示

styleSheet=/themes/cool/style.css
background=/themes/cool/img/coolBg.jpg

屬性的鍵是從檢視程式碼引用主題元素的名稱。對於 JSP,您通常使用 spring:theme 自訂標籤來執行此操作,這與 spring:message 標籤非常相似。下列 JSP 片段使用上一個範例中定義的主題來自訂外觀和風格

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
	<head>
		<link rel="stylesheet" href="<spring:theme code='styleSheet'/>" type="text/css"/>
	</head>
	<body style="background=<spring:theme code='background'/>">
		...
	</body>
</html>

預設情況下,ResourceBundleThemeSource 使用空的基本名稱前綴。因此,屬性檔案會從類別路徑的根目錄載入。因此,您會將 cool.properties 主題定義放在類別路徑根目錄的目錄中(例如,在 /WEB-INF/classes 中)。ResourceBundleThemeSource 使用標準 Java 資源套件載入機制,允許主題的完整國際化。例如,我們可以有一個 /WEB-INF/classes/cool_nl.properties,它引用具有荷蘭語文字的特殊背景影像。

解析主題

在您定義主題之後,如前一節所述,您決定要使用哪個主題。DispatcherServlet 尋找名為 themeResolver 的 Bean,以找出要使用哪個 ThemeResolver 實作。主題解析器的工作方式與 LocaleResolver 非常相似。它偵測要用於特定請求的主題,並且還可以變更請求的主題。下表說明了 Spring 提供的主題解析器

表 1. ThemeResolver 實作
類別 描述

FixedThemeResolver

選取固定的主題,使用 defaultThemeName 屬性設定。

SessionThemeResolver

主題維護在使用者的 HTTP Session 中。每個 Session 只需要設定一次,但不會在 Session 之間持續保存。

CookieThemeResolver

選取的主題儲存在客户端上的 Cookie 中。

Spring 也提供了 ThemeChangeInterceptor,可讓您使用簡單的請求參數在每個請求上變更主題。