Skip to content

tsnsoft/TSN_SpringBoot_demo

Repository files navigation

TSN_SpringBoot_demo

Пример технологии Spring Boot на Java в NetBeans

1. Обзор программы

Программа состоит из двух частей:

  • Сервер (TSN_TodoApp): REST API на Spring Boot для управления списком задач (To-Do List). Задачи хранятся в памяти (без базы данных). API позволяет создавать, читать, обновлять и удалять задачи через HTTP-запросы.
  • Клиент (TodoClient): Консольное Java-приложение, которое вызывает API через HTTP-запросы. Оно предоставляет меню для взаимодействия с задачами: просмотр списка, создание, обновление и удаление.

Программа демонстрирует клиент-серверную архитектуру: клиент отправляет запросы на сервер, сервер обрабатывает их и возвращает ответы. Данные передаются в формате JSON.

Ключевые технологии:

  • Java 17.
  • Spring Boot (для сервера).
  • java.net.http.HttpClient (для клиента, стандартная библиотека Java).
  • org.json (для парсинга JSON в клиенте).

Ограничения:

  • Задачи хранятся в памяти сервера, поэтому теряются при перезапуске.
  • Нет валидации данных (например, пустое описание задачи).
  • Клиент — консольный, без GUI.

2. Компоненты сервера (TSN_TodoApp)

Сервер — это Spring Boot приложение, которое запускает веб-сервер Tomcat на порту 8080 и предоставляет REST API по пути /api/tasks. Вот описание ключевых классов:

2.1. Task.java

  • Назначение: Модель данных для задачи.
  • Поля:
    • id (Long): Уникальный идентификатор задачи (генерируется сервером).
    • description (String): Описание задачи.
    • completed (boolean): Статус выполнения (true — выполнена, false — нет).
  • Методы:
    • Геттеры и сеттеры для каждого поля.
    • Конструкторы: пустой (для десериализации JSON) и с параметрами (для создания задачи с описанием и статусом).
  • Как работает: Этот класс используется для представления задач в JSON-формате при обмене данными между клиентом и сервером.

2.2. TaskService.java

  • Назначение: Бизнес-логика для работы с задачами (CRUD-операции).
  • Аннотации: @Service — делает класс компонентом Spring для внедрения зависимостей.
  • Поля:
    • tasks (List): Список задач в памяти.
    • counter (AtomicLong): Счётчик для генерации ID.
  • Методы:
    • getAllTasks(): Возвращает все задачи.
    • getTaskById(Long id): Ищет задачу по ID (через цикл).
    • createTask(Task task): Генерирует ID, добавляет задачу в список и возвращает её.
    • updateTask(Long id, Task updatedTask): Обновляет описание и статус задачи по ID (если найдена).
    • deleteTask(Long id): Удаляет задачу по ID (возвращает true/false).
  • Как работает: Сервис управляет данными в памяти. Нет базы данных, поэтому данные временные.

