1. Введение
Thymeleaf — это механизм шаблонов, который мы можем использовать для наших приложений Spring Boot . Как и во многих других случаях, Spring Boot предоставляет место по умолчанию, где он ожидает найти наши шаблоны .
В этом коротком уроке мы рассмотрим, как мы можем изменить местоположение шаблона. После того, как мы это сделаем, мы узнаем, как иметь несколько местоположений.
2. Настройка
Чтобы использовать Thymeleaf, нам нужно добавить соответствующий стартер Spring Boot в наш pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<versionId>2.2.2.RELEASE</versionId>
</dependency>
3. Изменение местоположения по умолчанию
По умолчанию Spring Boot ищет наши шаблоны в src/main/resources/templates
. Мы можем поместить туда наши шаблоны и организовать их в подкаталогах без каких-либо проблем.
Теперь давайте представим, что у нас есть требование, чтобы все наши шаблоны находились в каталоге с именем templates-2
.
Давайте создадим шаблон для приветствия и поместим его в src/main/resources/templates-2
:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Enums in Thymeleaf</title>
</head>
<body>
<h2>Hello from 'templates/templates-2'</h2>
</body>
</html>
Также нам понадобится контроллер:
@GetMapping("/hello")
public String sayHello() {
return "hello";
}
После этой базовой настройки давайте настроим Spring Boot для использования нашего каталога templates-2
, переопределив свойство в application.properties
:
spring.thymeleaf.prefix=classpath:/templates-2/
Теперь, когда мы вызовем наш HelloController
, мы увидим наше приветствие из hello.html
.
4. Использование нескольких местоположений
Теперь, когда мы узнали, как изменить местоположение по умолчанию, давайте посмотрим, как мы можем использовать несколько местоположений шаблона.
Для этого создадим bean-компонент ClassLoaderTemplateResolver
:
@Bean
public ClassLoaderTemplateResolver secondaryTemplateResolver() {
ClassLoaderTemplateResolver secondaryTemplateResolver = new ClassLoaderTemplateResolver();
secondaryTemplateResolver.setPrefix("templates-2/");
secondaryTemplateResolver.setSuffix(".html");
secondaryTemplateResolver.setTemplateMode(TemplateMode.HTML);
secondaryTemplateResolver.setCharacterEncoding("UTF-8");
secondaryTemplateResolver.setOrder(1);
secondaryTemplateResolver.setCheckExistence(true);
return secondaryTemplateResolver;
}
В нашем пользовательском компоненте мы устанавливаем наш префикс для вторичного каталога шаблонов, который мы используем: templates-2.
Мы также устанавливаем флаг CheckExistance в значение
true
. Это ключ к тому, чтобы позволить преобразователям работать в цепочке.
При такой настройке наше приложение может использовать шаблоны из каталога main/resources/templates по умолчанию и main
/resources/templates-2
.
5. Ошибки
Когда мы работаем с Thymeleaf, мы можем увидеть эту ошибку:
Error resolving template [hello], template might not exist or might not be accessible
by any of the configured Template Resolvers
Мы видим это сообщение, когда Thymeleaf по какой-то причине не может найти шаблон. Давайте рассмотрим некоторые из возможных причин этого и способы их устранения.
5.1. Опечатка в контроллере
Мы часто можем видеть эту ошибку из-за простой опечатки. Первое, что нужно проверить, это то, что имя нашего файла без расширения и шаблон, который мы запрашиваем в нашем контроллере, точно совпадают. Если мы используем подкаталоги, мы также должны убедиться, что они правильные.
Кроме того, проблема может быть связана с некоторыми операционными системами. Windows не чувствительна к регистру, в отличие от других операционных систем. Мы должны изучить это, если все работает нормально, скажем, на нашем локальном компьютере с Windows, но не после развертывания.
5.2. Включение расширения файла в контроллер
Поскольку наши файлы обычно имеют расширение, может быть естественным включать их, когда мы возвращаем путь к нашему шаблону в контроллере. Thymeleaf автоматически добавляет суффикс, поэтому нам не следует его указывать .
5.3. Не использовать расположение по умолчанию
Мы также увидим эту ошибку, если мы разместили наши шаблоны где-то кроме src/main/resources/templates
. Если мы хотим использовать другое местоположение, нам нужно либо установить свойство spring.thymeleaf.prefix,
либо создать собственный bean-компонент ClassLoaderTemplateResolver
для обработки нескольких местоположений.
6. Заключение
В этом кратком руководстве мы узнали о расположении шаблонов Thymeleaf. Во-первых, мы увидели, как изменить местоположение по умолчанию, установив свойство. Затем мы использовали это, создав собственный ClassLoaderTemplateResolver
для использования нескольких местоположений.
Мы завершили обсуждение ошибки, которую мы увидим, когда Thymeleaf не сможет найти наши шаблоны, и способов ее решения.
Как всегда, пример кода можно найти на GitHub .