Вы можете применять темы фреймворка Spring Web MVC для создания общего внешнего вида вашего приложения, тем самым повышая удобство работы с ним. Тема – это коллекция статических ресурсов, обычно таблиц стилей и изображений, которые влияют на визуальный стиль приложения.

Определение темы

Чтобы использовать темы в вашем веб-приложении, нужно настроить реализацию интерфейса org.springframework.ui.context.ThemeSource. Интерфейс WebApplicationContext расширяет ThemeSource, но делегирует свои обязанности назначенной реализации. По умолчанию делегат представляет собой реализацию org.springframework.ui.context.support.ResourceBundleThemeSource, которая загружает файлы свойств из корня classpath. Чтобы использовать пользовательскую реализацию ThemeSource или сконфигурировать префикс базового имени ResourceBundleThemeSource, можно зарегистрировать бин в контексте приложения под зарезервированным именем themeSource. Контекст веб-приложения автоматически обнаруживает бин с таким именем и использует его.

Если вы используете 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 использует пустой префикс базового имени. В результате файлы свойств загружаются из корня classpath. Таким образом, вы поместите определение темы cool.properties в каталог в корне classpath (например, в /WEB-INF/classes). ResourceBundleThemeSource использует стандартный механизм загрузки ресурсных локализационных пакетов Java, что позволяет полностью интернационализировать темы. Например, у нас может быть файл /WEB-INF/classes/cool_nl.properties, который ссылается на специальное фоновое изображение с голландским текстом на нем.

Распознавание тем

После определения тем, как описано в предыдущем разделе, вы решаете, какую тему использовать. DispatcherServlet ищет бин с именем themeResolver, чтобы узнать, какую реализацию ThemeResolver использовать. Распознаватель тем работает примерно так же, как и LocaleResolver. Он определяет тему, которую следует использовать для конкретного запроса, а также может изменять запрашиваемую тему. В следующей таблице описаны распознаватели тем, содержащиеся в Spring:

Таблица 5. Реализации ThemeResolver
Класс Описание

FixedThemeResolver

Выбирает фиксированную тему, установленную с помощью свойства defaultThemeName.

SessionThemeResolver

Тема сохраняется в HTTP-сессии пользователя. Его нужно настраивать лишь единожды для каждой сессии, но он не сохраняется между сессиями.

CookieThemeResolver

Выбранная тема хранится в cookie на стороне клиента.

Spring также предоставляет ThemeChangeInterceptor, который позволяет изменять тему при каждом запросе с помощью простого параметра запроса.