2.3. TaskController.java

  • Назначение: Обработка HTTP-запросов (REST-контроллер).
  • Аннотации:
    • @RestController: Указывает, что класс возвращает JSON.
    • @RequestMapping("/api/tasks"): Базовый путь для API.
    • @Autowired: Внедряет TaskService.
  • Методы:
    • getAllTasks() (@GetMapping): Возвращает список задач (HTTP 200).
    • getTaskById(Long id) (@GetMapping("/{id}"): Возвращает задачу по ID или 404.
    • createTask(Task task) (@PostMapping): Создаёт задачу и возвращает её (HTTP 200).
    • updateTask(Long id, Task task) (@PutMapping("/{id}"): Обновляет задачу или возвращает 404.
    • deleteTask(Long id) (@DeleteMapping("/{id}"): Удаляет задачу (HTTP 204 или 404).
  • Как работает: Контроллер получает запросы, вызывает сервис и возвращает ответы в JSON. Использует ResponseEntity для управления HTTP-статусами.

2.4. CorsConfig.java

  • Назначение: Разрешение CORS для кросс-доменных запросов (например, от клиента).
  • Аннотации: @Configuration: Делает класс конфигурацией Spring.
  • Метод: addCorsMappings(CorsRegistry registry): Разрешает запросы с любого источника (allowedOrigins("*")) для методов GET, POST и т.д.
  • Как работает: Без этого класса браузер или клиент может блокировать запросы из-за политики безопасности. Это критично для веб-клиентов (HTML/JS), но для консольного Java-клиента не обязательно.

2.5. TSN_TodoApp.java

  • Назначение: Главный класс для запуска сервера.
  • Аннотации: @SpringBootApplication: Автоматическая настройка Spring (сканирование компонентов, конфигурация).
  • Метод: main(String[] args): Запускает Spring Boot приложение.
  • Как работает: При запуске Spring сканирует пакеты, находит контроллер и сервис, и запускает сервер на порту 8080.

3. Компоненты клиента (TodoClient.java)

Клиент — консольное приложение, которое отправляет HTTP-запросы к серверу.

  • Поля:
    • API_URL: Базовый URL API.
    • client: HTTP-клиент для запросов.
  • Метод main:
    • Отображает меню (1–5).
    • Обрабатывает выбор пользователя через switch.
    • Вызывает методы для операций.
  • Методы:
    • getAllTasks(): GET-запрос для получения задач. Парсит JSON с помощью org.json, выводит в формате "ID: X, Описание: Y, Выполнена: Z".
    • createTask(Scanner scanner): POST-запрос для создания задачи (формирует JSON, отправляет).
    • updateTask(Scanner scanner): PUT-запрос для обновления (формирует JSON с новыми данными).
    • deleteTask(Scanner scanner): DELETE-запрос для удаления.
  • Как работает: Использует HttpClient для отправки запросов. Ответы парсятся (для GET) или проверяются по статусу.

4. Как запустить программу

4.1. Запуск сервера (TSN_TodoApp)

  1. Убедитесь, что JDK 17 установлен (JAVA_HOME=C:\Program Files\Java\jdk-17).
  2. Перейдите в папку проекта:
    cd D:\Projects\Java\NetBeans\TSN_TodoApp
    
  3. Скомпилируйте и запустите:
    mvn clean install
    mvn spring-boot:run
  4. Сервер запустится на http://localhost:8080. Проверьте в браузере http://localhost:8080/api/tasks (должен вернуть []).

4.2. Запуск клиента (TodoClient)

  1. Добавьте зависимость org.json в pom.xml клиента (если используете Maven):
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20231013</version>
    </dependency>
  2. Перейдите в папку клиента:
    cd D:\Projects\Java\NetBeans\TodoClient
  3. Скомпилируйте и запустите:
    mvn clean compile
    mvn exec:java -Dexec.mainClass="kz.proffix4.tsn_todoapp_client.TodoClient"
  4. Появится меню. Выберите действие и следуйте подсказкам.

5. Основы передачи данных по веб

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

5.1. HTTP (Hypertext Transfer Protocol)

  • Что это: Основной протокол для передачи данных в веб. Работает по модели "запрос-ответ": клиент отправляет запрос, сервер возвращает ответ.
  • Методы HTTP (используемые в программе):
    • GET: Получение данных (например, список задач). Безопасен, не меняет данные на сервере.
    • POST: Создание данных (новая задача). Отправляет тело запроса (JSON).
    • PUT: Обновление данных (изменение задачи). Заменяет существующий ресурс.
    • DELETE: Удаление данных (удаление задачи).
  • Статусы ответов (HTTP-коды):
    • 200 OK: Успех (для GET, POST, PUT).
    • 204 No Content: Успех без тела (для DELETE).
    • 404 Not Found: Ресурс не найден (например, задача по ID не существует).
  • Как работает в программе: Клиент (HttpClient) формирует запрос с методом, URI и заголовками (например, Content-Type: application/json для JSON). Сервер обрабатывает запрос в контроллере и возвращает ответ.

5.2. REST (Representational State Transfer)

  • Что это: Архитектурный стиль для веб-API. Ресурсы (например, задачи) представляются по URL, операции — через HTTP-методы.
  • Принципы в программе:
    • Ресурсы: Задачи — это ресурсы (/api/tasks для списка, /api/tasks/{id} для конкретной).
    • Статусные коды: Используются для указания результата (200, 204, 404).
    • Без состояния: Каждый запрос независим (сервер не хранит состояние клиента).
  • Преимущества: Простота, масштабируемость, совместимость с веб-стандартами.

5.3. JSON (JavaScript Object Notation)

  • Что это: Легковесный формат для обмена данными (ключ-значение, массивы, объекты). Используется для тела запросов/ответов.
  • Как работает в программе:
    • Сервер (Spring Boot): Автоматически преобразует объекты Task в JSON (через Jackson).
    • Клиент: Формирует JSON вручную (строка { "description": "...", "completed": false }) для POST/PUT.
    • Парсинг: В клиенте org.json преобразует ответ сервера в объекты для вывода.
  • Пример JSON:
    {
      "id": 1,
      "description": "Сходить в магазин",
      "completed": false
    }

5.4. CORS (Cross-Origin Resource Sharing)

  • Что это: Механизм безопасности браузеров, который блокирует запросы с одного домена на другой. В программе решается через CorsConfig.java.
  • Как работает: Сервер добавляет заголовки (например, Access-Control-Allow-Origin: *) в ответы, чтобы разрешить запросы. Без CORS клиент (HTML/JS) не сможет вызвать API.
  • В программе: CorsConfig разрешает запросы с любого источника для разработки.

6. Примеры использования

  1. Показать задачи (выбор 1):
    • Вывод: Список в формате "ID: X, Описание: Y, Выполнена: Z".
  2. Создать задачу (выбор 2):
    • Введите описание, получите JSON созданной задачи.
  3. Обновить задачу (выбор 3):
    • Введите ID, новое описание и статус.
  4. Удалить задачу (выбор 4):
    • Введите ID, получите подтверждение.

API Справка для TSN_TodoApp

REST API для управления списком задач (To-Do List). Позволяет создавать, читать, обновлять и удалять задачи, хранящиеся в памяти.

Базовый URL

http://localhost:8080/api/tasks

Структура задачи

Каждая задача имеет следующие поля:

  • id (Long): Уникальный идентификатор задачи.
  • description (String): Описание задачи (например, "Сходить в магазин").
  • completed (boolean): Статус выполнения (true — выполнена, false — не выполнена).

Эндпоинты API

Метод URL Описание Входные данные Ответ
GET /api/tasks Получить все задачи Нет JSON-массив задач (или [], если пусто). Статус: 200 OK
GET /api/tasks/{id} Получить задачу по ID Параметр пути: id (Long) JSON задачи или 404 Not Found
POST /api/tasks Создать новую задачу JSON: { "description": "String", "completed": boolean } JSON созданной задачи с ID. Статус: 200 OK
PUT /api/tasks/{id} Обновить задачу Параметр пути: id (Long), JSON: { "description": "String", "completed": boolean } JSON обновлённой задачи или 404 Not Found
DELETE /api/tasks/{id} Удалить задачу Параметр пути: id (Long) Статус: 204 No Content (успех) или 404 Not Found

Примеры запросов

  1. Получить все задачи
    GET http://localhost:8080/api/tasks
    Ответ:

    [
        {
            "id": 1,
            "description": "Сходить в магазин",
            "completed": false
        }
    ]
  2. Создать задачу
    POST http://localhost:8080/api/tasks
    Тело запроса:

    {
        "description": "Купить продукты",
        "completed": false
    }

    Ответ:

    {
        "id": 2,
        "description": "Купить продукты",
        "completed": false
    }
  3. Получить задачу по ID
    GET http://localhost:8080/api/tasks/1
    Ответ:

    {
        "id": 1,
        "description": "Сходить в магазин",
        "completed": false
    }
  4. Обновить задачу
    PUT http://localhost:8080/api/tasks/1
    Тело запроса:

    {
        "description": "Сходить в магазин и купить молоко",
        "completed": true
    }

    Ответ:

    {
        "id": 1,
        "description": "Сходить в магазин и купить молоко",
        "completed": true
    }
  5. Удалить задачу
    DELETE http://localhost:8080/api/tasks/1
    Ответ: Пустой (статус 204 No Content) или 404 Not Found.

Замечания

  • Данные хранятся в памяти и сбрасываются при перезапуске приложения.
  • Нет валидации входных данных (например, пустое description).
  • Тестируйте с помощью инструментов: Hoppscotch, Insomnia, Thunder Client или curl.

About

Пример технологии Spring Boot на Java в NetBeans

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published