主题
您可以应用 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 提供的各种主题解析器:
类 | 描述 |
---|---|
|
选择一个固定主题,通过 |
|
主题保存在用户的 HTTP 会话中。每个会话只需设置一次,但不会在会话之间持久化。 |
|
所选主题存储在客户端的 Cookie 中。 |
Spring 还提供了一个 ThemeChangeInterceptor
,它允许通过简单的请求参数更改每个请求的主题。