Этот урок описывает создание динамической страницы для вывода каждой отдельной статьи на сайте. Ранее для каждой статьи была добавлена ссылка «Детальнее», ведущая на отдельную страницу (например, /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 должен перенаправлять на главную страницу.
В этом уроке мы создали динамические страницы для отображения отдельных статей. В следующем уроке будет реализовано редактирование и удаление записей.