Как работает 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 имеет отличную поддержку для этого.
Если ваша цель состоит в том, чтобы один экземпляр приложения обслуживал запросы для всех этих языков/локалей, то это звучит так, будто вы можете избавиться от этой избыточности.