Написание простых приложений на http4k #
Документация #
Задачи #
Скачайте архив, с исходным кодом проекта по ссылке. Данный проект основан на базовом шаблоне проекта, в который были внесены следующие изменения:
- Добавлены CSS-файлы Zurb Foundaiton.
- Добавлена базовая раскладка
layout.peb
, подключающая CSS-файлы Foundation. - Добавлена раздача статических файлов из каталога ресурсов проекта (решение не для продуктового использования).
- Из маршрутизатора http4k вынесены функции-генераторы обработчиков HTTP-запросов.
- Создание шаблонизатора перенесено в стартовую функцию
main
.
Проанализируйте как устроены функции-генераторы обработчиков HTTP-запросов.
Отображение информации о треугольнике #
Добавьте отображение информации о треугольнике (длины сторон, периметр, площадь) при переходе по маршруту /triangle/show
.
Примерный план реализации:
- Создайте модель
ru.yarsu.models.TriangleVM
с необходимыми данными для отображения. Все параметры модели — вещественные числа. - Унаследуйте созданный класс от
org.http4k.template.ViewModel
. - Создайте шаблон для отображения модели в файле
src/main/resources/ru/yarsu/models/TriangleVM.peb
. - Реализуйте отображение данных модели на странице. Рекомендуется использовать отдельные параграфы для каждого параметра.
- Добавьте обработчик для данного запроса.
- В файле
WebApplicaiton.kt
создайте функциюshowTriangle
. - Данная функция должна возвращать обработчик запроса,
HttpHandler
. Функция должна принимать в качестве аргумента шаблонизатор,renderer: TemplateRenderer
. - Внутри обработчика создайте экземпляр класса
TriangleVM
с заполненными данными. Длины сторон: 3.0, 4.0, 5.0. Периметр: 12.0. Площадь: 6.0. - Для формирования тела ответа используйте вызов шаблонизатора на экземпляре класса
TriangleVM
.
- В файле
- Свяжите обработчик запроса с маршрутом
/triangle/show
внутри функции по формированию маршрутизатораrouter
. Связывание производите для GET-запроса. - Перезапустите приложение.
- Откройте в браузере ссылку http://localhost:9000/triangle/show и убедитесь, что информация о треугольнике отображается на полученной странице.
Описание модели данных для отображения #
Сформируйте классы для описания треугольника и списка треугольников. Данные классы опишут предметную область, для которой реализуется приложение.
- Создайте класс для хранения данных об отдельном треугольнике
ru.yarsu.domain.Triangle
.- Данными класса являются неизменяемые длины сторон треугольника, вещественные числа, а также порядковый номер треугольника в списке, целое число.
- Класс должен предоставлять методы для вычисления свойств треугольника: периметра и площади.
- В качестве основы рекомендуется использовать класс данных, чтобы можно было воспользоваться функцией копирования.
- Создайте класс для хранения списка треугольников
ru.yarsu.domain.Triangles
.- Класс должен хранить изменяемый список треугольников
val triangles = mutableListOf<Trinagle>()
. Изначальное состояние может быть передано в конструктор класса. - Класс должен позволять добавлять треугольники в список
fun add(triangle: Triangle)
. При добавлении нового элемента класс должен проверять, что его порядковый номер уникален. Самый простой способ — при добавлении нового элемента устанавливать в качестве порядкового номера текущий размер количества элементов. - Класс должен позволять получать ссылку на последний треугольник в списке
fun fetchOne(): Triangle
. - Класс должен позволять получать список треугольников, отсортированный по увеличению порядкового номера:
fun fetchAllTriangles(): List<Triangle>
. - Класс должен предоставлять метод для получения треугольника по его порядковому номеру:
fun fetchTriangleByNumber(number: Int): Triangle
.
- Класс должен хранить изменяемый список треугольников
- Создайте экземпляр класса
ru.yarsu.domain.Triangles
внутри функцииmain
. При создании списка треугольников добавьте минимум три экземпляра классаTriangle
.
Отображение списка треугольников #
Добавьте страницу, на которой будет отображён список треугольников, информацию о которых располагает веб-приложение. Для каждого треугольника на данной странице необходимо выводить только порядковый номер, площадь и ссылку на другую страницу с полной информацией о данном треугольнике.
Маршрут для отображения списка/triangle/
. Маршрут для отображения элемента списка /triangle/{number}
, где number
— это порядковый номер в списке треугольников.
Примерный план реализации:
- Создайте модель для отображения списка треугольников,
ru.yarsu.models.TrianlesListVM
. Данная модель должна содержать ссылку на список по элементам массиваtriangles: List<Triangle>
. - Создайте Pebble-шаблон для отображения модели в файле
src/main/resources/ru/yarsu/models/TrianlesListVM.peb
. Для каждого треугольника отобразите его порядковый номер, периметр и ссылку на страницу с детальной информацией. Можно воспользоваться либо таблицей, либо списком из карточек. - Создайте функцию по созданию обработчика для отображения списка треугольников.
- В файле
WebApplication.kt
создайте функциюshowTriangeList
. - Данная функция должна возвращать обработчик HTTP-запроса,
HttpHandler
. Функция должна принимать в качестве аргумента шаблонизатор,renderer
, и ссылку на объект классаTriangles
. - Внутри обработчика создайте экземпляр класса
TrianlesListVM
, передав ей необходимые параметры. - Для формирования тела ответа используйте вызов шаблонизатора на экземпляре класса
TrianglesListVM
.
- В файле
- Модифицируйте функцию по созданию маршрутизатора таким образом, чтобы она получала ссылку на объект класса
triangle: Triangles
. Передайте данную ссылку внутри функцииmain
. - Свяжите созданный обработчик запроса с маршрутом
/triangle
внутри функции по формированию маршрутизатораrouter
. Передайте данному обработчику необходимые данные для работы. - Создайте модель для отображения конкретного треугольника,
ru.yarsu.models.TriangleVM
. Данная модель должна содержать ссылку на объект типаTriangle
. - Создайте Pebble-шаблон для отображения детальной информации о треугольнике: длин сторон, периметра и площади. На странице также должна быть ссылка на страницу со списком треугольников.
- Создайте функцию по созданию обработчика для отображения детальной информации о треугольнике.
- В файле
WebApplication.kt
создайте функциюshowTriangle
. - Данная функция должна возвращать обработчик HTTP-запроса,
HttpHandler
. Функция должна принимать в качестве аргумента шаблонизатор,renderer
, и ссылку на объект классаTriangles
. - Внутри HTTP-обработчика необходимо получить номер треугольника из переменной запроса
number
. Для извлечения значения данной переменной из пути используйте функциюRequest.path
. - Преобразуйте полученную строку к числу с использованием функции
toInt()
. На настоящий момент будем подразумевать, что передаваемые данные корректны. - Получите экземпляр класса
Triangle
от объектаTriangles
по переданному порядковому номеру. Используйте соответствующий метод классаTriangles
. - Используйте полученную ссылку для заполнения модели
TriangleVM
. Используйте шаблонизатор и созданную модель для формирования тела ответа.
- В файле
- Свяжите созданный HTTP-обработчик с маршрутом
/triangle/{number}
внутри функции по формированию маршрутизатора,router
. Передайте функции по созданию обработчику ссылки на объектTriangles
и Pebble-шаблонизатора.
Перенаправление на страницу со списком треугольников #
Добавьте обработку корневого маршрута /
. При обращении к нему клиент должен переходить на страницу с отображением списка треугольников.
Примерный план реализации:
- Создайте обработчик корневого маршрута, функцию
redirectToTriangleList
в файлеWebApplication.kt
. - Данная функция должна возвращать обработчик запроса,
HttpHandler
. Функция не принимает никаких аргументов. - Внутри обработчика запроса необходимо вернуть ответ со статусом
FOUND
и заголовкомLocation
со значением/triangle
. - Свяжите данный обработчик с маршрутом
/
и GET-запросом внутри функции по созданию маршрутиатораrouter
. - Убедитесь, что после открытия ссылки приложения, http://localhost:9000/, происходит переход к списку треугольников.
Обработка ошибочного параметра #
Доработайте обработчик маршрута /triangle/{number}
таким образом, чтобы приложение вело себя корректно в следующих ситуациях:
- Переданный аргумент не содержит целого числа.
- Передан некорректный номер треугольника в списке.
В данных случаях приложение должно сообщать пользователю о неправильных параметрах.