主題

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

自 6.0 版本起,對主題的支援已被棄用,推薦使用 CSS,並且伺服器端無需任何特殊支援。

定義主題

要在您的 Web 應用程式中使用主題,您必須設定一個實現 org.springframework.ui.context.ThemeSource 介面的類。WebApplicationContext 介面擴充套件了 ThemeSource,但將其職責委託給一個專門的實現。預設情況下,委託物件是 org.springframework.ui.context.support.ResourceBundleThemeSource 實現,它從類路徑根目錄載入屬性檔案。要使用自定義 ThemeSource 實現或配置 ResourceBundleThemeSource 的基本名稱字首,您可以在應用程式上下文中註冊一個保留名稱為 themeSource 的 Bean。Web 應用程式上下文會自動檢測具有該名稱的 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 會話中。每個會話只需設定一次,但不會在會話之間持久化。

CookieThemeResolver

所選主題儲存在客戶端的 Cookie 中。

Spring 還提供了一個 ThemeChangeInterceptor,它允許透過簡單的請求引數更改每個請求的主題。