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

主题

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

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

定义主题

要在你的Web应用程序中使用主题,你必须设置一个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 使用一个空的基本名称前缀。因此,属性文件从类路径的根目录加载。因此,您将 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实现
描述

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