Какой файл отвечает за конфигурацию диспетчерского сервлета при настройке через 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
- Получает все запросы в качестве фронт-контроллера и предоставляет единую точку входа в приложение
- Сопоставление запросов с правильным контроллером Spring MVC
- Проконсультируйтесь с ViewResolvers, чтобы найти правильное представление.
- Переадресация запроса выбранному представлению для рендеринга
- Возврат ответа клиенту
- Создает веб-контекст для инициализации веб-компонентов, таких как контроллеры, преобразователи представлений и сопоставление обработчиков.
Если вы используете аннотации, он также может использовать аннотации @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
Ниже на изображении описывается вся связь в одном представлении.
- ContextLoaderListener создает корневой контекст приложения.
- Записи DispatcherServlet создают один дочерний контекст приложения для каждой записи сервлета.
- Дочерние контексты могут получать доступ к компонентам, определенным в корневом контексте.
- Компоненты в корневом контексте не могут обращаться к компонентам в дочерних контекстах (напрямую).
- Все контексты добавляются в ServletContext .
- Вы можете получить доступ к корневому контексту с помощью класса 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.
Читайте также: