Автор оригинала: Guest Contributor.
Вступление
Thymeleaf -это механизм создания шаблонов (рендеринга на стороне сервера), используемый многими разработчиками программного обеспечения Java в веб-приложениях на основе Spring. Важной особенностью любого веб-приложения является поддержка динамических URL-адресов и переменных пути внутри этих URL-адресов.
Большинство API-интерфейсов REST широко используют переменные пути для указания идентификаторов элементов, с которыми они выполняют операции. Например, типичным примером может быть:
https://www.somewebsite.com/viewPost/path-variables-with-spring-boot # OR https://www.somewebsite.com/viewProduct/5
В обоих этих случаях мы пытаемся найти ресурс , обозначенный определенным идентификатором. В первом случае мы идентифицируем ресурс по его названию – переменным пути-с-пружинной загрузкой
, в то время как во втором мы идентифицируем его с помощью счетчика инкрементных идентификаторов – 5
.
Примечание: При использовании предсказуемых переменных пути, таких как инкрементный счетчик, остерегайтесь проблем безопасности. Прежде всего – это легко удаляемые, но самое главное, что без надлежащей проверки – кто-то может понять, что /deleteProduct/5
удаляет записи из базы данных и решает удалить большинство объектов, хранящихся в ней.
В этом руководстве мы рассмотрим, как использовать Thymeleaf для извлечения переменных пути и как использовать контроллеры загрузки Spring для их обработки.
На протяжении всего руководства мы будем использовать модель Post
, которая представляет собой сообщение в блоге, в котором есть только идентификатор и некоторый контент
:
public class Post { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "post_sequence") private Long id; private String content; // Constructors, Getters, Setters, and toString }
Поскольку мы используем Spring Boot – давайте также загрузим PostRepository
на основе JpaRepository
, что позволяет нам выполнять операции CRUD из коробки:
@Repository public interface PostRepository extends JpaRepository{}
Переменные пути Thymeleaf с пружинной загрузкой
Некоторые URL – адреса являются динамическими, а именно, учитывая тот факт, что мы можем создавать, читать, обновлять и удалять ваши публикации
сущности, мы захотим иметь динамические URL-адреса для запросов GET
, UPDATE
и DELETE
.
Давайте начнем наш проект с нескольких искусственных постов:
@GetMapping("/initialize") public ResponseEntityinitialize() { Post post1 = new Post("Content of post 1"); Post post2 = new Post("Content of post 2"); Post post3 = new Post("Content of post 3"); postRepository.saveAll(List.of(post1, post2, post3)); return ResponseEntity.ok("Initialized posts"); }
Как только мы достигнем нашей конечной точки /инициализации
, три сообщения будут сгенерированы и сохранены в базе данных. Теперь давайте определим статический URL-адрес для пользователя, чтобы получать все сообщения:
@GetMapping("/viewPosts") public String viewAllPostsAndComments(Model model){ ListpostList = postRepository.findAll(); model.addAttribute("postList", postList); return "all-posts"; }
Это статический URL – адрес и обработчик-нет никаких переменных пути или параметров, которые могли бы позволить пользователю влиять на то, какие сообщения извлекаются. Обычно это то, что вам нужно, если вы хотите, чтобы пользователь выбирал , где он хотел бы перемещаться. После выбора они могут просмотреть подробный список для любого поста, просто нажав на него и перейдя на его страницу.
Поскольку было бы непрактично (и неосуществимо) создавать обработчик запросов для каждой записи, мы можем создать динамический обработчик, который принимает любой идентификатор записи, находит запись в базе данных и возвращает ее:
@GetMapping("/viewPost/{postId}") public String viewPost(@PathVariable("postId") Long postId, Model model) { Post post = postRepository.findById(postId).get(); model.addAttribute("post", post); return "view-post"; }
Здесь мы определили @GetMapping
для URL /viewPost/{postID}
. Опубликовано
заключено в фигурные скобки-это динамическая переменная, которой может быть присвоено любое значение и/или тип. В подписи нашего метода мы использовали аннотацию @PathVariable
, установив имя переменной path и присвоив ей тип, на который мы можем ссылаться – Длинный постИд
.
Примечание: Имя переменной пути в аннотации @GetMapping
должно совпадать с именем, которое мы определили в аннотации @PathVariable
. Вы можете использовать в URL-адресе столько переменных пути, сколько захотите, и сопоставлять их по именам.
Как только запрос GET
запускается, скажем, на /viewPost/5
конечной точке – postID
неявно преобразуется в Длинный
, и мы можем использовать его для поиска сообщения по его идентификатору в базе данных. Однако, если мы передадим другой тип, такой как Строка
– /просмотр сообщения/некоторого сообщения
, этот контроллер выдаст исключение:
java.lang.NumberFormatException: For input string: "some-post"
Поскольку у нас есть контроллеры для обработки как запроса на просмотр всех сообщений, так и для просмотра одного, давайте быстро напишем страницы Thymeleaf, которые позволят нам перейти к этим обработчикам запросов. Давайте сначала начнем со страницы, на которой перечислены все сообщения и которая позволяет пользователю переходить к различным обработчикам запросов контроллера:
Здесь мы повторили каждое сообщение в списке сообщений
(список сообщений, которые мы добавили в Модель
экземпляр), и для каждого из них добавили кнопку, позволяющую пользователю просматривать сообщение. Атрибут href
ссылки приводит нас к:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
th:href="@{/viewPost/{id}(id = ${post.id})}
Это стандартный синтаксис URL для добавления параметров в Thymeleaf. Стандартное выражение @ {}
, используемое для ссылок также , принимает переменные пути. {id}
– это переменная пути, которую мы можем задать извне. Здесь мы указали на post.id
. После визуализации на стороне сервера это выражение оценивается как:
Нажатие этой кнопки вызовет /viewPost/{postID}
конечную точку, значение postID
будет преобразовано в 1
и PostRepository
получит сообщение с идентификатором
1
, возвращая его в view-post
Представление Thymeleaf:
Вывод
Переменные пути являются общей и ключевой особенностью API-интерфейсов REST. В этом руководстве мы рассмотрели, как использовать переменные пути в Spring Boot с Thymeleaf.