Написание простых приложений на http4k #
Документация #
- Официальная документация на библиотеку http4k
- Простая маршрутизация с http4k
- Многострочные литералы в Kotlin
Задачи #
Скачайте архив, с исходным кодом проекта по ссылке. Данный проект основан на базовом шаблоне проекта, в который были внесены следующие изменения:
- Добавлены CSS-файлы Bootstrap.
- Добавлена раздача статических файлов из ресурсов проекта.
- При старте приложения показывается содержимое файла
index.html. - Из маршрутизатора http4k вынесены функции-генераторы обработчиков HTTP-запросов в пакет
ru.yarsu.web.handlers.
В рамках практики необходимо разработать веб-приложение, которое сможет демонстрировать информацию о списке треугольников на стартовой странице приложения.
На каждой странице сайта должна показываться навигационная панель, в которой есть ссылка на страницу со списком треугольников.
Ниже представлены шаги по решению данной задачи.
Описание модели данных для отображения #
Сформируйте классы для описания треугольника и списка треугольников. Данные классы опишут предметную область, для которой реализуется приложение.
- Создайте класс для хранения данных об отдельном треугольнике
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в файлеWebApplication.kt. При создании списка треугольников добавьте минимум три экземпляра классаTriangle.
Отображение списка треугольников #
Реализуйте отображение страницы, на которой будет отображён список треугольников, информацию о которых располагает веб-приложение. Для каждого треугольника на данной странице необходимо выводить только порядковый номер, площадь и ссылку на другую страницу с полной информацией о данном треугольнике. Можно использовать табличное или списочное представление.
Маршрут для отображения страницы — /triangle/.
Примерный план реализации:
- Создайте компонент для формирования HTML-документа со списком треугольников,
ru.yarsu.web.view.TrianglesListView. Данный компонент должен принимать в качестве входа ссылку на список треугольников,List<Triangle>. В качестве выхода должен формировать HTML-документ, содержащий список треугольников согласно заданию. Удобно использовать многострочные литералы. Пример такого компонента приведён ниже:class DataView() { fun showData(data: List<Int>): String = """ <!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Информация</title> <link href="css/bootstrap.min.css" rel="stylesheet"> </head> <body> <h1>Отображение данных:</h1> <p> ${data.joinToString(separator = "</p><p>", prefix = "<p>", postfix = "</p>")} </p> <script src="js/bootstrap.bundle.min.js"></script> </body> </html> """.trimIndent() } - Создайте класс HTTP-обработчика для отображения списка треугольников.
- Создайте класс
ru.yarsu.web.handlers.ListTrianglesHandler. - Конструктор класса должен принимать в качестве аргумента ссылку на объект класса
ru.yarsu.domain.Triangles. - Реализуйте функцию
invoke, логику по обработке HTTP-запроса. Внутри функции:- Получайте список треугольников из хранилища,
- Формируйте HTML-документ с помощью компонента по отображению треугольников.
- Возвращайте ответ (объект Response) с кодом OK и телом, содержащим HTML-документ.
- Создайте класс
- Модифицируйте функцию по созданию маршрутизатора (
router()в файлеWebApplication.ktтаким образом, чтобы она получала ссылку на объект классаtriangle: Triangles. Передайте данную ссылку внутри функцииmain. - Свяжите созданный обработчик запроса с маршрутом
/triangleвнутри функции по формированию маршрутизатораrouter(). Передайте данному обработчику необходимые данные для работы.
Перенаправление на страницу со списком треугольников #
Добавьте обработку корневого маршрута /. При обращении к нему клиент должен переходить на страницу с отображением списка треугольников.
Примерный план реализации:
- Создайте обработчик корневого маршрута, класс
ru.yarsu.web.handlers.RedirectToTriangleListHandler. - Конструктор класса не должен принимать никаких аргументов.
- Внутри обработчика запроса необходимо вернуть ответ со статусом
FOUND, с заголовкомLocationсо значением/triangle. Для установления значения заголовка используйте метод Response.header. - Свяжите данный обработчик с маршрутом
/и GET-запросом внутри функции по созданию маршрутиатораrouter(). - Убедитесь, что после открытия ссылки приложения, http://localhost:9000/, происходит переход к списку треугольников.