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

Как устроен Spring MVC?

2.3 Middle🔥 221 комментариев
#Spring Framework

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

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

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

Как устроен Spring MVC

Spring MVC — это фреймворк для разработки веб-приложений на основе архитектурного паттерна Model-View-Controller. Он обеспечивает разделение ответственности между компонентами приложения.

Архитектура Spring MVC

Поток запроса: Браузер → HTTP запрос → DispatcherServlet → HandlerMapping → Controller → Model + View → ViewResolver → View → HTTP ответ → Браузер

Компоненты Spring MVC

1. DispatcherServlet (Front Controller)

Центральный контроллер, который перехватывает все запросы и координирует их обработку.

2. HandlerMapping

Найти подходящий контроллер для запроса. Примеры:

  • RequestMappingHandlerMapping использует @RequestMapping
  • SimpleUrlHandlerMapping использует URL patterns

3. Controller (Обработчик)

@Controller
@RequestMapping("/users")
public class UserController {
    @GetMapping
    public String listUsers(Model model) {
        List<User> users = userService.findAll();
        model.addAttribute("users", users);
        return "users/list";
    }
    
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id, Model model) {
        User user = userService.findById(id);
        model.addAttribute("user", user);
        return "users/detail";
    }
}

4. Model

Передает данные с контроллера на view. Содержит атрибуты для отображения.

5. View

Представление данных (JSP, Thymeleaf, FreeMarker и т.д.). Получает данные из Model.

6. ViewResolver

Находит реальный файл view по имени:

  • ThymeleafViewResolver для Thymeleaf
  • InternalResourceViewResolver для JSP

Полный жизненный цикл запроса

  1. Пользователь отправляет GET /users/5
  2. DispatcherServlet перехватывает запрос
  3. HandlerMapping находит контроллер UserController.getUser(5)
  4. Контроллер обрабатывает запрос и получает пользователя
  5. Контроллер добавляет пользователя в Model
  6. DispatcherServlet вызывает ViewResolver
  7. ViewResolver находит файл users/detail.html
  8. View рендерится с данными из Model
  9. HTML отправляется браузеру

Аннотации в Spring MVC

@RestController
@RequestMapping("/api/users")
public class UserRestController {
    @GetMapping
    public List<User> getAll() { }
    
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) { }
    
    @PostMapping
    public User create(@RequestBody User user) { }
    
    @PutMapping("/{id}")
    public User update(@PathVariable Long id, @RequestBody User user) { }
    
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id) { }
}

Отличия @Controller и @RestController

@Controller — возвращает View (HTML) @RestController — возвращает JSON/XML

Обработка исключений

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<?> handleUserNotFound(UserNotFoundException ex) {
        return ResponseEntity.status(404)
            .body("User not found");
    }
}

Best Practices

  • Держи контроллеры тонкими — логика в сервисах
  • Используй @RestController для JSON API
  • Правильно структурируй URL'ы
  • Обрабатывай исключения через @ControllerAdvice
  • Используй Model для передачи данных в view
  • Проверяй входные параметры через @Valid
  • Документируй API с помощью Swagger/SpringDoc