主题

您可以应用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. 主题解析器实现
描述

FixedThemeResolver

选择一个固定的主题,通过使用defaultThemeName属性设置。

SessionThemeResolver

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

CookieThemeResolver

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

Spring还提供了一个ThemeChangeInterceptor,允许在每个请求上通过简单的请求参数更改主题。