Давайте вдаваться в детали, шаг за шагом
DispatcherServlet использует обработчики, чтобы решить "какой контроллер" служить , что просить
DispatcherServlet
поддерживает заказанный List
из HandlerMapping
фасолей (который он загрузил с WebApplicationContext
). HandlerMapping
является
Интерфейс быть реализован объектами, которые определяют отображение между запросов и объектов обработчиков.
Когда DispatcherServlet
получает запрос, он выполняет итерацию по этому списку, пока не найдет соответствующий объект-обработчик для рассматриваемого запроса. Для простоты рассмотрим только RequestMappingHandlerMapping
.
боб этого типа хранит отображение @RequestMapping
аннотированных методов (фактическая Method
объекта извлекается с отражением) хранятся в виде HandlerMethod
экземпляров и обернутые в RequestMappingInfo
объектах, которые держат картографические данные для согласования запроса, то есть. URL, заголовки и параметры запроса.
DispatcherServlet
получает наилучшее соответствие HandlerMethod
от этих и любых соответствующих HandlerInterceptor
экземпляров, которые вы, возможно, зарегистрировали. Он извлекает их как объект HandlerExecutionChain
. Он сначала применит любые pre-handling по HandlerInterceptor
. Затем он попытается вызвать ваш HandlerMethod
.Обычно это (но не всегда) должно быть аннотированным способом @RequestMapping
внутри аннотированного класса @Controller
. Это приводит к тому, что Spring вызывает результат отправки. Затем DispatcherServlet
применяет post-handling по адресу HandlerInterceptor
. Он, наконец, обрабатывает результат отправки в зависимости от того, что это такое. You can see the supported return types for an idea of what that can be.
Контроллеры/должны быть «легковесности» - должны быть развязаны от процессов обслуживания в задней части, как хороший дизайн они практике: держат ссылки на услугу (ы) и вызывать правый (ы). Их «миссия» состоит в том, чтобы контролировать процесс (ы) обслуживания для построения модели и передать ее обратно диспетчеру для следующего шага.
В приложении MVC контроллер контролирует операции, внося изменения в модель. Вы можете сделать это прямо в своем контроллере, или вы можете отделить его, внедряя и предоставляя сервисные и бизнес-классы для этой цели. Контроллер зависит от них, но не наоборот. Выезд multilayered architectures.
Контроллер затем строит модель (Model
), которые, возможно, DispatcherServlet
делает доступными для просмотра. Я говорю, возможно, потому что контроллер может дать ответ напрямую без какого-либо представления (думаю, jsp
).
The View компонент сам по себе имеет 2-х частей: сначала ViewResolver улавливает правильный тип ищет View, чтобы поместить модель в конечный формат для пользователя.
В типичном случае, когда метод обработчика контроллер будет возвращать объект Model
, View
, ModelAndView
, String
(и некоторые другие), то ViewResolver
будет обрабатывать найти правильный View
. Затем DispatcherServlet
пытается отобразить это представление, сперва слияние модели, как вы сказали. Обычно это означает получение всех атрибутов Model
и их включение в атрибуты HttpServletRequest
. Шаг рендеринга может включать в себя рендеринг jsp
, генерацию XML или вообще что-либо.
От угла разработчика - DispatcherServlet является за кулисами. Все, что я делаю, это определить и настроить его, если необходимо , в web.xml. Как разработчик, я создаю экземпляр приложения (существует много типов ApplicationContext - я выбираю один в зависимости от того, что мне нужно, обычно WebApplicationContext (?) ).
Вам действительно не нужно создавать экземпляр. DispatcherServlet
будет делать это сам (или использовать ContextLoaderListener
), когда контейнер Servlet
вызывает на нем init()
. Он будет генерировать свой собственный WebApplicationContext
. What you can do is decide which subclass of WebApplicationContext
to use. This is an important choice if you want to load your context from XML or from a Java configuration. You can do this by providing an <init-param>
.
AplicationContext является заводом, который создает все сервлеты/боб включая DispatcherServlet, используя их описание в .xml файлов.DispatcherServlet затем проходит за кулисами и управляет всем process-- идет & получает контроллеры, с помощью аннотаций или их описаний .xml, представление, обработчики, валидатор и т.д.
ApplicationContext
также известен как Инверсия контрольного контейнера. Он не включает DispatcherServlet
. Управление DispatcherServlet
осуществляется контейнером Servlet
, а не весной. Тем не менее, он в первую очередь берет свою конфигурацию от весны ApplicationContext
(WebApplicationContext
). It registers a number of special beans it finds in the context.You can declare these yourself or let Spring do it for you with this little bit of XML
<mvc:annotation-driven>
Это (в основном) ухаживают делать то, что вы описали, то есть. регистрации обработчиков, валидаторы, мнение и т.д.
Я интересно ли это описание holds-- действует & полных и есть ли большие недостающие части в нем.
Не забывайте, что веб-приложение Spring MVC представляет собой веб-приложение Servlet
. Поэтому жизненный цикл приложения привязан к контейнеру Servlet
.
Спасибо: только одно примечание: за кадром, я имею в виду, что я ничего не делаю, кроме как определить DispatcherServlet в web.xml. он обрабатывает запрос без моего дальнейшего вмешательства в качестве разработчика. – Roam
В этом случае за кадром правильная. – DwB