Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как устроен 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
Полный жизненный цикл запроса
- Пользователь отправляет GET /users/5
- DispatcherServlet перехватывает запрос
- HandlerMapping находит контроллер UserController.getUser(5)
- Контроллер обрабатывает запрос и получает пользователя
- Контроллер добавляет пользователя в Model
- DispatcherServlet вызывает ViewResolver
- ViewResolver находит файл users/detail.html
- View рендерится с данными из Model
- 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