对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

主题

您可以应用 Spring Web MVC 框架的主题来设置应用程序的整体外观和风格,从而提升用户体验。主题是一组静态资源的集合,通常包括样式表和图像,用于影响应用程序的视觉样式。spring-doc.cadn.net.cn

从 6.0 版本起,对主题(themes)的支持已被弃用,转而推荐使用 CSS, 且服务器端不再提供任何特殊支持。

定义主题

要在您的Web应用程序中使用主题(themes),您必须设置一个实现了 org.springframework.ui.context.ThemeSource 接口的实现类。WebApplicationContext 接口继承了 ThemeSource,但会将其职责委托给一个专门的实现。 默认情况下,该委托对象是一个 org.springframework.ui.context.support.ResourceBundleThemeSource 的实现, 它从类路径的根目录加载属性文件。若要使用自定义的 ThemeSource 实现,或者配置 ResourceBundleThemeSource 的基础名称前缀, 您可以在应用上下文中注册一个名为 themeSource 的保留名称的bean。 Web应用上下文会自动检测到该名称的bean并加以使用。spring-doc.cadn.net.cn

当你使用 ResourceBundleThemeSource 时,主题是在一个简单的属性文件中定义的。该属性文件列出了构成主题的资源,如下例所示:spring-doc.cadn.net.cn

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

属性的键是从视图代码中引用主题化元素的名称。在 JSP 中,通常使用 spring:theme 自定义标签来实现这一点,该标签与 spring:message 标签非常相似。以下 JSP 片段使用了前一个示例中定义的主题来自定义外观和风格:spring-doc.cadn.net.cn

<%@ 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 使用一个空的 basename 前缀。因此,属性文件会从类路径的根目录加载。所以,您应将 cool.properties 主题定义文件放在类路径根目录下的某个目录中(例如,放在 /WEB-INF/classes 中)。ResourceBundleThemeSource 使用标准的 Java 资源包加载机制,从而支持主题的完整国际化。例如,我们可以有一个 /WEB-INF/classes/cool_nl.properties 文件,其中引用一张带有荷兰语文本的特殊背景图片。spring-doc.cadn.net.cn

解析主题

按照前一节所述定义主题之后, 你需要决定使用哪个主题。DispatcherServlet会查找名为themeResolver的bean, 以确定要使用哪个ThemeResolver实现。主题解析器的工作方式与LocaleResolver非常相似。 它能够检测特定请求应使用的主题,也可以修改请求的主题。下表描述了Spring提供的主题解析器:spring-doc.cadn.net.cn

表1. ThemeResolver 实现
<description> </description>

FixedThemeResolverspring-doc.cadn.net.cn

通过使用 defaultThemeName 属性设置一个固定的主题。spring-doc.cadn.net.cn

SessionThemeResolverspring-doc.cadn.net.cn

主题保存在用户的 HTTP 会话中。每个会话只需设置一次,但在不同会话之间不会被持久化。spring-doc.cadn.net.cn

CookieThemeResolverspring-doc.cadn.net.cn

所选主题存储在客户端的 Cookie 中。spring-doc.cadn.net.cn

Spring 还提供了一个 ThemeChangeInterceptor,它允许通过一个简单的请求参数在每次请求时更改主题。spring-doc.cadn.net.cn