Написание простых приложений на 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} таким образом, чтобы приложение вело себя корректно в следующих ситуациях:
- Переданный аргумент не содержит целого числа.
- Передан некорректный номер треугольника в списке.
В данных случаях приложение должно сообщать пользователю о неправильных параметрах.