Написание простых приложений на 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/, происходит переход к списку треугольников.