DEV Community

Cover image for Ресторан Spring MVC
Olga Lugacheva
Olga Lugacheva

Posted on

Ресторан Spring MVC

Представьте, что Spring MVC — это не просто фреймворк, а такой себе ресторан. Вы приходите в ресторан (отправляете HTTP-запрос), а дальше начинается магия, и вот как это происходит в мире Spring MVC:

Вы входите в ресторан — DispatcherServlet на страже
Представьте, что вы зашли в ресторан Spring MVC. Но перед тем, как пройти к столу, вас встречает главный швейцар — DispatcherServlet. Он олицетворяет фронтенд-офицера и управляет всеми заказами. Ваш HTTP-запрос — это как ваше первое приветствие швейцару: вы хотите что-то вкусненькое.

Швейцар DispatcherServlet

DispatcherServlet не сам готовит еду, он просто передает запрос нужному "шеф-повару", то есть вашему контроллеру, который будет готовить блюдо. Но об этом чуть позже. Сперва швейцар проверит меню, чтобы понять, кто из шефов сможет приготовить вам то, что вы хотите.

Швейцар ищет рецепты — HandlerMapping
Как только вы произносите: "Хочу что-то вкусненькое!", швейцар (наш доблестный DispatcherServlet) не бросается на кухню сразу. Нет, сначала он открывает HandlerMapping, где у него записаны все возможные блюда ресторана и шеф-повара, которые могут их приготовить.

Вы просите, допустим, пирожное. Швейцар смотрит в свои записи и находит, что пирожные делает шеф Джон из контроллера ChefController.

Меню HandlerMapping

Швейцар отправляет заказ на кухню — HandlerAdapter
Как только швейцар нашел подходящего шефа, он использует HandlerAdapter — своего помощника, который помогает упаковать заказ и передать его на кухню шеф-повару. Как будто швейцар просто шепчет: «Джон, сделай клиенту пирожное, давай быстро!»

Шеф готовит блюдо — Controller

Image description
Теперь за дело берется шеф-повар Джон. Он — наш Controller, который занимается приготовлением. В зависимости от запроса клиента, он может сделать разные пирожные. Например, если запрос был GET, то Джон может просто показать уже готовые пирожные (вытащить их из холодильника). А если запрос POST, то, возможно, вы попросили свежее пирожное с кремом, и Джон приступит к приготовлению.

Пример:

@GetMapping("/cakes")
public List<String> getCakes() {
return List.of("Наполеон", "Тирамису", "Чизкейк");
}

Этот шеф не из тех, кто медлит, он сразу выдает список пирожных!

Оформление блюда — ViewResolver
Как только блюдо готово, нужно его красиво подать. Тут за дело берется ViewResolver. Он как дизайнер тарелки: решает, в каком виде клиенту подать блюдо. Вы ведь не хотите просто увидеть кучу ингредиентов, вы хотите красиво оформленное пирожное!

ViewResolver может решить, что пирожное нужно подать на золотой тарелке (JSP), или же в коробочке (JSON), если вы заказали его на вынос.

Вуаля! Блюдо у вас на столе — HTTP Response
Наконец, блюдо готово и подано. Ваш клиент (браузер) получает ответ от ресторана. В зависимости от вашего заказа, это может быть HTML-страница с пирожными или JSON-объект, если вы заказали еду через приложение на вынос.

Вот, например, шеф Джон решил подать список пирожных в JSON:

@GetMapping("/cakes")
@ResponseBody
public List<String> getCakes() {
return List.of("Тирамису", "Наполеон", "Эклер");
}

Клиент получил JSON с пирожными, и его жизнь стала лучше!

Что если что-то пошло не так? — Exception Handling

Официант ExceptionHandler
Как и в любом ресторане, иногда что-то идет не так. Например, вдруг шеф Джон уронил ваше пирожное на пол! В мире Spring MVC это эквивалентно исключению (например, запрос не может быть обработан).

Но не беспокойтесь, в ресторане Spring есть специальный официант по имен ExceptionHandler, который быстро реагирует и приносит вам извинения или новый заказ.

@ExceptionHandler(NoCakesAvailableException.class)
public ResponseEntity<String> handleNoCakes(NoCakesAvailableException e){
return new ResponseEntity<>("К сожалению, все пирожные закончились!", HttpStatus.NOT_FOUND);
}

Таким образом, если вдруг у нас нет пирожных, вам сообщат, что всё закончилось, и попросят прощения.

Заключение
Теперь вы понимаете, что Spring MVC — это как ресторан с четко выстроенной системой обслуживания. Здесь швейцар (DispatcherServlet) принимает ваши заказы, находит подходящего шеф-повара (контроллер), который готовит блюда (обрабатывает запросы), и официанты (HandlerAdapter и ViewResolver) приносят результат красиво оформленным. Даже если что-то идет не так, официант по работе с проблемами (ExceptionHandler) всегда готов подстраховать.

Top comments (0)