Themes

你可以应用 Spring Web MVC 框架主题来设置你的应用程序的总体外观和感受,从而增强用户体验。主题是静态资源(通常是样式表和图像)的集合,它影响应用程序的视觉风格。

从 6.0 开始,不再支持主题,而是建议使用 CSS,且在服务器端没有任何特殊支持。

Defining a theme

要在 Web 应用程序中使用主题,你必须设置 org.springframework.ui.context.ThemeSource 接口的实现。WebApplicationContext 接口扩展了 ThemeSource,但将其职责委托给专用的实现。默认情况下,委托是一个 org.springframework.ui.context.support.ResourceBundleThemeSource 实现,从类路径的根加载属性文件。要使用自定义 ThemeSource 实现或配置 ResourceBundleThemeSource 的基本名称前缀,你可以在应用程序上下文中注册一个 bean,其保留名称为 themeSource。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,它引用包含荷兰语文本的特殊背景图像。

Resolving Themes

按照 preceding section 中所述定义主题后,需要决定使用哪个主题。DispatcherServlet 查找名为 themeResolver 的 bean 以找出要使用哪个 ThemeResolver 实现。主题解析器的作用与 LocaleResolver 非常相似。它检测要用于特定请求的主题,还可以更改请求的主题。下表描述了 Spring 提供的主题解析器:

Table 1. ThemeResolver implementations
Class Description

FixedThemeResolver

使用 defaultThemeName 属性设定选择一个固定主题。

SessionThemeResolver

该主题保存在用户的 HTTP 会话中。每个会话只需要设置一次,但在不同会话之间不会持久化。

CookieThemeResolver

所选主题存储在客户端上的Cookie中。

Spring 还提供一个 ThemeChangeInterceptor,它允许在每个请求中使用一个简单的请求参数来更改主题。