Как работает DispatcherServlet, если у нас есть несколько файлов конфигурации XML?

Вопросы

Как работает DispatcherServlet, если у нас есть несколько файлов конфигурации XML, так как Spring Application Context загружает их и действует на них?

Сценарий:

В моем случае у нас есть приложение, которое должно быть глобальным, а приложение должно иметь AP{Asia-Pacific}, EM{Europ-Middleeast}, CA{Canada} and LA{Latin America} Версии.

В настоящее время у нас есть приложение для одного региона, которое EM, и его имеет XML Configuration File i.e, em-servelt.xml, а затем есть общий web.xml файл для AP region у нас есть другой файл ap-servlet.xml и, кстати, оба em-servlet.xml и ap-servlet.xml file будут иметь одинаковые имена bean, но они будут указывать на контроллеры в разных пакетах, поэтому, например, em будет указывать на что-то вроде com.em.DomainController, а ap будет указывать на com.ap.DomainController.

Итак, мой вопрос:

Как запрос сопоставляется с разными контроллерами и как распознается запрос, чтобы он читал из ap-servlet.xml или em-servlet.xml?

Я надеюсь, что смогу четко изложить свой вопрос.

Ответ 1

В файле web.xml можно настроить несколько экземпляров DispatcherServlet, каждый из которых имеет свою собственную конфигурацию. Каждый экземпляр DispatcherServlet настраивает WebApplicationContext отдельно от других экземпляров DispatcherServlet, поэтому вы можете использовать те же имена bean, не затрагивая другой контекст приложения.

<!-- configured by WEB-INF/ap-servlet.xml -->
<servlet>
    <servlet-name>ap</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- configured by WEB-INF/em-servlet.xml -->
<servlet>
    <servlet-name>em</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

Вы также должны настроить web.xml для сопоставления запросов с соответствующим DispatcherServlet. Например, в каждом регионе может быть другой URL-адрес.

<servlet-mapping>
    <servlet-name>ap</servlet-name>
    <url-pattern>/ap/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>em</servlet-name>
    <url-pattern>/em/*</url-pattern>
</servlet-mapping>

Ответ 2

Файл web.xml контролирует, какой контекстный файл DispatcherServlet использует. Если вы настроите web.xml на DispatcherServlet с именем em, то по умолчанию он использует em-servlet.xml для загрузки веб-контекста.

Ваш вопрос немного запутан, что вы действительно хотели бы сделать - хотите ли вы, чтобы все "версии" были доступны в одном экземпляре приложения?

Если да, то метод, который вы описываете, звучит неортодоксально для того, как представить несколько языков/глобализировать ваше приложение. Традиционно у вас будет только один экземпляр приложения и всех контроллеров/экземпляров, а затем обработайте перевод видимых пользователем сообщений на уровне отображения. Spring имеет отличную поддержку для этого.

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