Что такое диспетчерский сервлет весной? - PullRequest
167 голосов
/ 05 мая 2010

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

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

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

Ответы [ 7 ]

181 голосов
/ 05 мая 2010

Работа 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 запросов, все, что может прийти в сервлет.

55 голосов
/ 18 ноября 2015

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

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

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

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

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

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

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

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

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

46 голосов
/ 05 мая 2010

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

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

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

31 голосов
/ 06 июня 2017

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

7 голосов
/ 07 декабря 2014

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

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

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

0 голосов
/ 02 апреля 2019
<?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 голосов
/ 19 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...