Сьогодні ми детально розберемо найважливіші анотації Spring MVC: @Controller, @RequestMapping, @GetMapping, і @PostMapping. Ви дізнаєтесь, як вони працюють, навіщо потрібні та які задачі допомагають вирішувати. І звісно, напишемо прості, але корисні приклади коду, які можна підставити у ваш проєкт.
Що таке @Controller?
Контролер (Controller) у Spring MVC — це ланка, яка приймає HTTP-запити, обробляє їх і повертає або дані (JSON, XML, текст), або представлення (HTML-сторінки). Щоб було простіше, уявімо, що контролер — це офіціант у ресторані. Він приймає замовлення (HTTP-запит), передає його на кухню (сервіси) і повертає вам готову страву (відповідь).
Анотація @Controller каже Spring: "Ей, цей клас — контролер. Направляй сюди всі підходящі запити!"
Приклад використання @Controller:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello() {
return "hello"; // Повертається ім'я представлення (наприклад, hello.html)
}
}
Коли користувач відкриває http://localhost:8080/hello, Spring викликає метод sayHello і повертає представлення hello.html.
Якщо ви повертаєте дані, а не сторінку, краще використовувати анотацію @RestController. Про неї поговоримо пізніше.
Що таке @RequestMapping?
@RequestMapping — це анотація, яка використовується для маршрутизації (routing). Вона зв'язує URL з конкретним методом вашого контролера. Простий приклад: якщо ви зайшли на URL /products, Spring направить вас до методу, який обслуговує @RequestMapping("/products").
Приклад:
@Controller
@RequestMapping("/api/v1")
public class ProductController {
@RequestMapping("/products")
public String getAllProducts() {
return "products"; // Це ім'я HTML-шаблона, який потрібно відрендерити
}
}
Тепер доступ до цього методу буде за шляхом http://localhost:8080/api/v1/products.
Як працює @RequestMapping?
Логіка роботи виглядає так:
- Spring перевіряє всі методи контролерів, позначені
@RequestMapping. - Якщо URL запиту збігається з вказаним в анотації, викликається відповідний метод.
@RequestMapping підтримує:
- HTTP-методи: GET, POST, PUT, DELETE та інші.
- Параметри: можна налаштувати більш складні маршрути.
Специфічні анотації: @GetMapping і @PostMapping
До весни 2016 року (Spring 4.3) @RequestMapping була універсальною анотацією, яка могла обробляти будь-який HTTP-метод. Але з виходом Spring 4.3 з'явились зручніші анотації: @GetMapping, @PostMapping, @PutMapping, @DeleteMapping та інші.
Їх використовують, щоб явно вказати, який HTTP-метод обслуговує даний метод контролера.
@GetMapping
Ця анотація використовується для обробки HTTP-запитів типу GET. GET-запити зазвичай використовуються для отримання інформації від сервера.
Приклад:
@GetMapping("/products")
public String getAllProducts() {
return "product_list"; // Повертаємо шаблон "product_list.html"
}
Тепер ви можете отримати список продуктів, зайшовши на URL http://localhost:8080/products.
@PostMapping
Анотація для обробки POST-запитів. POST-запити зазвичай використовують для відправки даних на сервер (наприклад, відправка форми).
Приклад:
@PostMapping("/products")
@ResponseBody
public String createProduct(@RequestParam String name, @RequestParam Double price) {
// Логіка для створення нового продукту
return "Продукт " + name + " створено з ціною " + price;
}
Тепер ви можете відправити дані, використовуючи POST-запит через інструмент типу Postman.
Різниці між @RequestMapping, @GetMapping та @PostMapping
| Анотація | Підтримка HTTP-методів | Зручність |
|---|---|---|
@RequestMapping |
Будь-який (GET, POST тощо) | Універсальна |
@GetMapping |
Тільки GET | Проста та наочна |
@PostMapping |
Тільки POST | Проста та наочна |
Краще використовувати @GetMapping і @PostMapping, щоб явно вказувати, який тип HTTP-запитів підтримує метод.
Практика: створення контролера з маршрутизацією
Давайте напишемо невеликий приклад, який повертатиме динамічні дані.
Контролер:
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
@ResponseBody
public String getUserById(@PathVariable("id") Long userId) {
// У реальному застосунку дані можна брати з бази
return "Користувач з ID = " + userId;
}
@PostMapping
@ResponseBody
public String createUser(@RequestParam String name, @RequestParam Integer age) {
// У реальному застосунку тут логіка збереження користувача
return "Користувач " + name + " створений. Вік: " + age;
}
}
Що тут відбувається?
- Метод
getUserByIdобробляє GET-запити. URL може бути, наприклад:/users/5. Ми використовуємо@PathVariable, щоб витягтиidз URL. - Метод
createUserобробляє POST-запити. Дані передаються через параметриnameіage.
Як протестувати?
- Для GET-запиту: відкрийте браузер і введіть
http://localhost:8080/users/5. - Для POST-запиту: використайте Postman або cURL:
curl -X POST "http://localhost:8080/users" -d "name=John&age=30"
Результат:
- GET:
Користувач з ID = 5 - POST:
Користувач John створений. Вік: 30
Типові помилки та їхні рішення
1. Помилка: "HTTP 404 Not Found"
Причина: Ви вказали неправильний URL або метод у браузері/Postman. Переконайтеся, що використовуєте правильний шлях.
2. Помилка: "Ambiguous Mapping"
Причина: Ви створили два методи з одним і тим же маршрутом і HTTP-методом. Наприклад:
@GetMapping("/duplicate")
public String method1() {
return "method1";
}
@GetMapping("/duplicate")
public String method2() {
return "method2";
}
Рішення: переконайтеся, що маршрути унікальні.
3. Помилка: "Missing Request Parameters"
Якщо метод очікує параметри @RequestParam, а ви їх не надіслали, отримаєте помилку. Переконайтеся, що передали всі потрібні параметри.
Практичне застосування
Ці анотації використовуються повсюдно при створенні веб-застосунків. Будь то розробка e-commerce сайту або REST API для мобільного додатка — знання @Controller, @RequestMapping, @GetMapping і @PostMapping зробить вашу роботу простішою і ефективнішою.
Тепер ви знаєте, як налаштовувати маршрути, обробляти запити і повертати відповіді у ваших Spring-додатках. Попереду — робота з параметрами запитів і ще більше практики!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