Пример технологии Spring Boot на Java в NetBeans
Программа состоит из двух частей:
- Сервер (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.
Сервер — это Spring Boot приложение, которое запускает веб-сервер Tomcat на порту 8080 и предоставляет REST API по пути /api/tasks. Вот описание ключевых классов:
- Назначение: Модель данных для задачи.
- Поля:
id(Long): Уникальный идентификатор задачи (генерируется сервером).description(String): Описание задачи.completed(boolean): Статус выполнения (true — выполнена, false — нет).
- Методы:
- Геттеры и сеттеры для каждого поля.
- Конструкторы: пустой (для десериализации JSON) и с параметрами (для создания задачи с описанием и статусом).
- Как работает: Этот класс используется для представления задач в JSON-формате при обмене данными между клиентом и сервером.
- Назначение: Бизнес-логика для работы с задачами (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).
- Как работает: Сервис управляет данными в памяти. Нет базы данных, поэтому данные временные.
- Назначение: Обработка 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-статусами.
- Назначение: Разрешение CORS для кросс-доменных запросов (например, от клиента).
- Аннотации:
@Configuration: Делает класс конфигурацией Spring. - Метод:
addCorsMappings(CorsRegistry registry): Разрешает запросы с любого источника (allowedOrigins("*")) для методов GET, POST и т.д. - Как работает: Без этого класса браузер или клиент может блокировать запросы из-за политики безопасности. Это критично для веб-клиентов (HTML/JS), но для консольного Java-клиента не обязательно.
- Назначение: Главный класс для запуска сервера.
- Аннотации:
@SpringBootApplication: Автоматическая настройка Spring (сканирование компонентов, конфигурация). - Метод:
main(String[] args): Запускает Spring Boot приложение. - Как работает: При запуске Spring сканирует пакеты, находит контроллер и сервис, и запускает сервер на порту 8080.
Клиент — консольное приложение, которое отправляет 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) или проверяются по статусу.
- Убедитесь, что JDK 17 установлен (
JAVA_HOME=C:\Program Files\Java\jdk-17). - Перейдите в папку проекта:
cd D:\Projects\Java\NetBeans\TSN_TodoApp - Скомпилируйте и запустите:
mvn clean install mvn spring-boot:run
- Сервер запустится на
http://localhost:8080. Проверьте в браузереhttp://localhost:8080/api/tasks(должен вернуть[]).
- Добавьте зависимость
org.jsonвpom.xmlклиента (если используете Maven):<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency>
- Перейдите в папку клиента:
cd D:\Projects\Java\NetBeans\TodoClient
- Скомпилируйте и запустите:
mvn clean compile mvn exec:java -Dexec.mainClass="kz.proffix4.tsn_todoapp_client.TodoClient" - Появится меню. Выберите действие и следуйте подсказкам.
Программа использует веб-протоколы для обмена данными между клиентом и сервером. Вот объяснение ключевых концепций:
- Что это: Основной протокол для передачи данных в веб. Работает по модели "запрос-ответ": клиент отправляет запрос, сервер возвращает ответ.
- Методы 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). Сервер обрабатывает запрос в контроллере и возвращает ответ.
- Что это: Архитектурный стиль для веб-API. Ресурсы (например, задачи) представляются по URL, операции — через HTTP-методы.
- Принципы в программе:
- Ресурсы: Задачи — это ресурсы (
/api/tasksдля списка,/api/tasks/{id}для конкретной). - Статусные коды: Используются для указания результата (200, 204, 404).
- Без состояния: Каждый запрос независим (сервер не хранит состояние клиента).
- Ресурсы: Задачи — это ресурсы (
- Преимущества: Простота, масштабируемость, совместимость с веб-стандартами.
- Что это: Легковесный формат для обмена данными (ключ-значение, массивы, объекты). Используется для тела запросов/ответов.
- Как работает в программе:
- Сервер (Spring Boot): Автоматически преобразует объекты
Taskв JSON (через Jackson). - Клиент: Формирует JSON вручную (строка
{ "description": "...", "completed": false }) для POST/PUT. - Парсинг: В клиенте
org.jsonпреобразует ответ сервера в объекты для вывода.
- Сервер (Spring Boot): Автоматически преобразует объекты
- Пример JSON:
{ "id": 1, "description": "Сходить в магазин", "completed": false }
- Что это: Механизм безопасности браузеров, который блокирует запросы с одного домена на другой. В программе решается через
CorsConfig.java. - Как работает: Сервер добавляет заголовки (например,
Access-Control-Allow-Origin: *) в ответы, чтобы разрешить запросы. Без CORS клиент (HTML/JS) не сможет вызвать API. - В программе:
CorsConfigразрешает запросы с любого источника для разработки.
- Показать задачи (выбор 1):
- Вывод: Список в формате "ID: X, Описание: Y, Выполнена: Z".
- Создать задачу (выбор 2):
- Введите описание, получите JSON созданной задачи.
- Обновить задачу (выбор 3):
- Введите ID, новое описание и статус.
- Удалить задачу (выбор 4):
- Введите ID, получите подтверждение.
REST API для управления списком задач (To-Do List). Позволяет создавать, читать, обновлять и удалять задачи, хранящиеся в памяти.
http://localhost:8080/api/tasks
Каждая задача имеет следующие поля:
id(Long): Уникальный идентификатор задачи.description(String): Описание задачи (например, "Сходить в магазин").completed(boolean): Статус выполнения (true— выполнена,false— не выполнена).
| Метод | 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 |
-
Получить все задачи
GEThttp://localhost:8080/api/tasks
Ответ:[ { "id": 1, "description": "Сходить в магазин", "completed": false } ] -
Создать задачу
POSThttp://localhost:8080/api/tasks
Тело запроса:{ "description": "Купить продукты", "completed": false }Ответ:
{ "id": 2, "description": "Купить продукты", "completed": false } -
Получить задачу по ID
GEThttp://localhost:8080/api/tasks/1
Ответ:{ "id": 1, "description": "Сходить в магазин", "completed": false } -
Обновить задачу
PUThttp://localhost:8080/api/tasks/1
Тело запроса:{ "description": "Сходить в магазин и купить молоко", "completed": true }Ответ:
{ "id": 1, "description": "Сходить в магазин и купить молоко", "completed": true } -
Удалить задачу
DELETEhttp://localhost:8080/api/tasks/1
Ответ: Пустой (статус204 No Content) или404 Not Found.
- Данные хранятся в памяти и сбрасываются при перезапуске приложения.
- Нет валидации входных данных (например, пустое
description). - Тестируйте с помощью инструментов: Hoppscotch, Insomnia, Thunder Client или curl.