Какой файл отвечает за конфигурацию диспетчерского сервлета при настройке через xml

Обновлено: 21.11.2024

Привет, ребята! В сегодняшней статье мы собираемся обсудить одну интересную и важную концепцию Spring MVC, которая также является популярным вопросом Spring Interview. Как DispatcherServlet работает внутри Spring MVC или какова роль DispatcherServlet в Spring MVC — вот некоторые из наиболее часто задаваемых вопросов на интервью Spring MVC. Возможно, вы уже видели их во время ваших предыдущих интервью по веб-разработке Java, но если вы этого не сделали, это хороший вопрос, чтобы знать. В этой статье я отвечу на эти вопросы, объяснив что такое DispatcherServlet и его важность в Spring MVC. DispatcherServlet является одним из важных компонентов веб-фреймворка Spring MVC и действует как передний контроллер.

Подобно другим веб-фреймворкам Java, таким как Struts 1.x и Struts 2.x, Spring MVC также использует передний контроллер (см. Шаблоны архитектуры корпоративных приложений) для получения всех входящих запросов и делегирования другим компонентам. для дальнейшей обработки, такой как контроллеры Spring MVC, которые аннотируются с помощью аннотации @Controller и ViewResolvers, таких как класс InternalResourceViewResolver.

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

Как DispatcherServlet узнает, какой запрос следует перенаправить на какой контроллер? Ну, Spring использует для этого обработчики сопоставления, которые я объясню вам в следующем разделе, когда мы увидим, как DispatcherServlet работает внутри.

Помимо того, что DispatcherServlet является фронт-контроллером, он также играет важную роль в разрешении представления, обработке ошибок, разрешении локали, разрешении темы и т. д. Кстати, если вы не знакомы со Spring в целом и Spring MVC в частности, вам следует также присоединяйтесь к курсу Spring Framework 5: от новичка до гуру на Udemy, одному из самых современных курсов по среде Spring, который также охватывает Spring 5.0.

Как настроить DispatcherServlet в Spring?

DispatcherServlet подобен любому другому классу сервлетов и должен быть объявлен внутри дескриптора развертывания или файла web.xml, как показано ниже:


Его шаблон URL обычно имеет "*", поэтому все входящие запросы должны проходить через сервлет Dispatcher, как показано ниже:


Я не показывал это здесь, но DispatcherServlet также обычно предварительно загружается с использованием тега load-on-startup дескриптора развертывания. Вы можете указать нулевое или положительное значение этого тега для предварительной загрузки сервлета, в противном случае сервлет будет загружаться только при появлении запроса.

Если ваш сервлет выполняет много заданий при инициализации, например DispatcherServlet, который инициализирует все bean-компоненты, объявленные в своем веб-контексте, такие как контроллеры, преобразователи представлений и обработчики сопоставления, то это может замедлить время отклика.


Кстати, это не единственный способ объявить DispatcherServlet в Spring MVC. Из спецификации Spring 3.2 и Servlet 3.0 вы можете программно объявить DispatcherServlet с помощью интерфейса ServletContainerInitializer.

Это функция Servlet 3,0, которая позволяет совместимым с Servlet 3.0 контейнерам, таким как Tomcat 7 или выше, сканировать и загружать любой класс, реализующий этот интерфейс.

Spring предоставляет реализацию этого интерфейса как SpringServletContainerInitializer и удобный класс AbstractAnnotationConfigDispatcherServletInitialzer в Spring 3.2 для настройки DispatcherServlet без дескриптора развертывания.

Этот класс реализует SpringServletContainerInitializer, поэтому автоматически выбирается контейнерами, совместимыми с Servlet 3.0. См. «Введение в Spring MVC» Брайана Хансена на Pluralsight, чтобы узнать больше о настройке DispatcherServlet с использованием конфигурации Java.

Как сервлет Dispatcher работает внутри Spring?

Как я уже сказал, у DispatcherServlet в Spring много шляп. Он действует как передний контроллер и обеспечивает единую точку входа для приложения. Затем он использует сопоставления обработчиков и адаптеры обработчиков для сопоставления запроса с контроллерами Spring MVC. Для этой цели используются аннотации @Controller и @RequestMapping.

После обработки запроса контроллером Spring MVC он возвращает логическое имя представления вместо представления. Однако вы даже можете настроить методы обработчика контроллера так, чтобы они не возвращали какое-либо имя представления, объявив тип возвращаемого значения как недействительный.

