Написание простых приложений на http4k

Написание простых приложений на http4k #

Документация #

Задачи #

Скачайте архив, с исходным кодом проекта по ссылке. Данный проект основан на базовом шаблоне проекта, в который были внесены следующие изменения:

  • Добавлены CSS-файлы Bootstrap.
  • Добавлена раздача статических файлов из ресурсов проекта.
  • При старте приложения показывается содержимое файла index.html.
  • Из маршрутизатора http4k вынесены функции-генераторы обработчиков HTTP-запросов в пакет ru.yarsu.web.handlers.

В рамках практики необходимо разработать веб-приложение, которое сможет демонстрировать информацию о списке треугольников на стартовой странице приложения.

На каждой странице сайта должна показываться навигационная панель, в которой есть ссылка на страницу со списком треугольников.

Ниже представлены шаги по решению данной задачи.

Описание модели данных для отображения #

Сформируйте классы для описания треугольника и списка треугольников. Данные классы опишут предметную область, для которой реализуется приложение.

  1. Создайте класс для хранения данных об отдельном треугольнике ru.yarsu.domain.Triangle.
    1. Данными класса являются неизменяемые длины сторон треугольника, вещественные числа, а также порядковый номер треугольника в списке, целое число.
    2. Класс должен предоставлять методы для вычисления свойств треугольника: периметра и площади.
    3. В качестве основы рекомендуется использовать класс данных, чтобы можно было воспользоваться функцией копирования.
  2. Создайте класс для хранения списка треугольников ru.yarsu.domain.Triangles.
    1. Класс должен хранить изменяемый список треугольников val triangles = mutableListOf<Trinagle>(). Изначальное состояние списка треугольников может быть передано в конструктор класса.
    2. Класс должен позволять добавлять треугольники в список fun add(triangle: Triangle). При добавлении нового элемента класс должен проверять, что его порядковый номер уникален. Самый простой способ — при добавлении нового элемента устанавливать в качестве порядкового номера текущий размер количества элементов.
    3. Класс должен позволять получать ссылку на последний треугольник в списке fun fetchOne(): Triangle.
    4. Класс должен позволять получать список треугольников, отсортированный по увеличению порядкового номера: fun fetchAllTriangles(): List<Triangle>.
    5. Класс должен предоставлять метод для получения треугольника по его порядковому внутреннему номеру: fun fetchTriangleByNumber(number: Int): Triangle?.
  3. Создайте экземпляр класса ru.yarsu.domain.Triangles внутри функции main в файле WebApplication.kt. При создании списка треугольников добавьте минимум три экземпляра класса Triangle.

Отображение списка треугольников #

Реализуйте отображение страницы, на которой будет отображён список треугольников, информацию о которых располагает веб-приложение. Для каждого треугольника на данной странице необходимо выводить только порядковый номер, площадь и ссылку на другую страницу с полной информацией о данном треугольнике. Можно использовать табличное или списочное представление.

Маршрут для отображения страницы — /triangle/.

Примерный план реализации:

  1. Создайте компонент для формирования 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()
    }
  2. Создайте класс HTTP-обработчика для отображения списка треугольников.
    1. Создайте класс ru.yarsu.web.handlers.ListTrianglesHandler.
    2. Конструктор класса должен принимать в качестве аргумента ссылку на объект класса ru.yarsu.domain.Triangles.
    3. Реализуйте функцию invoke, логику по обработке HTTP-запроса. Внутри функции:
      1. Получайте список треугольников из хранилища,
      2. Формируйте HTML-документ с помощью компонента по отображению треугольников.
      3. Возвращайте ответ (объект Response) с кодом OK и телом, содержащим HTML-документ.
  3. Модифицируйте функцию по созданию маршрутизатора (router() в файле WebApplication.kt таким образом, чтобы она получала ссылку на объект класса triangle: Triangles. Передайте данную ссылку внутри функции main.
  4. Свяжите созданный обработчик запроса с маршрутом /triangle внутри функции по формированию маршрутизатора router(). Передайте данному обработчику необходимые данные для работы.

Перенаправление на страницу со списком треугольников #

Добавьте обработку корневого маршрута /. При обращении к нему клиент должен переходить на страницу с отображением списка треугольников.

Примерный план реализации:

  1. Создайте обработчик корневого маршрута, класс ru.yarsu.web.handlers.RedirectToTriangleListHandler.
  2. Конструктор класса не должен принимать никаких аргументов.
  3. Внутри обработчика запроса необходимо вернуть ответ со статусом FOUND, с заголовком Location со значением /triangle. Для установления значения заголовка используйте метод Response.header.
  4. Свяжите данный обработчик с маршрутом / и GET-запросом внутри функции по созданию маршрутиатора router().
  5. Убедитесь, что после открытия ссылки приложения, http://localhost:9000/, происходит переход к списку треугольников.

© A. M. Васильев, 2023, CC BY-SA 4.0, andrey@crafted.su