跳到主要内容

主题

ChatGPT-4o-mini 中英对照 Themes

您可以应用 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>
xml

默认情况下,ResourceBundleThemeSource 使用一个空的基本名称前缀。因此,属性文件是从类路径的根目录加载的。因此,您应该将 cool.properties 主题定义放在类路径根目录的一个目录中(例如,在 /WEB-INF/classes 中)。ResourceBundleThemeSource 使用标准的 Java 资源包加载机制,允许对主题进行完全国际化。例如,我们可以有一个 /WEB-INF/classes/cool_nl.properties,它引用了带有荷兰文本的特殊背景图像。

解决主题

在您定义主题后,如前一部分所述,您需要决定使用哪个主题。DispatcherServlet 查找名为 themeResolver 的 bean,以确定使用哪个 ThemeResolver 实现。主题解析器的工作方式与 LocaleResolver 非常相似。它检测特定请求所使用的主题,并且还可以更改请求的主题。以下表格描述了 Spring 提供的主题解析器:

表 1. ThemeResolver 实现

描述
FixedThemeResolver选择一个固定主题,通过使用 defaultThemeName 属性设置。
SessionThemeResolver主题保存在用户的 HTTP 会话中。每个会话只需要设置一次,但在会话之间不会被持久化。
CookieThemeResolver选定的主题存储在客户端的 cookie 中。

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