Когда DispatherServlet получает имя представления, он обращается к ViewResolver, чтобы найти правильное представление. Существует цепочка ViewResolver, которая поддерживается в среде Spring MVC. Они пытаются преобразовать имя логического представления в физический ресурс, такой как страница JSP или шаблон FreeMaker или Velocity.

ViewResolver вызывается по порядку: если первый в цепочке не может разрешить представление, он возвращает значение null и обращается к следующему ViewResolver в цепочке.

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

По умолчанию DispatcherServlet использует InternalResourceViewResolver, который использует префикс и суффикс для преобразования имени логического представления, например. "home" в /WEB-INF/home.jsp . Интерфейс View также имеет метод getContentType(), который возвращает тип контента, создаваемый представлением ( JstlView имеет text/HTML ). Обычно это тип содержимого по умолчанию для запросов, обрабатываемых сервлетом-диспетчером в Spring. См. Spring MVC для начинающих в курсе «25 шагов», чтобы узнать больше об обработке запросов в Spring MVC.

Вот хорошая диаграмма, которая объясняет, как DispatcherServlet работает внутри Spring MVC

  1. Получает все запросы в качестве фронт-контроллера и предоставляет единую точку входа в приложение
  2. Сопоставление запросов с правильным контроллером Spring MVC
  3. Проконсультируйтесь с ViewResolvers, чтобы найти правильное представление.
  4. Переадресация запроса выбранному представлению для рендеринга
  5. Возврат ответа клиенту
  6. Создает веб-контекст для инициализации веб-компонентов, таких как контроллеры, преобразователи представлений и сопоставление обработчиков.

Если вы используете аннотации, он также может использовать аннотации @Controller и @RequestMapping, чтобы найти правильный контроллер для обработки определенного запроса. Как только запрос обработан контроллером, он возвращает имя логического представления DispatcherServlet .

Затем DispatcherServlet консультируется с ViewResolvers и LocalResolvers, чтобы найти правильное представление для вывода вывода. После выбора правильного представления запрос перенаправляется в представление для обработки ответа.

  • Как Spring MVC работает внутри? (ответ)
  • Разница между @RestController и @Controller? (ответ)
  • 15 вопросов для собеседования по Spring Boot для разработчиков Java (вопросы)
  • 3 способа лучше изучить Spring Framework (статья)
  • Бесплатные курсы по изучению Spring MVC и Spring Boot (курсы)
  • Расширенные курсы Spring Boot для разработчиков Java (курсы)
  • Как включить безопасность Spring в приложениях Java? (ответ)
  • 15 лучших онлайн-курсов по Java и Spring от Udemy (курсы)
  • Помогает ли сертификация Spring в работе и карьере? (статья)
  • Как подготовиться к весенней сертификации? (руководство)
  • 3 передовых метода, которым Java-разработчики могут научиться у Spring (статья)
  • Разница между аннотациями @Autowired и @Injection в Spring? (ответ)
  • 5 онлайн-курсов Spring и Hibernate для разработчиков Java (список)
  • 5 курсов Spring Boot для разработчиков Java (курсы)
  • 5 курсов по изучению микросервисов с Spring Boot и Spring Cloud (курсы)

Спасибо, что прочитали эту статью. Если вам понравился этот вопрос для интервью, поделитесь им с друзьями и коллегами. Если у вас есть какие-либо вопросы или предложения, оставьте комментарий, и я постараюсь найти для вас ответ.

Веб-фреймворк Spring MVC, как и многие другие веб-фреймворки MVC, управляется запросами, разработан вокруг центрального сервлета, который отправляет запросы контроллерам и предлагает другие функции, облегчающие разработку веб-приложений. Однако DispatcherServlet Spring делает больше, чем просто это. Он полностью интегрирован с контейнером Spring IoC и, таким образом, позволяет вам использовать все остальные функции Spring.

Рабочий процесс обработки запросов Spring Web MVC DispatcherServlet показан на следующей диаграмме. Читатель, разбирающийся в шаблонах, поймет, что DispatcherServlet является выражением шаблона проектирования «Front Controller» (это шаблон, который Spring Web MVC разделяет со многими другими ведущими веб-фреймворками).

Рабочий процесс обработки запросов в Spring Web MVC (высокий уровень)

В предыдущем примере все запросы, оканчивающиеся на .form, будут обрабатываться примером DispatcherServlet .Это только первый шаг в настройке Spring Web MVC. Теперь вам нужно настроить различные bean-компоненты, используемые инфраструктурой Spring Web MVC (помимо самого DispatcherServlet).

