Spring Boot: Динамическая страница статьи

Этот урок описывает создание динамической страницы для вывода каждой отдельной статьи на сайте. Ранее для каждой статьи была добавлена ссылка «Детальнее», ведущая на отдельную страницу (например, /blog/1, /blog/2, где число — уникальный идентификатор записи). Теперь необходимо создать шаблон, обрабатывающий эти страницы, динамически подставляя ID статьи и выводя соответствующую запись.

Улучшение ссылок

Для улучшения внешнего вида ссылок «Детальнее» добавим классы Bootstrap: btn btn-warning. Более точный выбор стилей будет осуществлен после тестирования.

Обработчик URL

В контроллере (BlogController) создадим новый обработчик для URL-адресов вида /blog/{id}. Скопируем существующий GetMapping метод и модифицируем его.

Нам необходимо отслеживать URL-адреса с динамическим параметром ID. Для этого используем фигурные скобки {} и имя параметра, например, id. Имя параметра может быть любым, но должно совпадать в аннотации и переменной. Функция будет переименована в blogDetails.

@GetMapping("/blog/{id}")
public String blogDetails(Model model, @PathVariable("id") Long id) {
    // ...
}

В этом коде:

  • @GetMapping("/blog/{id}") — аннотация, указывающая на обработку GET-запросов по адресу /blog/{id}.
  • @PathVariable("id") Long id — аннотация, извлекающая значение параметра id из URL и преобразующая его в тип Long.

Получение данных

Получим статью из базы данных по её ID с помощью репозитория PostRepository и метода findById():

Post post = postRepository.findById(id).orElse(null);

Передадим запись в шаблон через объект модели. Вместо передачи объекта Post напрямую, преобразуем его в ArrayList:

ArrayList<Post> result = new ArrayList<>();
result.add(post);
model.addAttribute("post", result);

Шаблон blogDetails.html

Создадим шаблон blogDetails.html, скопировав содержимое шаблона blog.html. В этом шаблоне будем перебирать объект post и выводить полный текст статьи (fullText) и количество просмотров (views). Также добавим кнопки «Редактировать» и «Удалить» со ссылками вида /blog/{id}/edit и /blog/{id}/remove. Реализация этих ссылок будет рассмотрена в следующем уроке.

Обработка несуществующих записей

Добавим проверку существования записи с помощью метода existsById() из репозитория:

if (!postRepository.existsById(id)) {
    return "redirect:/blog"; // Перенаправление на главную страницу
}

Тестирование

Запустим сервер и проверим работу сайта. Переход по ссылкам на статьи должен отображать соответствующий контент. Переход по несуществующему ID должен перенаправлять на главную страницу.

В этом уроке мы создали динамические страницы для отображения отдельных статей. В следующем уроке будет реализовано редактирование и удаление записей.

Что будем искать? Например,программа