2013-12-04 2 views
9

I'm way new to Spring.SpringMVC lifecycle-- общий вид

Я ищу, чтобы проверить следующее понимание SpringMVC lifecycle-- положить вещи в местах общего вида:

Весь процесс запроса приводом.

Существует Front Controller pattern, а передний контроллер весной MVC - DispatcherServlet.

По каждому входящему запросу пользователя Spring управляет полным жизненным циклом , как описано в here.

В общем виде DispatcherServlet отправляет запрос в контроллер для обслуживания на внутреннем сервере. Как только это будет сделано, он передаст его компоненту просмотра MVC для его представления, которое будет подготовлено в ответ на пользователя.

Более подробно,

  • DispatcherServlet использует обработчики, чтобы решить "какой контроллер", чтобы служить этот запрос.

  • Контроллеры должны быть «светло-взвешенными» - должны быть отделены от процессами обслуживания на задней стороне в качестве хорошей практики проектирования - они содержат ссылки на службы (сервисы) и ссылаются на правильный (ы). Их «миссия» состоит в том, чтобы контролировать процесс (ы) обслуживания для создания модели и передать обратно диспетчеру для следующего шага.

  • Компонент View сам по себе состоит из двух частей: сначала ViewResolver выбирает подходящий тип представления для представления модели в окончательный формат для пользователя.

От угла разработчика - диспетчер-хранитель - это закулисная вещь. Все, что я делаю, это определить и настроить его, если необходимо, в web.xml. Как разработчик, я создаю экземпляр ApplicationContext (существует много типов ApplicationContext - я выбираю один в зависимости от того, что мне нужно, обычно WebApplicationContext (?)). AplicationContext - это фабрика, которая создает все сервлеты/bean-компоненты, включая DispatcherServlet, используя их описания в XML-файлах. DispatcherServlet затем проходит за кулисами и управляет всем process-- идет & получает контроллеры, с помощью аннотаций или их XML-описания, представления, обработчиков, валидатор и т.д.

Я интересно ли это описание имеет действительный & полный, и есть ли в нем большие недостающие части.

Заранее спасибо.

ответ

1

На ваш вопрос нет хорошего ответа. «Конечно» как можно ближе.

Вы можете настроить весну, используя xml-файлы или аннотации или их комбинацию.

Вам не нужно писать сервлеты с помощью Spring MVC, но вы можете, если хотите.В основном вы можете (возможно, должны) создавать классы контроллеров (либо путем расширения класса контроллера Spring, либо маркировки класса с помощью аннотации @Controller).

«Миссия» контроллера - выполнять необходимую обработку запросов. Они не просто «контролируют процессы обслуживания»

Нет «руки назад» к диспетчеру.

DispatchServlet должен быть настроен в файле web.xml, это никогда не является обязательным.

Вы можете (возможно, должны) иметь слой между классами контроллеров и любыми веб-службами, которые вы вызываете из классов контроллера.

У вас может быть несколько applicationContexts или использовать один applicationContext.

Как это часто бывает, Вид представляет собой JSP-файл.

Контроллер должен добавить DTO (объекты передачи данных), которые используются представлением для отображения нестатической информации. EDIT: Я удалил упоминание объектов VO, я (как многие, кажется) неправильно сконфигурировал шаблоны DTO и VO.

Нет «за кулисами». DispatcherServlet получает запрос и передает его соответствующему контроллеру для обработки.

Читайте раздел 17 Spring Framework Reference

+0

Спасибо: только одно примечание: за кадром, я имею в виду, что я ничего не делаю, кроме как определить DispatcherServlet в web.xml. он обрабатывает запрос без моего дальнейшего вмешательства в качестве разработчика. – Roam

+0

В этом случае за кадром правильная. – DwB

11

Давайте вдаваться в детали, шаг за шагом

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.

+1

Вау, хороший ответ. Я отпущен, чтобы много прочесть ваш ответ, все это увлекательно. У меня есть один запрос. Где вы читаете весну, весну-mvc связанные вещи помимо документов? любая рекомендация по книге/блогу? – piechuckerr

+1

@piechuckerr Я действительно только читал части [официальной документации] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/), когда они были релевантными. Кроме того, я выполняю много кода при отладке и отвечая на вопросы о переполнении стека. –

+0

Диаграмма жизненного цикла весны https://c1.staticflickr.com/1/14/89101625_26c5be9fd9_b.jpg – aliopi

Смежные вопросы