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

Аннотации @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-приложениях. А впереди нас ждёт работа с параметрами запросов и ещё больше практики!

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