2009-12-08 1 views
26

Я хочу определить два сервлета в моей Spring web.xml - один для страниц приложения html/jsp и один для веб-службы, который будет вызываться внешнее приложение. Вот web.xml:Как зарегистрировать несколько сервлетов в web.xml в одном приложении Spring

<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-webservice с параметром context-param для его конфигурационного файла (user-service-servlet.xml), он отлично работает. Однако, если у меня есть оба файла, то myservlet не работает, так как файл myservlet-servlet.xml не загружается автоматически. Если я удалю контекст-параметр, то myservlet работает, но пользователь-web-сервис не работает, так как его файл конфигурации (user-service-servlet.xml) не загружен.

Как я могу установить оба сервлета и оба их файла конфигурации загружены?

ответ

16

Как объяснено в this thread в списке рассылки CXF-пользователя, а не имея CXFServlet загрузить свой собственный контекст пружины из 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> 
+1

Как контекст для обоих сервлетов может быть в корневом контексте, если используются отдельные базы данных и другие настройки? Как они различаются в одном файле? –

6

Использование конфигурации что-то вроде этого:

<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; и
  • user-webservice-servlet.xml.

Файлы *-servlet.xml используются автоматически и каждый создает контекст приложения для этого сервлета.

Из документации Spring, 13.2. The DispatcherServlet:

Структура будет, при инициализации из в DispatcherServlet, взгляд на файл с именем [сервлет-имя] -servlet.xml в каталоге WEB-INF вашего веб-приложения и создайте бонусы , определенные там (переопределение определений любых фаз, определенных с помощью с тем же именем в глобальной области).

+0

Это не помогает - у меня есть эти файлы в моем приложении, но когда я перехожу к http: // localhost: 8080/MyApp/index.jsp, он показывает страницу, но когда я перехожу к http: // localhost: 8080/MyApp (без косой черты), он вызывает пользовательский веб-сервис, но нажатие на ссылку WSDL показывает сообщение «Нет услуг было найдено». Возможно, моя проблема заключается в том, что файлы конфигурации не загружаются, но сопоставление с веб-службой неверно. –

1

Я знаю, что это немного старое, но ответ короче будет < нагрузка на старте > как вхождения дали один и тот же идентификатор, который равен 1 дважды. Это может смутить последовательность загрузки.