Как подробно описано в Разделе 3.13, «Дополнительные возможности ApplicationContext», экземпляры ApplicationContext в Spring могут иметь область действия. В среде Web MVC каждый DispatcherServlet имеет свой собственный WebApplicationContext, который наследует все bean-компоненты, уже определенные в корневом WebApplicationContext. Эти определенные унаследованные bean-компоненты могут быть переопределены в области, специфичной для сервлета, и вы можете определить новые bean-компоненты, зависящие от области, локально для данного экземпляра сервлета.

При инициализации DispatcherServlet платформа ищет файл с именем [servlet-name]-servlet.xml в каталоге WEB-INF вашего веб-приложения и создайте бины, определенные там, переопределяя определения любых бинов, определенных с тем же именем в глобальной области.

Рассмотрите следующую конфигурацию сервлета DispatcherServlet (в файле web.xml):

С приведенной выше конфигурацией сервлета вам потребуется файл с именем /WEB-INF/golfing-servlet.xml в вашем приложении; этот файл будет содержать все ваши специфичные для Spring Web MVC компоненты (бины). Вы можете изменить точное местоположение этого файла конфигурации с помощью параметра инициализации сервлета (подробности см. ниже).

WebApplicationContext — это расширение простого ApplicationContext, которое имеет некоторые дополнительные функции, необходимые для веб-приложений. Он отличается от обычного ApplicationContext тем, что способен разрешать темы (см. Раздел 15.7, «Использование тем») и знает, с каким сервлетом он связан (имея ссылку на ServletContext). WebApplicationContext привязан к ServletContext, и с помощью статических методов класса RequestContextUtils вы всегда можете найти WebApplicationContext, если вам нужен доступ к нему.

Spring DispatcherServlet использует специальные bean-компоненты для обработки запросов и отображения соответствующих представлений. Эти bean-компоненты являются частью Spring Framework. Вы можете настроить их в WebApplicationContext так же, как вы настраиваете любой другой компонент. Однако для большинства bean-компонентов предусмотрены разумные значения по умолчанию, поэтому вам изначально не нужно их настраивать. Эти компоненты описаны в следующей таблице.

Таблица 15.1. Специальные компоненты в WebApplicationContext

Тип бобаПояснение
контроллерыСформируйте C-часть MVC.
сопоставления обработчиковОбрабатывать выполнение списка препроцессоров, постпроцессоров и контроллеров, которые будут выполняться, если они соответствуют определенным критерии (например, соответствующий URL-адрес, указанный в контроллере).
просмотреть распознаватели Преобразует имена представлений в представления.
преобразователь локалиПреобразователь локали — это компонент, способный определять локаль, которую использует клиент, чтобы иметь возможность предлагать интернационализированные представления
Преобразователь темыРаспознаватель тем может разрешать темы, которые может использовать ваше веб-приложение, например, для предложения персонализированных макетов
преобразователь файлов с несколькими частямиСодержит функции для обработки загрузки файлов из HTML-форм.
преобразователи исключений обработчиков Содержит функции для сопоставления исключений с представлениями или реализации другого более сложного кода обработки исключений.

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

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

Распознаватель локали привязан к запросу, чтобы позволить элементам в процессе определять локаль, используемую при обработке запроса (рендеринг представления, подготовка данных и т. д.). Если вам не нужно разрешение локали, оно вам не нужно.

Распознаватель темы привязан к запросу, чтобы такие элементы, как представления, определяли, какую тему использовать. Если вы не используете темы, вы можете игнорировать это.

Выполняется поиск подходящего обработчика. Если обработчик найден, цепочка выполнения, связанная с обработчиком (препроцессоры, постпроцессоры и контроллеры), выполняется для подготовки модели или визуализации.

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

Преобразователи исключений обработчика, объявленные в WebApplicationContext, перехватывают исключения, возникающие во время обработки запроса. Использование этих распознавателей исключений позволяет определить настраиваемое поведение для обработки исключений.

Spring DispatcherServlet также поддерживает возврат last-modification-date , как указано в Servlet API. Процесс определения даты последней модификации для конкретного запроса прост: DispatcherServlet ищет соответствующее сопоставление обработчика и проверяет, реализует ли найденный обработчик интерфейс LastModified. Если да, то клиенту возвращается значение длинного метода getLastModified(request) интерфейса LastModified.

