Themes

你可以应用 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 时,一个主题被定义在一个简单的属性文件中。该属性文件列出了构成主题的资源,如下例所示:

  1. tyleSheet=/themes/cool/style.css
  2. background=/themes/cool/img/coolBg.jpg

属性的键是指视图代码中的主题元素的名称。对于 JSP,你通常使用 spring:theme 自定义标签来完成,它与 spring:message 标签非常相似。下面的 JSP 片段使用前面例子中定义的主题来定制外观和感觉。

  1. <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
  2. <html>
  3. <head>
  4. <link rel="stylesheet" href="<spring:theme code='styleSheet'/>" type="text/css"/>
  5. </head>
  6. <body style="background=<spring:theme code='background'/>">
  7. ...
  8. </body>
  9. </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,可以通过一个简单的请求参数让主题在每个请求中发生变化。