JavaRush /Курсы /Spring /DispatcherServlet

DispatcherServlet

Spring
4 уровень , 0 лекция
Открыта

Spring MVC, как и многие другие веб-фреймворки, разработан по проектному шаблону "единой точки входа (front controller)", где центральный Servlet, DispatcherServlet, обеспечивает общий алгоритм обработки запросов, а фактическая работа выполняется настраиваемыми компонентами-делегатами. Эта модель является гибкой и поддерживает различные рабочие процессы.

DispatcherServlet, как и любой другой Servlet, необходимо объявлять и отображать в соответствии со спецификацией сервлетов с помощью конфигурации Java или в web.xml. В свою очередь, DispatcherServlet использует конфигурацию Spring для обнаружения компонентов-делегатов, необходимых ему для отображения запросов, распознавание представлений, обработки исключений и т. д.

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

Java
public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        // Загружаем конфигурацию веб-приложения Spring
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AppConfig.class);
        // Создаем и регистрируем DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}
Kotlin
class MyWebApplicationInitializer : WebApplicationInitializer {
    override fun onStartup(servletContext: ServletContext) {
        // Загружаем конфигурацию веб-приложения Spring
        val context = AnnotationConfigWebApplicationContext()
        context.register(AppConfig::class.java)
        // Создаем и регистрируем DispatcherServlet
        val servlet = DispatcherServlet(context)
        val registration = servletContext.addServlet("app", servlet)
        registration.setLoadOnStartup(1)
        registration.addMapping("/app/*")
    }
}
Помимо использования ServletContext API напрямую, также можно расширить AbstractAnnotationConfigDispatcherServletInitializer и переопределить заданные методы.
Для программных случаев использования в качестве альтернативы AnnotationConfigWebApplicationContext может использоваться GenericWebApplicationContext.

Следующий пример конфигурации web.xml регистрирует и инициализирует DispatcherServlet:

<web-app>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-context.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
</web-app>
Spring Boot придерживается иной последовательности инициализации. Вместо того чтобы выполнять привязку к жизненному циклу контейнера сервлетов, Spring Boot использует конфигурацию Spring для начальной самозагрузки и начальной загрузки встроенного контейнера сервлетов. Объявления Filter и Servlet обнаруживаются в конфигурации Spring и регистрируются в контейнере сервлетов.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