Apache Tiles в Spring Framework 6

Куда делся Apache Tiles в Spring Framework 6? Проблема достаточно серьезна, так как многие проекты сильно завязались на нём. Сам проект Apache Tiles больше не разрабатывается, а на его странице висит плашка:

This project has retired. For details please refer to its Attic page.

Но что же делать, если ваш проект зависит от него? Вообще, сама технология Java Server Pages морально устарела, хотя она все ещё поддерживается, даже новые спецификации до сих пор выходят. Сам Spring Framework рекомендует использовать Thymeleaf или Freemarker. Для новых проектов так и следует поступить.

Однако что же делать с нашим старым проектом, который был построен на JSP, JSTL и Apache Tiles? Можно полностью переписать проект на Thymeleaf, например, но это трудоемко по времени. Мы можем пойти по более простому пути. Для перехода на Spring Framework 6 нам придётся избавиться от Apache Tiles, а вместо использовать custom-теги.

Свой custom-тег нам нужно создать в каталоге WEB-INF/tags. Например:

Это обычная JSPX-страница, в которую мы подключили страницы с заголовком (header.jspx), меню (menu.jspx) и подвалом (footer.jspx). А само тело страницы подключается с помощью тега jsp:doBody.

Сами меню, заголовок и подвал просто описывают небольшой кусок страницы. Например, меню:

Как видите, мы просто описали div, внутри которого две ссылки: на главную страницу и на вторую страницу. Аналогичным образом описываются подвал и заголовок.

Теги spring:message используются для локализованных сообщений, но вы можете вставлять текст прямо в JSPX-страницу, если хотите. Хотя я бы вам рекомендовал сразу использовать spring:message, если ваш проект подразумевает несколько языков.

Пример страницы, которая использует наш тег:

Здесь тоже ничего сверхъестественного. Мы просто с помощью custom, который мы подключили из «urn:jsptagdir:/WEB-INF/tags» указали тег defaultLayout, который создали ранее. Само содержимое представляет собой просто кусок JSPX, генерирующий HTML, который будет вставлен в doBody нашего custom-тега.

Исходный код работоспособного примера можете посмотреть на GitHub. Пример использует Maven, Spring Framework 6 с морально устаревшей XML-конфигурацией (но раз вы используете Java Server Pages, то это вас не должно пугать) и деплоится на Apache Tomcat 10.

В “web.xml” проекта в принципе всё вполне стандартно, мы просто объявляем DispatcherServlet из Spring Framework, указывая запросы какого пути он будет обрабатывать:

Тут даже объяснять особо нечего, любой проект на Spring Framework обычно примерно такой “web.xml” и содержал, а чаще даже сложнее.

Конфигурация контекста Spring в файле “servlet-context.xml”, по большому счёту тоже вполне стандартная.

Мы просто включаем Spring MVC, основанную на аннотациях @Controller:

Следующие два interceptor-а нужны для манипуляции с текущей локалью и различными темами оформления в страницах JSP и JSPX:

Обратите внимание, что в ThemeChangeInterceptor и в LocaleChangeInterceptor указываются свойства paramName. Для ThemeChangeInterceptor это theme, а для LocaleChangeInterceptor ставится locale. Это означает, что при обращении к страницам мы сможем в URL запроса указывать соответствующие параметры запроса ?theme=<название_темы>&locale=<локаль>, для того чтобы сменить тему и язык на необходимые нам.

Бин localeResolver нужен, чтобы выбранная пользователем тема сохранялась в куках, конкретно в нашем случае в куке locale, как указано в cookieName. Бин messageSource использует properties-файлы из “/WEB-INF/i18n/application” в качестве источников строк для разных языков. Обязательно нужно указать кодировку UTF-8, иначе все русские символы внутри properties-файлов придётся писать через код символа (например, \u00A9). По умолчанию локаль определяется по заголовкам в HTTP-запросе браузера и используются строки из файла с соответствующим суффиксом в имени (например, _ru), если файл с подходящей локалью не найден, то используются строки из файла без префикса, так как мы указали fallbackToSystemLocale=false.

Бин themeSource указывают, что темы будут браться из стандартного java.util.ResourceBundle. Обратите внимание на файлы в каталоге “WEB-INF/classes” нашего проекта, именно там и хранятся настройки для наших тем, а themeResolver сохраняет выбранную пользователем тему в куках браузера.

Дальше мы указываем пакеты, в которых находятся контроллеры для Spring MVC:

Но в нашем проекте их почти нет.

В этом простом примере нам не нужно особых обработок в контроллерах, поэтому мы просто создаём простые контроллеры, возвращающие необходимые нам JSPX-страницы ( path — обрабатывай путь, view-name — соответствующая страница:

Ну и стандартный InternalResourceViewResolver, который собственно и обрабатывает наши Java Server Pages:

В нем мы просто указали префикс и суффикс пути для наших JSPX-файлов внутри webapp.

Ну и, разумеется, нужно не забыть указать, чтобы файлы CSS-стилей, картинок и JavaScript-файлов просто возвращались пользователю без особой обработки, как и должны поступать ресурсы:

Исходный код на GitHub

Один комментарий к “Apache Tiles в Spring Framework 6”

  1. Знакомо…
    В рецепте зелья указан какой-нибудь коготь виверны, но они вымерли. Ладно коготь вымершего создания, а если сказано «капля крови» или «капля слюны»?
    Или указано «чешуя дракона», но когда писался рецепт, имелась в виду чешуя красного дракона, а вокруг лишь чёрные драконы, поэтому маги мучаются, что зелье работает не так, как описано в рецепте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *