Что добавляет @Controller
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Аннотация @Controller в Spring Framework
Аннотация @Controller — это специализированная аннотация Spring, которая помечает класс как компонент MVC (Model-View-Controller), ответственный за обработку веб-запросов и управление логикой управления приложением. Это стереотип (stereotype), который расширяет функциональность стандартного @Component.
Что делает @Controller
1. Регистрирует класс как управляющий (контроллер)
@Controller
public class UserController {
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id, Model model) {
// логика получения пользователя
model.addAttribute("user", user);
return "user-detail"; // возвращает имя шаблона
}
}
Spring сканирует класс и регистрирует его как бин в контексте приложения, позволяя внедрять зависимости через конструктор, сеттеры или поля.
2. Использует DispatcherServlet для маршрутизации
Когда в приложении присутствует DispatcherServlet (центральный сервлет Spring MVC), он:
- Перехватывает входящие HTTP-запросы
- Находит подходящий метод в контроллере через @RequestMapping, @GetMapping, @PostMapping и т.д.
- Передаёт управление соответствующему методу
- Обрабатывает вернутую модель и вид
3. Позволяет возвращать String (имя представления)
В отличие от @RestController, @Controller предназначен для возврата имён шаблонов или объектов ModelAndView:
@Controller
@RequestMapping("/dashboard")
public class DashboardController {
@GetMapping("/overview")
public String getOverview(Model model) {
model.addAttribute("totalUsers", 1500);
model.addAttribute("revenue", 50000);
return "dashboard"; // возвращает шаблон dashboard.html
}
@PostMapping("/save")
public String saveDashboard(@ModelAttribute DashboardData data) {
// сохранение данных
return "redirect:/dashboard/overview"; // редирект на другую страницу
}
}
4. Работает с представлениями (View)
Spring использует ViewResolver (Thymeleaf, JSP, Freemarker) для преобразования имён шаблонов в реальные HTML-страницы:
@Controller
public class ProductController {
private final ProductService productService;
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping("/products")
public String listProducts(Model model) {
List<Product> products = productService.findAll();
model.addAttribute("products", products);
return "products/list"; // ищет resources/templates/products/list.html
}
}
Отличие @Controller от @RestController
// @Controller — возвращает имя шаблона или ModelAndView
@Controller
public class WebController {
@GetMapping("/page")
public String getPage() {
return "page"; // возвращает шаблон
}
}
// @RestController — возвращает JSON/XML напрямую
@RestController
public class ApiController {
@GetMapping("/data")
public Map<String, String> getData() {
return Map.of("status", "ok"); // сериализуется в JSON
}
}
Фактически, @RestController = @Controller + @ResponseBody на каждом методе.
Отличие @Controller от @Component
// @Component — простой бин, не участвует в обработке веб-запросов
@Component
public class DataProcessor {
public void process(String data) { }
}
// @Controller — компонент, обрабатывающий веб-запросы
@Controller
public class RequestHandler {
@GetMapping("/process")
public String handleRequest(@RequestParam String data, Model model) {
// логика обработки
return "result";
}
}
Ключевые особенности
- Стереотип аннотации: @Controller наследует функциональность @Component
- Семантика: явно указывает на роль класса в MVC архитектуре
- Обработка запросов: интегрирует методы класса с DispatcherServlet
- Модель и представление: поддерживает работу с Model и View
- Гибкость возврата: может возвращать строки (имена шаблонов), ModelAndView или редиректы
@Controller — это фундаментальный инструмент для создания традиционных веб-приложений на Spring, где нужна обработка шаблонов и отправка HTML-страниц клиентам.