В конфигурации Spring MVC на основе XML вы должны были видеть два объявления в файле web.xml, то есть ContextLoaderListener и DispatcherServlet . Давайте попробуем понять их назначение во фреймворке и их различия.

Корневой и дочерний контексты

Прежде чем читать дальше, поймите, что –

  • В Spring может быть несколько контекстов одновременно. Один из них будет корневым контекстом, а все остальные контексты будут дочерними контекстами.
  • Все дочерние контексты могут получить доступ к bean-компонентам, определенным в корневом контексте; но обратное неверно. Корневой контекст не может получить доступ к bean-компонентам дочерних контекстов.

DispatcherServlet — контексты дочернего приложения

Когда вы определяете DispatcherServlet в конфигурации spring, вы предоставляете XML-файл с записями классов контроллеров, сопоставлений представлений и т. д., используя атрибут contextConfigLocation.

Если вы не предоставите файл конфигурации, он загрузит свой собственный файл конфигурации, используя [servlet_name]-servlet.xml . Веб-приложения могут определять любое количество записей DispatcherServlet. Каждый сервлет будет работать в своем собственном пространстве имен, загружая собственный контекст приложения с сопоставлениями, обработчиками и т. д.

Это означает, что каждый DispatcherServlet имеет доступ к контексту веб-приложения. Пока не указано иное, каждый DispatcherServlet создает собственный внутренний контекст веб-приложения.

Начиная с Spring 3.x, метод DispatcherServlet(WebApplicationContext webApplicationContext) создает новый DispatcherServlet с заданным контекстом веб-приложения. Это возможно только в среде Servlet 3.x через поддержку API ServletContext.addServlet(java.lang.String, java.lang.String).

ContextLoaderListener — корневой контекст приложения

ContextLoaderListener создает контекст корневого приложения и будет использоваться совместно с дочерними контекстами, созданными всеми контекстами DispatcherServlet. У вас может быть только одна запись об этом в web.xml .

Контекст ContextLoaderListener содержит глобально видимые компоненты, такие как сервисы, репозитории, компоненты инфраструктуры и т. д. После создания контекста корневого приложения он сохраняется в ServletContext в качестве атрибута под следующим именем:

Чтобы получить корневой контекст приложения в контроллере Spring, вы можете использовать класс WebApplicationContextUtils.

ContextLoaderListener и DispatcherServlet

Ниже на изображении описывается вся связь в одном представлении.

  1. ContextLoaderListener создает корневой контекст приложения.
  2. Записи DispatcherServlet создают один дочерний контекст приложения для каждой записи сервлета.
  3. Дочерние контексты могут получать доступ к компонентам, определенным в корневом контексте.
  4. Компоненты в корневом контексте не могут обращаться к компонентам в дочерних контекстах (напрямую).
  5. Все контексты добавляются в ServletContext .
  6. Вы можете получить доступ к корневому контексту с помощью класса WebApplicationContextUtils.

Обзор

Как правило, вы определяете все компоненты, связанные с MVC (контроллер, представления и т. д.), в контексте DispatcherServlet, а все сквозные компоненты, такие как безопасность, транзакции, службы и т. д., — в корневом контексте с помощью ContextLoaderListener .

Как правило, эта настройка работает нормально, потому что вам редко требуется доступ к какому-либо компоненту MVC (из дочернего контекста) в класс, связанный с безопасностью (из корневого контекста). В основном мы используем bean-компоненты безопасности в классах MVC, и они могут получить к ним доступ с помощью вышеуказанной настройки.

Среда Spring Web MVC предоставляет архитектуру Model-View-Controller (MVC) и готовые компоненты, которые можно использовать для разработки гибких и слабо связанных веб-приложений. Шаблон MVC приводит к разделению различных аспектов приложения (логика ввода, бизнес-логика и логика пользовательского интерфейса), обеспечивая при этом слабую связь между этими элементами.

Модель инкапсулирует данные приложения, и обычно они состоят из POJO.

Представление отвечает за рендеринг данных модели и, как правило, генерирует выходные данные HTML, которые может интерпретировать браузер клиента.

Контроллер отвечает за обработку пользовательских запросов и создание соответствующей модели и передает ее в представление для рендеринга.

Сервлет Dispatcher

Контроллер принимает запрос и вызывает соответствующие методы службы на основе используемого метода GET или POST. Метод службы установит данные модели на основе определенной бизнес-логики и вернет имя представления в DispatcherServlet.

