Ответ
@Controller — это стереотипная аннотация Spring MVC, которая помечает класс как компонент веб-уровня (контроллер). Её основная задача — обрабатывать HTTP-запросы от клиентов и возвращать ответы.
Роль и особенности:
- Является специализацией аннотации
@Component, поэтому класс сканируется и управляется контейнером Spring как бин. - Работает в паре с аннотацией
@RequestMapping(или её производными, такими как@GetMapping,@PostMapping) для маппинга URL-путей на методы класса. - Методы контроллера обычно возвращают имя логического представления (View name) или данные, которые будут преобразованы в ответ (JSON, XML) с помощью
@ResponseBodyили аннотации@RestController.
Пример классического контроллера, возвращающего имя представления:
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUserProfile(@PathVariable Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user); // Добавляем данные в модель для представления
return "user-profile"; // Имя view (например, user-profile.jsp или user-profile.html)
}
}
Пример контроллера, работающего как REST API (до появления @RestController):
@Controller
@RequestMapping("/api/users")
public class UserApiController {
@GetMapping("/{id}")
@ResponseBody // Указывает, что возвращаемое значение должно быть записано прямо в тело HTTP-ответа
public User getUser(@PathVariable Long id) {
return userService.findById(id); // Объект User будет автоматически преобразован в JSON
}
}
@Controller vs @RestController:
@RestController— это комбинация@Controllerи@ResponseBody. Все методы в классе, помеченном@RestController, по умолчанию возвращают данные, а не имена представлений.@Controllerиспользуется для традиционных веб-приложений с серверным рендерингом (MVC), в то время как@RestControllerпредназначен для создания RESTful веб-сервисов.