JavaRush/Курсы/Модуль 5. Spring/Конфигурация сервлетов

Конфигурация сервлетов

Открыта

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

В большинстве случаев MVC Config является лучшей отправной точкой. Он объявляет необходимые бины на Java или XML и предоставляет API обратного вызова конфигурации более высокого уровня для их настройки.

Spring Boot основывается на конфигурации MVC на Java для настройки Spring MVC и предоставляет множество дополнительных удобных опций.

1.1.4. Конфигурация сервлетов

В окружении Servlet 3.0+ есть возможность конфигурировать контейнер сервлетов программно в качестве альтернативы или в сочетании с файлом web.xml. В следующем примере регистрируется DispatcherServlet:

Java
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }
}
Kotlin
import org.springframework.web.WebApplicationInitializer
class MyWebApplicationInitializer : WebApplicationInitializer {
    override fun onStartup(container: ServletContext) {
        val appContext = XmlWebApplicationContext()
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
        val registration = container.addServlet("dispatcher", DispatcherServlet(appContext))
        registration.setLoadOnStartup(1)
        registration.addMapping("/")
    }
}

WebApplicationInitializer – это интерфейс, предоставляемый Spring MVC, который позволяет гарантировать обнаружение вашей реализации и её автоматическое использование для инициализации любого контейнера Servlet 3. Абстрактная реализация базового класса WebApplicationInitializer под названием AbstractDispatcherServletInitializer еще больше упрощает регистрацию DispatcherServlet, переопределяя методы для задания отображения сервлетов и местоположения конфигурации DispatcherServlet.

Это рекомендовано для приложений, использующих конфигурацию Spring на базе Java, как показано в следующем примере:

Java
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { MyWebConfig.class };
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}
Kotlin
class MyWebAppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
    override fun getRootConfigClasses(): Array<Class<*>>? {
        return null
    }
    override fun getServletConfigClasses(): Array<Class<*>>? {
        return arrayOf(MyWebConfig::class.java)
    }
    override fun getServletMappings(): Array<String> {
        return arrayOf("/")
    }
}

Если используется конфигурацию Spring на основе XML, то следует расширяться непосредственно из AbstractDispatcherServletInitializer, как показано в следующем примере:

Java
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}
Kotlin
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
    override fun createRootApplicationContext(): WebApplicationContext? {
        return null
    }
    override fun createServletApplicationContext(): WebApplicationContext {
        return XmlWebApplicationContext().apply {
            setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
        }
    }
    override fun getServletMappings(): Array<String> {
        return arrayOf("/")
    }
}

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

Java
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    // ...
    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] {
            new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
    }
}
Kotlin
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
    // ...
    override fun getServletFilters(): Array<Filter> {
        return arrayOf(HiddenHttpMethodFilter(), CharacterEncodingFilter())
    }
}

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

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

Наконец, если требуется дополнительно настроить сам DispatcherServlet, то можно переопределить метод createDispatcherServlet.

Комментарии (1)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Родион
Уровень 113
14 августа 2025, 15:27