servlet pattern examples ejemplo java spring servlets web.xml

java - pattern - spring boot servlet



Cómo registrar múltiples servlets en web.xml en una aplicación de Spring (3)

Quiero definir dos servlets en mi Spring web.xml: uno para las páginas html / jsp de la aplicación, y otro 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, uso DispatcherServlet solo en el archivo, funciona bien. Si tengo el servicio web del usuario con el parámetro contextual para su archivo de configuración (user-service-servlet.xml), funciona bien. Sin embargo, si tengo ambos en el archivo, entonces el myservlet no funciona, ya que el archivo myservlet-servlet.xml no se carga automáticamente. Si elimino el parámetro contextual, entonces el myservlet funciona, pero el servicio web del usuario no funciona, ya que su archivo de configuración (user-service-servlet.xml) no está cargado.

¿Cómo puedo tener ambos servlets definidos y cargar sus dos archivos de configuración?


Como se explica en este hilo en la lista de correo del usuario cxf, en lugar de cargar el contenedor CXFS de su propio contexto de primavera desde user-webservice-servlet.xml , puede simplemente cargar todo el lote en el contexto raíz. Cambie el nombre de su user-webservice-servlet.xml a otro nombre (por ejemplo, user-webservice-beans.xml ) y luego cambie su 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>


Sé que esto es un poco antiguo, pero la respuesta en resumen sería <load-on-startup>, ambas instancias han dado el mismo id, que es 1 dos veces. Esto puede confundir la secuencia de carga.


Use 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 luego necesitarás 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.

De la documentación de Spring, 13.2. The DispatcherServlet :

El marco, al inicializar un DispatcherServlet , buscará un archivo llamado [servlet-name] -servlet.xml en el directorio WEB-INF de su aplicación web y creará los beans definidos allí (anulando las definiciones de los beans definidos con el mismo nombre en el alcance global).