Как зарегистрировать несколько сервлетов в web.xml в одном приложении Spring
Я хочу определить два сервлета в моем Spring web.xml - один для страниц приложения html/jsp и один для веб-службы, который будет вызываться внешним приложением. Вот web.xml:
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/user-service-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>user-webservice</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>user-webservice</servlet-name>
<url-pattern>/UserService/*</url-pattern>
</servlet-mapping>
Если у меня есть myservlet, используйте DispatcherServlet в файле сам по себе, он отлично работает. Если у меня есть пользовательский веб-сервис с контекстным параметром для его конфигурационного файла (user-service-servlet.xml), он отлично работает. Однако, если у меня есть оба файла, то myservlet не работает, так как файл myservlet-servlet.xml не загружается автоматически. Если я удалю контекст-параметр, то myservlet будет работать, но пользователь-webservice не работает, так как его файл конфигурации (user-service-servlet.xml) не загружен.
Как я могу установить оба сервлета и оба их файла конфигурации загружены?
Ответы
Ответ 1
Как объяснено в этот поток в списке рассылки cxf-user, вместо того, чтобы CXFServlet загружать свой собственный spring контекст из user-webservice-servlet.xml
, вы можете просто загрузить весь лот в корневой контекст. Переименуйте существующий user-webservice-servlet.xml
в другое имя (например, user-webservice-beans.xml
), затем измените свой параметр contextConfigLocation
на следующее:
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/user-webservice-beans.xml
</param-value>
</context-param>
<servlet>
<servlet-name>user-webservice</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>user-webservice</servlet-name>
<url-pattern>/UserService/*</url-pattern>
</servlet-mapping>
Ответ 2
Используйте config что-то вроде этого:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>user-webservice</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
а затем вам понадобятся три файла:
- applicationContext.xml;
- myservlet-servlet.xml; и
- пользователем вебсервис-servlet.xml.
Файлы *-servlet.xml
используются автоматически, и каждый создает контекст приложения для этого сервлета.
Из документации Spring 13.2. DispatcherServlet:
Структура будет при инициализации a DispatcherServlet
, найдите файл с именем [servlet-name] -servlet.xml в каталоге WEB-INF
вашего веб-сайта приложения и создайте beans(переопределение определения любого beans, определенного с помощью одно и то же имя в глобальном масштабе).
Ответ 3
Я знаю, что это немного устарело, но короткий ответ будет < load-on-startup > оба вхождения дали один и тот же идентификатор, который равен 1 дважды. Это может смутить последовательность загрузки.