«1. Обзор

В этой статье мы рассмотрим три разных подхода к настройке DispatcherServlet, доступных в последних версиях Spring Framework:

  1. We’ll start with an XML configuration and a web.xml file
  2. Then we’ll migrate the Servlet declaration from the web.xml file to Java config, but we’ll leave any other configuration in XML
  3. Finally in the third and final step of the refactoring, we’ll have a 100% Java-configured project

2. DispatcherServlet

Одной из основных концепций Spring MVC является DispatcherServlet. . Документация Spring определяет его следующим образом:

A central dispatcher for HTTP request handlers/controllers, e.g. for web UI controllers or HTTP-based remote service exporters. Dispatches to registered handlers for processing a web request, providing convenient mapping and exception handling facilities.

В основном DispatcherServlet является точкой входа каждого приложения Spring MVC. Его цель — перехватывать HTTP-запросы и направлять их нужному компоненту, который знает, как с ними обращаться.

3. Конфигурация с помощью web.xml

Если вы имеете дело с устаревшими проектами Spring, очень часто можно найти XML-конфигурацию, и до Spring 3.1 единственным способом настройки DispatcherServlet был файл WEB-INF/web.xml. . В этом случае необходимо выполнить два шага.

Давайте рассмотрим пример конфигурации. Первым шагом является объявление сервлета:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

С помощью этого блока XML мы объявляем сервлет, который:

  1. Is named “dispatcher
  2. Is an instance of org.springframework.web.servlet.DispatcherServlet
  3. Will be initialized with a parameter named contextConfigLocation which contains the path to the configuration XML

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

Теперь наш сервлет настроен. Второй шаг — объявление сопоставления сервлета:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

С помощью сопоставления сервлета мы связываем его по имени с шаблоном URL, указывающим, какие HTTP-запросы будут обрабатываться им.

4. Гибридная конфигурация

С принятием API сервлетов версии 3.0 файл web.xml стал необязательным, и теперь мы можем использовать Java для настройки DispatcherServlet.

Мы можем зарегистрировать сервлет, реализующий WebApplicationInitializer. Это эквивалент конфигурации XML выше:

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext context = new XmlWebApplicationContext();
        context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));

        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

В этом примере мы:

  1. Implementing the WebApplicationInitializer interface
  2. Overriding the onStartup method we create a new XmlWebApplicationContext configured with the same file passed as contextConfigLocation to the servlet in the XML example
  3. Then we are creating an instance of DispatcherServlet with the new context that we just instantiated
  4. And finally we are registering the servlet with a mapping URL pattern

Итак, мы использовали Java для объявления сервлета и привязки его к отображению URL, но мы сохранили конфигурацию в отдельном файле XML. : диспетчер-config.xml.

5. Конфигурация 100% Java

При таком подходе наш сервлет объявлен на Java, но для его настройки нам по-прежнему нужен файл XML. С помощью WebApplicationInitializer вы можете достичь 100% конфигурации Java.

Давайте посмотрим, как мы можем реорганизовать предыдущий пример.

Первое, что нам нужно сделать, это создать контекст приложения для сервлета.

На этот раз мы будем использовать контекст на основе аннотаций, чтобы мы могли использовать Java и аннотации для настройки и устранить необходимость в XML-файлах, таких как диспетчер-config.xml:

AnnotationConfigWebApplicationContext context
  = new AnnotationConfigWebApplicationContext();

Этот тип контекста затем можно настроить регистрация класса конфигурации:

context.register(AppConfig.class);

Или установка всего пакета, который будет сканироваться на наличие классов конфигурации:

context.setConfigLocation("com.example.app.config");

Теперь, когда контекст нашего приложения создан, мы можем добавить прослушиватель в ServletContext, который будет загружать контекст:

container.addListener(new ContextLoaderListener(context));

Следующий шаг — создание и регистрация нашего диспетчерского сервлета:

ServletRegistration.Dynamic dispatcher = container
  .addServlet("dispatcher", new DispatcherServlet(context));

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");

Теперь наш WebApplicationInitializer должен выглядеть следующим образом:

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context
          = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.example.app.config");

        container.addListener(new ContextLoaderListener(context));

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));
        
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

Конфигурация Java и аннотаций дает много преимуществ. Обычно это приводит к более короткой и лаконичной конфигурации, а аннотации предоставляют больше контекста объявлениям, поскольку они расположены вместе с кодом, который они настраивают.

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

6. Заключение

В этой статье мы рассмотрели различные способы настройки DispatcherServlet в Spring 3.2+, и вам решать, какой из них использовать, исходя из ваших предпочтений. Весна приспособится к вашему решению, что бы вы ни выбрали.

Вы можете найти исходный код из этой статьи на Github здесь и здесь.