主题

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

从 6.0 开始,对主题的支持已被弃用,转而使用 CSS,并且在服务器端没有任何特殊支持。

定义主题

要在 Web 应用程序中使用主题,您必须设置 infra.ui.context.ThemeSource 接口的实现。 WebApplicationContext 接口扩展了 ThemeSource,但将其职责委托给专用实现。 默认情况下,委托是 infra.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,它引用带有荷兰语文本的特殊背景图像。

解析主题

在定义主题后(如 上一节 所述), 您决定使用哪个主题。MockDispatcherHandler 寻找名为 themeResolver 的 bean,以找出要使用的 ThemeResolver 实现。 主题解析器的工作方式与 LocaleResolver 非常相似。它检测用于特定请求的主题,也可以更改请求的主题。 下表描述了 Infra 提供的主题解析器:

Table 1. ThemeResolver 实现
描述

FixedThemeResolver

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

SessionThemeResolver

主题维护在用户的 HTTP 会话中。它只需要为每个会话设置一次,但不会在会话之间持久化。

CookieThemeResolver

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

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