DispatcherServlet воспользуется помощью ViewResolver, чтобы подобрать определенное представление для запроса.

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

Все вышеупомянутые компоненты, т. е. HandlerMapping, Controller и ViewResolver, являются частями WebApplicationContext, который является расширением простого ApplicationContext с некоторыми дополнительными функциями, необходимыми для работы в Интернете. приложения.

Необходимая конфигурация

Вам необходимо сопоставить запросы, которые должен обрабатывать DispatcherServlet, с помощью сопоставления URL-адресов в файле web.xml. Ниже приведен пример, показывающий объявление и сопоставление для примера HelloWeb DispatcherServlet

Файл web.xml будет храниться в каталоге WebContent/WEB-INF вашего веб-приложения. После инициализации HelloWeb DispatcherServlet платформа попытается загрузить контекст приложения из файла с именем [servlet-name]-servlet.xml, расположенного в каталоге WebContent/WEB-INF приложения. В этом случае наш файл будет HelloWebservlet.xml.

Если вы не хотите использовать имя файла по умолчанию [servlet-name]-servlet.xml и местоположение по умолчанию WebContent/WEB-INF, вы можете настроить это имя файла и местоположение, добавив прослушиватель сервлета ContextLoaderListener в ваш файл web.xml следующим образом —

Теперь давайте проверим необходимую конфигурацию для файла HelloWeb-servlet.xml, помещенного в каталог WebContent/WEB-INF вашего веб-приложения –

Ниже приведены важные моменты, касающиеся файла HelloWeb-servlet.xml.

Файл [servlet-name]-servlet.xml будет использоваться для создания определенных bean-компонентов, переопределяя определения любых bean-компонентов, определенных с тем же именем в глобальной области.

Тег будет использоваться для активации возможности сканирования аннотаций Spring MVC, которая позволяет использовать аннотации, такие как @Controller и @RequestMapping и т. д.

В InternalResourceViewResolver будут определены правила для разрешения имен представлений. В соответствии с указанным выше правилом логическое представление с именем hello делегируется реализации представления, расположенной по адресу /WEB-INF/jsp/hello.jsp .

В следующем разделе показано, как создавать настоящие компоненты, т. е. контроллер, модель и представление.

Определение контроллера

DispatcherServlet делегирует запрос контроллерам для выполнения специфичных для него функций. Аннотация @Controller указывает, что конкретный класс выполняет роль контроллера. Аннотация @RequestMapping используется для сопоставления URL-адреса либо с целым классом, либо с определенным методом обработчика.

Вы можете написать приведенный выше контроллер в другой форме, где вы можете добавить дополнительные атрибуты в @RequestMapping следующим образом —

Вы определите необходимую бизнес-логику внутри метода службы. Вы можете вызвать другой метод внутри этого метода в соответствии с требованиями.

На основе определенной бизнес-логики вы создадите модель в рамках этого метода. Вы можете использовать разные атрибуты модели, и эти атрибуты будут доступны для представления для представления окончательного результата. В этом примере создается модель с атрибутом «сообщение».

Определенный метод службы может возвращать строку, содержащую имя представления, используемого для визуализации модели. В этом примере в качестве логического имени представления возвращается "hello".

Создание представлений JSP

Spring MVC поддерживает множество типов представлений для различных технологий представления. К ним относятся JSP, HTML, PDF, рабочие листы Excel, XML, шаблоны Velocity, XSLT, JSON, Atom и RSS-каналы, JasperReports и т. д. Но чаще всего мы используем шаблоны JSP, написанные с помощью JSTL.

Давайте напишем простое приветственное представление в /WEB-INF/hello/hello.jsp —

Здесь $ — это атрибут, который мы установили внутри контроллера. У вас может быть несколько атрибутов, которые будут отображаться в вашем представлении.

Примеры Spring Web MVC Framework

Основываясь на приведенных выше концепциях, давайте рассмотрим несколько важных примеров, которые помогут вам в создании веб-приложений Spring.

В этом примере объясняется, как написать простое приложение Spring Web Hello World.

В этом примере объясняется, как написать веб-приложение Spring с использованием HTML-форм для отправки данных в контроллер и отображения обработанного результата.

Узнайте, как использовать функцию перенаправления страниц в Spring MVC Framework.

Узнайте, как получить доступ к статическим страницам наряду с динамическими страницами в Spring MVC Framework.

Читайте также: