it-roy-ru.com

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

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

enter image description here

Мой вопрос заключается в том, что делает Dispatcher Servlet ?

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

165
Kevin

Задача DispatcherServlet состоит в том, чтобы взять входящий URI и найти правильную комбинацию обработчиков (обычно это методы для классов Controller) и представлений (обычно это JSP), которые объединяются для формирования страница или ресурс, который должен быть найден в этом месте.

Я мог бы иметь

  • файл /WEB-INF/jsp/pages/Home.jsp
  • и метод в классе

    @RequestMapping(value="/pages/Home.html")
    private ModelMap buildHome() {
        return somestuff;
    }
    

Dispatcher servlet - это бит, который "знает", чтобы вызвать этот метод, когда браузер запрашивает страницу, и объединить его результаты с соответствующим файлом JSP для создания HTML-документа.

Как это достигается, сильно зависит от конфигурации и версии Spring.

Также нет причины, по которой конечным результатом должны быть веб-страницы. Он может сделать то же самое, чтобы найти RMI конечные точки, обработать SOAP запросы, все, что может попасть в сервлет.

181
Affe

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

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

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

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

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

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

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

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

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

52
Aleksey Bykov

DispatcherServlet - реализация Spring MVC шаблон фронт-контроллера .

См. Описание в документации Spring здесь .

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

46
skaffman

Я знаю, что этот вопрос помечен как уже решенный, но я хочу добавить более новое изображение, подробно объясняющее этот паттерн (источник: spring in action 4):

enter image description here

Объяснение

Когда запрос покидает браузер (1) , он несет информацию о том, что запрашивает пользователь. По крайней мере, запрос будет содержать запрошенный URL. Но он также может содержать дополнительные данные, такие как информация, представленная пользователем в форме.

Первая остановка в запросах - в DispatcherServlet Spring. Как и большинство веб-фреймворков на основе Java, Spring MVC направляет запросы через один сервлет фронт-контроллера. Фронт-контроллер - это общий шаблон веб-приложения, в котором один сервлет делегирует ответственность за запрос другим компонентам приложения для выполнения фактической обработки. В случае Spring MVC DispatcherServlet является фронт-контроллером. Задача DispatcherServlet - отправить запрос на контроллер Spring MVC. Контроллер - это компонент Spring, который обрабатывает запрос. Но типичное приложение может иметь несколько контроллеров, и DispatcherServlet нужна помощь, чтобы решить, на какой контроллер отправить запрос. Таким образом, DispatcherServlet обращается к одному или нескольким сопоставлениям обработчиков (2) , чтобы выяснить, где будет следующая остановка запроса. При сопоставлении обработчик обращает особое внимание на URL-адрес, передаваемый запросом. Как только соответствующий контроллер был выбран, DispatcherServlet отправляет запрос по своему пути к выбранному контроллеру (3) . На контроллере запрос сбрасывает свою полезную нагрузку (информацию, представленную пользователем) и терпеливо ждет, пока контроллер обработает эту информацию. (На самом деле, хорошо спроектированный контроллер сам выполняет небольшую обработку или не выполняет ее и вместо этого передает ответственность за бизнес-логику одному или нескольким сервисным объектам.) Логика, выполняемая контроллером, часто приводит к некоторой информации, которую необходимо перенести обратно. пользователь и отображается в браузере. Эта информация называется моделью. Но отправка необработанной информации обратно пользователю недостаточна - ее необходимо отформатировать в удобном для пользователя формате, обычно в HTML. Для этого информация должна быть передана в представление, обычно на страницу JavaServer (JSP). Одна из последних вещей, которые выполняет контроллер, - упаковывает данные модели и идентифицирует имя представления, которое должно отображать выходные данные. Затем он отправляет запрос вместе с именем модели и вида обратно в DispatcherServlet (4) . Чтобы контроллер не был связан с конкретным представлением, имя представления, переданное обратно в DispatcherServlet, напрямую не идентифицирует конкретную JSP. Это даже не означает, что представление является JSP. Вместо этого он несет только логическое имя, которое будет использоваться для поиска фактического представления, которое будет давать результат. DispatcherServlet консультируется с преобразователем представления (5) для сопоставления имени логического представления с конкретной реализацией представления, которая может быть или не быть JSP. Теперь, когда DispatcherServlet знает, какое представление будет отображать результат, работа запроса почти завершена. Его последняя остановка в реализации представления (6) , обычно JSP, куда он доставляет данные модели. Работа с запросом окончательно выполнена. Представление будет использовать данные модели для визуализации вывода, который будет передан клиенту (не очень трудоемким) объектом ответа (7) ,.

31
Eduardo

Мы можем сказать, как DispatcherServlet заботиться обо всем в Spring MVC.

При запуске веб-контейнера:

  1. DispatcherServlet будет загружено и инициализировано путем вызова метода init()
  2. init() из DispatcherServlet попытается идентифицировать конфигурационный документ Spring с соглашениями об именах, такими как "servlet_name-servlet.xml", после чего все бины могут быть идентифицированы.

Пример:

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 бин отображения поиска с методом контроллера, где контроллер возвращает логическое имя (представление). Затем это логическое имя отправляется DispatcherServletHandlerMapping. Затем DispatcherServlet скажите ViewResolver указать полное местоположение просмотра, добавив префикс и суффикс, затем DispatcherServlet предоставит представление клиенту.

6
user2663609

Диспетчер диспетчера показан на рисунке, все входящие запросы перехвачены сервлетом диспетчера, который работает в качестве фронт-контроллера. Сервлет диспетчера получает запись для сопоставления обработчика из файла XML и передает запрос в контроллер.

0
anjali shrivas
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
    <context:component-scan base-package="com.demo" />
    <context:annotation-config />

    <mvc:annotation-driven />


    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="datasource" />
    </bean> 

          <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
        <property name="url" value="jdbc:mysql://localhost:3306/employee" />
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean> 

</beans>
0
kartik