Рубрики
Без рубрики

Переменные пути Thymeleaf с пружинной загрузкой

В этом руководстве мы рассмотрим, как использовать переменные пути в контроллерах Spring Boot, а также как создавать ссылки с переменными пути с помощью Thymeleaf.

Автор оригинала: 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.