Controllers
Контроллер как адаптер между HTTP и приложением
В Spring MVC controller — Spring bean, методы которого могут обрабатывать web-запросы. Он получает данные в форме, удобной для Java-кода, вызывает нужные сервисы и возвращает результат, который Spring MVC затем превращает в HTTP-ответ.
@Controller
class ProductController {
private final ProductService productService;
ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping("/products")
String products(Model model) {
model.addAttribute("products", productService.findAll());
return "products";
}
}
Аннотация @Controller делает класс кандидатом на роль MVC-контроллера.
В примере метод получает данные у сервиса, кладёт их в Model
и возвращает имя представления. Сам контроллер не отвечает за создание сервиса и не должен переносить в себя его бизнес-логику.
Почему контроллеры лучше держать тонкими
Если контроллер начинает рассчитывать цены, управлять транзакциями или содержать сложные правила предметной области, web-слой быстро становится трудно переиспользовать и тестировать. Обычно контроллеру достаточно прочитать входные данные, вызвать подходящую операцию приложения и сформировать web-результат.
@Controller не означает автоматически «вернуть JSON».
Работа с телом HTTP-ответа и специальный вариант контроллера для REST будут разобраны дальше.