В этом изображении (которое я получил от здесь), HTTP-запрос отправляет что-то в диспетчерский сервлет.
Мой вопрос - что делает диспетчер сервлета?
Это что-то вроде получения информации, выброшенной с веб-страницы и отправки ее на контроллер?
В этом изображении (которое я получил от здесь), HTTP-запрос отправляет что-то в диспетчерский сервлет.
Мой вопрос - что делает диспетчер сервлета?
Это что-то вроде получения информации, выброшенной с веб-страницы и отправки ее на контроллер?
Задача DispatcherServlet заключается в том, чтобы принять входящий URI и найти правильную комбинацию обработчиков (как правило, методы на классах Controller) и представления (как правило, JSP), которые объединяются для формирования страницы или ресурса, который должен быть найден в этом месте.
У меня может быть
/WEB-INF/jsp/pages/Home.jsp
и метод в классе
@RequestMapping(value="/pages/Home.html")
private ModelMap buildHome() {
return somestuff;
}
Сервлет Dispatcher - это бит, который "знает", чтобы вызвать этот метод, когда браузер запрашивает эту страницу, и объединить его результаты с соответствующим JSP файлом, чтобы сделать html-документ.
Как это достигается, это варьируется в широких пределах с конфигурацией и версией Spring.
Также нет причин, по которым конечный результат должен быть веб-страницами. Он может сделать то же самое, чтобы найти конечные точки RMI, обрабатывать запросы SOAP, все, что может попасть в сервлет.
DispatcherServlet
- это Spring реализация MVC шаблона переднего контроллера .
См. описание в Spring docs здесь.
По сути, это сервлет, который принимает входящий запрос и делегирует обработку этого запроса одному из нескольких обработчиков, сопоставление которых специфично в конфигурации DispatcherServlet
.
В Spring MVC все входящие запросы проходят через один сервлет. Этот сервлет - DispatcherServlet
- это передний контроллер. Передний контроллер является типичным шаблоном проектирования в разработке веб-приложений. В этом случае один сервлет получает все запросы и передает их всем остальным компонентам приложения.
Задача DispatcherServlet
- отправить запрос конкретному контроллеру MVC Spring.
Обычно у нас много контроллеров, а DispatcherServlet
относится к одному из следующих картографов, чтобы определить целевой контроллер:
BeanNameUrlHandlerMapping
;ControllerBeanNameHandlerMapping
;ControllerClassNameHandlerMapping
;DefaultAnnotationHandlerMapping
;SimpleUrlHandlerMapping
.Если конфигурация не выполняется, DispatcherServlet
использует BeanNameUrlHandlerMapping
и DefaultAnnotationHandlerMapping
по умолчанию.
Когда целевой контроллер идентифицирован, DispatcherServlet
отправляет ему запрос. Контроллер выполняет некоторую работу в соответствии с запросом
(или делегировать его другим объектам) и возвращается к DispatcherServlet
с помощью Модели и имени представления.
Имя представления - это только логическое имя. Это логическое имя затем используется для поиска фактического представления (чтобы избежать связи с контроллером и конкретным представлением). Затем DispatcherServlet
ссылается на ViewResolver
и сопоставляет логическое имя представления с конкретной реализацией представления.
Некоторые возможные реализации ViewResolver
:
BeanNameViewResolver
;ContentNegotiatingViewResolver
;FreeMarkerViewResolver
;InternalResourceViewResolver
;JasperReportsViewResolver
;ResourceBundleViewResolver
;TilesViewResolver
;UrlBasedViewResolver
;VelocityLayoutViewResolver
;VelocityViewResolver
;XmlViewResolver
;XsltViewResolver
.Когда DispatcherServlet
определяет представление, которое будет отображать результаты, оно будет отображаться как ответ.
Наконец, DispatcherServlet
возвращает объект Response
обратно клиенту.
DispatcherServlet из Spring Структура веб-MVC - это реализация FrontController и является компонентом Java Servlet. то есть это фронт сервлета для приложения Spring Web Mvc.
DispatcherServlet t - это классы FrontController, которые получают все входящие запросы HTTP-клиента для приложения Spring Web mvc.
DispatcherServlet отвечает за инициализацию Spring web mvc framework для нашего приложения и представляет собой сервлет, реализованный как подтип HttpServlet, как и любой другой сервлет.
DispatcherServlet также необходимо настроить в нашем веб-приложении, как и любой другой сервлет, т.е. дескриптор развертывания веб-приложения (web.xml)
Мы можем настроить параметры инициализации, чтобы изменить поведение DispatcherServlet в отношении поиска файлов конфигурации XML Spring Beans и инициализации контекста приложения.
Я знаю, что этот вопрос отмечен как уже решенный, но я хочу добавить более новое изображение, подробно объясняющее этот шаблон (источник: spring в действии 4):
Объяснение
Когда запрос покидает браузер (1), он несет информацию о запросе пользователя. По крайней мере, запрос будет содержать запрошенный URL. Но он может также содержать дополнительные данные, такие как информация, представленная пользователем в форме.
Первая остановка в проходах запросов находится в Spring s DispatcherServlet. Как и большинство веб-фреймворков на основе Java, spring MVC запускает запросы с помощью одного сервлета переднего контроллера. Передний контроллер представляет собой общий шаблон веб-приложения, в котором один сервлет делегирует ответственность за запрос другим компонентам приложения для выполнения фактической обработки. В случае spring MVC DispatcherServlet является фронт-контроллером. Задача DispatcherServlets - отправить запрос на контроллер spring MVC. Контроллер представляет собой компонент spring, который обрабатывает запрос. Но типичное приложение может иметь несколько контроллеров, и DispatcherServlet нуждается в некоторой помощи, чтобы решить, какой контроллер отправить запрос. Поэтому DispatcherServlet обращается к одному или нескольким сопоставлениям обработчиков (2), чтобы выяснить, где будет следующая остановка запросов. При составлении своего решения при обращении с обработчиком особое внимание уделяется URL-адресу, переносимому запросом. После выбора соответствующего контроллера DispatcherServlet отправляет запрос по своему весовому пути выбранному контроллеру (3). На контроллере запрос сбрасывает свою полезную нагрузку (информацию, представленную пользователем) и терпеливо ждет, пока контроллер обрабатывает эту информацию. (На самом деле хорошо спроектированный контроллер практически не обрабатывает сам себя, а не делегирует ответственность за бизнес-логику одному или нескольким объектам службы.) Логика, выполняемая контроллером, часто приводит к некоторой информации, которая должна быть возвращена пользователю и отображена в браузере. Эта информация упоминается как модель. Но отправка исходной информации пользователю не является достаточной - ее нужно отформатировать в удобном для пользователя формате, обычно в формате HTML. Для этого информация должна быть предоставлена представлению, обычно странице JavaServer (JSP). Одна из последних вещей, которую выполняет контроллер, - это пакет данных модели и определить имя представления, которое должно отображать результат. Затем он отправляет запрос вместе с именем модели и представления обратно в DispatcherServlet (4). Чтобы контроллер не подключался к определенному виду, имя представления, переданное обратно в DispatcherServlet, напрямую не идентифицирует конкретный JSP. Он даже не предполагает, что представление является JSP. Вместо этого он содержит только логическое имя, которое будет использоваться для поиска фактического представления, которое приведет к результату. DispatcherServlet обращается к распознавателю вида (5), чтобы сопоставить имя логического представления с реализацией конкретного представления, которое может быть или не быть JSP. Теперь, когда DispatcherServlet знает, какое представление будет отображать результат, работа с запросами почти завершена. Его конечная остановка находится в представлении представления (6), обычно JSP, где он предоставляет данные модели. Работа с запросами завершена. Представление будет использовать данные модели для рендеринга вывода, который будет перенесен клиенту с помощью объекта (не-трудолюбивого) ответа (7).
Мы можем сказать, что DispatcherServlet
заботится обо всем в Spring MVC.
При запуске веб-контейнера:
DispatcherServlet
будет загружен и инициализирован вызовом
init()
методinit()
из DispatcherServlet
попытается идентифицировать Spring Конфигурационный документ с соглашениями об именах, например "servlet_name-servlet.xml"
, тогда можно идентифицировать все beans.Пример:
public class DispatcherServlet extends HttpServlet {
ApplicationContext ctx = null;
public void init(ServletConfig cfg){
// 1. try to get the spring configuration document with default naming conventions
String xml = "servlet_name" + "-servlet.xml";
//if it was found then creates the ApplicationContext object
ctx = new XmlWebApplicationContext(xml);
}
...
}
Итак, в общем DispatcherServlet
URI запроса на захват и передайте HandlerMapping
. HandlerMapping
сопоставление поиска bean с помощью метода контроллера, где контроллер возвращает логическое имя (представление). Затем это логическое имя отправляется на DispatcherServlet
на HandlerMapping
. Затем DispatcherServlet
сообщите ViewResolver
, чтобы дать полное местоположение просмотра, добавив префикс и суффикс, затем DispatcherServlet
дать представление клиенту.