web.xml против инициализатора со Spring

web.xml vs Initializer with Spring

1. обзор

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

  1. Начнем с конфигурацииXML и файлаweb.xml

  2. Затем мы перенесем объявление сервлета из файлаweb.xml в конфигурацию Java, но оставим любую другую конфигурацию вXML

  3. Наконец, на третьем и последнем этапе рефакторинга у нас будет проект, полностью настроенный на Java.

2. DispatcherServlet

Одной из основных концепцийSpring MVC являетсяDispatcherServlet. Spring documentation определяет это как:

Центральный диспетчер для обработчиков / контроллеров HTTP-запросов, например, для контроллеров веб-интерфейса или экспортеров удаленных услуг на основе HTTP. Отправляет зарегистрированным обработчикам для обработки веб-запроса, предоставляя удобные средства отображения и обработки исключений.

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

3. Конфигурация сweb.xml

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

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


    dispatcher
    
        org.springframework.web.servlet.DispatcherServlet
    
    
        contextConfigLocation
        /WEB-INF/spring/dispatcher-config.xml
    
    1

В этом блокеXML мы объявляем сервлет, который:

  1. Называется «dispatcher»

  2. Является экземпляромorg.springframework.web.servlet.DispatcherServlet

  3. Будет инициализирован параметром с именемcontextConfigLocation, который содержит путь к конфигурацииXML

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

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


    dispatcher
    /

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

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

С принятием версии 3.0Servlet APIs файл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. Реализация интерфейсаWebApplicationInitializer

  2. Переопределив методonStartup, мы создаем новыйXmlWebApplicationContext, настроенный с тем же файлом, переданным какcontextConfigLocation сервлету в примереXML

  3. Затем мы создаем экземплярDispatcherServlet с новым контекстом, который мы только что создали.

  4. И, наконец, мы регистрируем сервлет с отображениемURLpattern

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

5. 100%(t0)s Конфигурация

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

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

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

На этот раз мы будем использовать контекст на основе аннотаций, чтобы мы могли использоватьJava и аннотации для конфигурации и избавиться от необходимости в файлахXML, таких какdispatcher-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+, и вам решать, какой из них использовать, исходя из ваших предпочтений. Spring приспособится к вашему решению, что бы вы ни выбрали.

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