Cómo registrar varios servlets en web.xml en una aplicación de Primavera
Pregunta
quiero definir dos servlets en mi web.xml Primavera - una para las páginas HTML / JSP de aplicación, y uno para un servicio web que será llamado por una aplicación externa. Aquí está el 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>
Si tengo myservlet utilice el DispatcherServlet en el archivo por sí mismo, trabaja muy bien. Si tengo la facilidad de servicio web con el context-param por su archivo de configuración (usuario-servicio-servlet.xml), que funciona bien. Sin embargo, si tengo tanto en el archivo, entonces el myservlet no funciona como el archivo de myservlet-servlet.xml no se carga automáticamente. Si quito el context-param, a continuación, los trabajos myservlet, pero la facilidad de servicio web no funciona, ya que es el archivo de configuración (usuario-servicio-servlet.xml) no está cargado.
¿Cómo puedo tener los dos servlets definidos y ambos de sus archivos de configuración cargado?
Solución
Como se explica en este hilo en la lista de correo cxf-usuario, en lugar de tener la CXFServlet cargar su propio contexto surgen de user-webservice-servlet.xml
, sólo puede cargar todo el lote en el contexto raíz. Cambiar el nombre de su user-webservice-servlet.xml
existente a algún otro nombre (por ejemplo user-webservice-beans.xml
) luego cambia de parámetro contextConfigLocation
a algo como:
<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>
Otros consejos
Usar config algo como esto:
<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>
y entonces usted tendrá tres archivos:
- applicationContext.xml;
- myservlet-servlet.xml; y
- user-webservice-servlet.xml.
Los archivos *-servlet.xml
se utilizan automáticamente y cada uno crea un contexto de aplicación para ese servlet.
A partir de la documentación de la primavera, 13.2. El DispatcherServlet :
El marco, en la inicialización de un
DispatcherServlet
, buscar una archivo con el nombre [servlet-name] -servlet.xml en el directorioWEB-INF
de su Web aplicación y crear las habas definido allí (anulando el las definiciones de cualquier beans definidos con el mismo nombre en el ámbito mundial).
Sé que esto es un poco viejo, pero la respuesta en corto sería