1. Введение
В этом руководстве мы поговорим о различных способах доступа к данным Spring MVC с помощью Thymeleaf.
Мы начнем с создания шаблона электронной почты с помощью Thymeleaf и усовершенствуем его данными из нашего приложения Spring.
2. Настройка проекта
Во-первых, нам нужно добавить нашу зависимость Thymeleaf :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.6.1</version>
</dependency>
Во-вторых, давайте включим веб-стартер
Spring Boot `` :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.1</version>
</dependency>
Эта зависимость предоставляет нам поддержку REST, которую мы позже будем использовать для создания некоторых конечных точек.
Мы создадим несколько шаблонов Thymeleaf для наших примеров и сохраним их в resources/mvcdata
. В каждом разделе руководства будет реализован отдельный шаблон:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<!-- data -->
</html>
Наконец, нам нужно реализовать класс контроллера, в котором мы будем хранить нашу бизнес-логику:
@Controller
public class EmailController {
private ServletContext servletContext;
public EmailController(ServletContext servletContext) {
this.servletContext = servletContext;
}
}
Наш класс контроллера не всегда будет зависеть от контекста сервлета, но мы добавляем его сюда, чтобы позже продемонстрировать определенную функцию Thymeleaf.
3. Атрибуты модели
Атрибуты модели используются внутри классов контроллеров, которые подготавливают данные для рендеринга внутри представления .
Один из способов добавить атрибуты в нашу модель — потребовать экземпляр модели
в качестве параметра в методе контроллера.
Давайте передадим наши emailData
в качестве атрибута:
@GetMapping(value = "/email/modelattributes")
public String emailModel(Model model) {
model.addAttribute("emailData", emailData);
return "mvcdata/email-model-attributes";
}
Затем Spring вставит экземпляр модели
для нас, когда будет запрошен /email/modelattributes
.
Затем мы можем обратиться к нашему атрибуту модели emailData в выражении Thymeleaf :
<p th:text="${emailData.emailSubject}">Subject</p>
Другой способ сделать это — сообщить нашему контейнеру Spring, какой атрибут требуется в нашем представлении, с помощью @ModelAttribute
:
@ModelAttribute("emailModelAttribute")
EmailData emailModelAttribute() {
return emailData;
}
И тогда мы можем представить данные в нашем представлении как:
<p th:each="emailAddress : ${emailModelAttribute.getEmailAddresses()}">
<span th:text="${emailAddress}"></span>
</p>
Дополнительные примеры данных модели см. в нашем руководстве Model, ModelMap и ModelView in Spring MVC .
4. Параметры запроса
Другой способ доступа к данным — по параметрам запроса:
@GetMapping(value = "/email/requestparameters")
public String emailRequestParameters(
@RequestParam(value = "emailsubject") String emailSubject) {
return "mvcdata/email-request-parameters";
}
Между тем, в нашем шаблоне нам нужно указать , какой параметр содержит данные , используя ключевое слово param
:
<p th:text="${param.emailsubject}"></p>
У нас также может быть несколько параметров запроса с одинаковым именем:
@GetMapping(value = "/email/requestparameters")
public String emailRequestParameters(
@RequestParam(value = "emailsubject") String emailSubject,
@RequestParam(value = "emailaddress") String emailAddress1,
@RequestParam(value = "emailaddress") String emailAddress2) {
return "mvcdata/email-request-parameters";
}
Затем у нас будет два варианта отображения данных.
Во- первых, мы можем использовать th:each
для просмотра каждого параметра с одинаковым именем:
<p th:each="emailaddress : ${param.emailaddress}">
<span th:text="${emailaddress}"></span>
</p>
Во-вторых, мы можем использовать индекс нашего массива параметров:
<p th:text="${param.emailaddress[0]}"></p>
<p th:text="${param.emailaddress[1]}"></p>
5. Атрибуты сеанса
Или мы можем поместить наши данные в атрибут HttpSession :
@GetMapping("/email/sessionattributes")
public String emailSessionAttributes(HttpSession httpSession) {
httpSession.setAttribute("emaildata", emailData);
return "mvcdata/email-session-attributes";
}
Затем, аналогично параметрам запроса, мы можем использовать ключевое слово session
:
<p th:text="${session.emaildata.emailSubject}"></p>
6. Атрибуты контекста сервлета
С ServletContext
мы не сможем использовать выражение для доступа к свойствам emailData
.
Чтобы обойти это, мы будем передавать каждое значение как отдельный атрибут:
@GetMapping("/email/servletcontext")
public String emailServletContext() {
servletContext.setAttribute("emailsubject", emailData.getEmailSubject());
servletContext.setAttribute("emailcontent", emailData.getEmailBody());
servletContext.setAttribute("emailaddress", emailData.getEmailAddress1());
servletContext.setAttribute("emaillocale", emailData.getEmailLocale());
return "mvcdata/email-servlet-context";
}
И затем мы можем получить каждый через переменную servletContext
:
<p th:text="${#servletContext.getAttribute('emailsubject')}"></p>
7. Фасоль
Наконец, мы также можем предоставлять данные с помощью контекстных компонентов:
@Bean
public EmailData emailData() {
return new EmailData();
}
Thymeleaf разрешает доступ к компонентам с использованием синтаксиса @beanName
:
<p th:text="${@emailData.emailSubject}"></p>
8. Заключение
В этом небольшом руководстве мы узнали, как получить доступ к данным через Thymeleaf.
Во-первых, мы добавили правильные зависимости. А во-вторых, мы реализовали несколько методов REST, чтобы мы могли передавать данные в наш шаблон.
Как всегда, код доступен на GitHub .