Жизненный цикл SpringMVC-общий вид
Я новичок в Spring.
Я хочу проверить следующее понимание жизненного цикла SpringMVC - чтобы поместить вещи в места в общем представлении:
весь процесс управляется запросом.
есть шаблон переднего контроллера и передний контроллер весной MVC является DispatcherServlet.
на каждом входящем запросе от потребителя, Весна управляет весь жизненный цикл, как описано в здесь.
в целом, DispatcherServlet отправляет запрос контроллеру для службы в фоновом режиме. Как только это будет сделано, он передаст его компоненту View MVC для его представления, которое будет подготовлено в ответ на пользователя.
более подробно
DispatcherServlet использует обработчики, чтобы решить, "какой контроллер" для обслуживания этого запроса.
в регуляторы/должны быть "свет-утяжелены" -- должны быть отделены от процессы обслуживания на задней панели как хорошая практика проектирования - они содержат ссылки на службу(Ы) и вызывают правильный(ы). Их "миссия" контролировать процесс(ы) обслуживания для построения модели и вручать он вернулся к диспетчеру для следующего шага.
компонент View сам по себе имеет 2 части: сначала ViewResolver выбирает правильный тип поиска для просмотра, чтобы поместить модель в окончательный формат для пользователя.
с точки зрения разработчика -- DispatcherServlet-это закулисная вещь. Все, что я делаю, это определить и настроить его, если необходимо, в интернете.XML. Как разработчик, я создаю экземпляр ApplicationContext (существует много типов ApplicationContext-я выбираю один в зависимости от того, что мне нужно, обычно WebApplicationContext(?) ). AplicationContext-это фабрика, которая создает все сервлеты / бобы, включая в DispatcherServlet, используя их описания в.XML-файл. Затем DispatcherServlet запускается за кулисами и управляет весь процесс -- goes & получает контроллеры, используя аннотации или их .XML-описание, представления, обработчики, валидаторы и т. д.
Мне интересно, является ли это описание-действительным и полным, и есть ли в нем большие недостающие части.
спасибо заранее.
2 ответов
нет хорошего ответа на ваш вопрос. "Конечно" - это все, что я могу сказать.
вы можете настроить spring с помощью xml-файлов или аннотаций или комбинации обоих.
вам не нужно писать сервлеты с Spring MVC, но вы можете, если хотите. В основном вы можете (возможно, должны) создать классы контроллеров (либо путем расширения класса контроллера Spring, либо пометив класс аннотацией @Controller).
"миссия" контроллера заключается в выполнении необходимая обработка запросов. Они не просто "контролируют процессы обслуживания"
нет никакого "вернуть его" диспетчеру.
DispatchServlet должен быть настроен в интернете.XML-файл, это не опционально.
вы можете (возможно, должны) иметь слой между классами контроллера и любыми веб-службами, которые вы будете вызывать из классов контроллера.
вы можете иметь несколько applicationContexts или использовать один applicationContext.
Как часто как не, вид файла JSP.
контроллер должен добавить DTOs (объекты передачи данных), которые используются представлением для отображения нестатической информации. EDIT: я удалил упоминание объектов VO, я (как и многие, кажется) неправильно объединил шаблоны DTO и VO.
нет никакого "за кулисами". DispatcherServlet получает запрос и передает его соответствующему контроллеру для обработка.
прочитайте раздел 17 Spring Framework Reference
давайте подробно рассмотрим шаг за шагом
DispatcherServlet использует обработчики, чтобы решить, "какой контроллер" обслуживать эта просьба
на DispatcherServlet
поддерживает упорядоченный List
of HandlerMapping
бобы (которые он загрузил из WebApplicationContext
). А HandlerMapping
is
интерфейс, который будет реализован объектами, определяющими отображение между запросы и обработчик объекты.
когда DispatcherServlet
получает запрос, он выполняет итерацию по этому списку, пока не найдет соответствующий объект обработчика для рассматриваемого запроса. Для простоты, рассмотрим только RequestMappingHandlerMapping
.
Боб этого типа хранит отображение @RequestMapping
аннотированные методы (фактические Method
объект, извлеченный с отражением) хранится как HandlerMethod
экземпляры и завернутые в RequestMappingInfo
объекты которые содержат данные сопоставления для соответствия запросу, т. е. URL, заголовки и параметры запроса.
на DispatcherServlet
извлекает лучшее соответствие HandlerMethod
из этих и каких-либо тегом HandlerInterceptor
экземпляры, которые вы уже зарегистрированы. Он извлекает их как HandlerExecutionChain
применяется пост-обработки на HandlerInterceptor
s. Он, наконец, обрабатывает результат отправки в зависимости от того, что это такое. вы можете увидеть поддерживаемые типы возврата для идеи, что это может быть.
регуляторы/должны быть "свет-утяжелены" -- должны быть decoupled от процессов обслуживания на задней части как хороший практика проектирования -- они содержат ссылки на службу(службы) и вызывают правильный(ые). Их "миссия" контролировать процесс(ы) обслуживания для построения модель и передача ее диспетчеру для следующего шага.
в приложении MVC контроллер управляет операциями, внося изменения в модель. Вы можете сделать это непосредственно в контроллере или отделить его, реализовав и предоставив сервис и бизнес-классы для этой цели. Этот контроллер зависит от них, но не наоборот. Проверьте многослойных архитектур.
контроллер затем строит модель (Model
), который DispatcherServlet
возможно делает доступным для просмотра. Я говорю, возможно, потому, что контроллер может производить ответ непосредственно без какого-либо представления (подумайте jsp
) участвует.
компонент View сам по себе имеет 2 части: сначала выбирает ViewResolver правильный тип поиска вида, чтобы поместить модель в окончательный формат для пользователя.
в типичном случае, когда метод обработчика контроллера вернет Model
, View
, ModelAndView
, String
(и некоторые другие) объекта,ViewResolver
будет обрабатывать поиск правильного View
. The DispatcherServlet
затем пытается отобразить это представление, сначала объединив модель, как вы сказали. Обычно это означает принимая все Model
атрибуты и положить их в HttpServletRequest
атрибуты. Шаг рендеринга может включать рендеринг a jsp
, генерации XML или ничего вообще.
С точки зрения разработчика -- DispatcherServlet является закулисные дела. Все, что я делаю, это определяю и настраиваю его, если необходимо, в сети.XML. Как разработчик, я создаю экземпляр ApplicationContext (существует много типов ApplicationContext-- я выбираю один в зависимости от того, что мне нужно, обычно WebApplicationContext(?) ).
на самом деле вам не нужно создавать его экземпляр. The DispatcherServlet
сделает это сам (или используйте ContextLoaderListener
с), когда Servlet
контейнер называет init()
на нем. Он будет генерировать свой собственный WebApplicationContext
. что вы можете сделать, это решить, какой подкласс WebApplicationContext
использовать. Это важный выбор, если вы хотите загрузить контекст из XML или из конфигурации Java. Вы можете сделать это предоставление <init-param>
.
AplicationContext-это фабрика, которая создает все сервлеты / бобы включая DispatcherServlet, используя их описания в.XML файлы. Затем DispatcherServlet запускается за кулисами и управляет весь процесс-- goes & получает контроллеры, используя аннотации или их .xml-описания, представления, обработчики, валидаторы и т. д.
на ApplicationContext
также известен как инверсия контрольного контейнера. Он не включает DispatcherServlet
. The DispatcherServlet
управляет Servlet
контейнер и не к весне. Тем не менее, он в первую очередь берет свою конфигурацию из Spring's ApplicationContext
(WebApplicationContext
). он регистрирует ряд специальных бобов, которые он находит в контексте. вы можете объявить их сами или позволить Spring сделать это за вас с помощью этого маленького кусочка XML
<mvc:annotation-driven>
это (в основном) позаботится о том, что вы описываете, то есть. регистрировать обработчики, проверяющие, вид и т. д.
мне интересно, является ли это описание-действительным и полным, и есть ли в нем большие недостающие части.
не забывайте, что веб-приложение Spring MVC является Servlet
веб-приложения. Таким образом, жизненный цикл приложения привязан к Servlet
контейнер.