Автор оригинала: 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 ResponseEntity initialize() {
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){
List postList = 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.