Что такое диспетчерский сервлет в Spring?

В этом изображении (которое я получил от здесь), HTTP-запрос отправляет что-то в диспетчерский сервлет.

enter image description here

Мой вопрос - что делает диспетчер сервлета?

Это что-то вроде получения информации, выброшенной с веб-страницы и отправки ее на контроллер?

Ответ 1

Задача 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, все, что может попасть в сервлет.

Ответ 2

DispatcherServlet - это Spring реализация MVC шаблона переднего контроллера .

См. описание в Spring docs здесь.

По сути, это сервлет, который принимает входящий запрос и делегирует обработку этого запроса одному из нескольких обработчиков, сопоставление которых специфично в конфигурации DispatcherServlet.

Ответ 3

В Spring MVC все входящие запросы проходят через один сервлет. Этот сервлет - DispatcherServlet - это передний контроллер. Передний контроллер является типичным шаблоном проектирования в разработке веб-приложений. В этом случае один сервлет получает все запросы и передает их всем остальным компонентам приложения.

Задача DispatcherServlet - отправить запрос конкретному контроллеру MVC Spring.

Обычно у нас много контроллеров, а DispatcherServlet относится к одному из следующих картографов, чтобы определить целевой контроллер:

Если конфигурация не выполняется, DispatcherServlet использует BeanNameUrlHandlerMapping и DefaultAnnotationHandlerMapping по умолчанию.

Когда целевой контроллер идентифицирован, DispatcherServlet отправляет ему запрос. Контроллер выполняет некоторую работу в соответствии с запросом (или делегировать его другим объектам) и возвращается к DispatcherServlet с помощью Модели и имени представления.

Имя представления - это только логическое имя. Это логическое имя затем используется для поиска фактического представления (чтобы избежать связи с контроллером и конкретным представлением). Затем DispatcherServlet ссылается на ViewResolver и сопоставляет логическое имя представления с конкретной реализацией представления.

Некоторые возможные реализации ViewResolver:

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

Наконец, DispatcherServlet возвращает объект Response обратно клиенту.

Ответ 4

  • 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 и инициализации контекста приложения.

  • Ниже изображено описание DispatcherServlet введите описание изображения здесь

Ответ 5

Я знаю, что этот вопрос отмечен как уже решенный, но я хочу добавить более новое изображение, подробно объясняющее этот шаблон (источник: 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).

Ответ 6

Мы можем сказать, что 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 дать представление клиенту.