← Назад к вопросам

Что добавляет @Controller

1.0 Junior🔥 221 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Аннотация @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-страниц клиентам.

Что добавляет @Controller | PrepBro