你可以应用 Spring Web MVC 框架的主题来设置你的应用程序的整体外观和感觉,从而增强用户体验。主题是一个静态资源的集合,通常是样式表和图片,它影响应用程序的视觉风格。
:::tips 本章只纯粹翻译,因为几乎上都用不上了, 现在几乎上都是前后分离的模式了 :::
定义主题
要在你的 Web 应用程序中使用主题,你必须设置 org.springframework.ui.context.ThemeSource
接口的一个实现。WebApplicationContext 接口扩展了 ThemeSource,但将其职责委托给一个专门的实现。默认情况下,该委托是一个org.springframework.ui.context.support.ResourceBundleThemeSource
实现,它从 classpath 的根部加载属性文件。要使用自定义的 ThemeSource 实现或配置ResourceBundleThemeSource 的基名前缀,你可以在应用程序上下文中用保留名称 themeSource 注册一个 bean。Web 应用程序上下文会自动检测到具有该名称的 Bean 并使用它。
当你使用 ResourceBundleThemeSource 时,一个主题被定义在一个简单的属性文件中。该属性文件列出了构成主题的资源,如下例所示:
tyleSheet=/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 使用一个空的基础名称前缀。结果是,属性文件从 classpath 的根部加载。因此,你要把 cool.properties 主题定义放在 classpath 根部的一个目录中(例如,放在 /WEB-INF/classes 中)。ResourceBundleThemeSource 使用标准的 Java 资源包加载机制,允许主题的完全国际化。例如,我们可以有一个 /WEB-INF/classes/cool_nl.properties,引用一个特殊的背景图片,上面有荷兰文。
Resolving Themes
如上一节所述,在你定义了主题之后,你决定使用哪个主题。DispatcherServlet 会寻找一个名为 themeResolver 的 bean 来找出要使用的 ThemeResolver 实现。主题解析器的工作方式与 LocaleResolver 大致相同。它检测要用于特定请求的主题,也可以改变请求的主题。下表描述了由 Spring 提供的主题解析器。
Class | Description |
---|---|
FixedThemeResolver | 选择一个固定的主题,通过使用 defaultThemeName 属性设置。 |
SessionThemeResolver | 该主题在用户的 HTTP 会话中被维护。它只需要为每个会话设置一次,但在不同的会话之间不会被持久化。 |
CookieThemeResolver | 所选择的主题被储存在客户端的一个 cookie 中。 |
Spring 还提供了一个 ThemeChangeInterceptor,可以通过一个简单的请求参数让主题在每个请求中发生变化。