JavaRush /Курси /Модуль 5. Spring /Анотації @Controller, @RequestMapping, @GetMapping, @Post...

Анотації @Controller, @RequestMapping, @GetMapping, @PostMapping

Модуль 5. Spring
Рівень 7 , Лекція 2
Відкрита

Сьогодні ми детально розберемо найважливіші анотації 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?

Логіка роботи виглядає так:

  1. Spring перевіряє всі методи контролерів, позначені @RequestMapping.
  2. Якщо 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;
    }
}

Що тут відбувається?

  1. Метод getUserById обробляє GET-запити. URL може бути, наприклад: /users/5. Ми використовуємо @PathVariable, щоб витягти id з URL.
  2. Метод 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-додатках. Попереду — робота з параметрами запитів і ще більше практики!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