[英]How to register multiple servlets in web.xml in one Spring application
我想在Spring web.xml中定义两个servlet-一个用于应用程序html / jsp页面,另一个用于将由外部应用程序调用的Web服务。 这是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>
如果我自己的servlet本身在文件中使用DispatcherServlet,它就可以正常工作。 如果我的用户Web服务的配置文件(user-service-servlet.xml)具有context-param,则可以正常工作。 但是,如果文件中同时包含这两个文件,则myservlet无法正常工作,因为不会自动加载myservlet-servlet.xml文件。 如果删除context-param,则myservlet有效,但是user-webservice无效,因为未加载其配置文件(user-service-servlet.xml)。
如何定义两个servlet和两个配置文件?
正如该线程在cxf-user邮件列表上所解释的,您不必将CXFServlet从user-webservice-servlet.xml
加载其自己的spring上下文,而只需将整个批次都加载到根上下文中即可。 将现有的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>
使用如下配置:
<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>
然后您将需要三个文件:
*-servlet.xml
文件会自动使用,并且每个文件都会为该servlet创建一个应用程序上下文。
从Spring文档中获得13.2。 DispatcherServlet :
该框架将在初始化
DispatcherServlet
,在您的Web应用程序的WEB-INF
目录中查找名为[servlet-name] -servlet.xml的文件,并创建在其中定义的Bean(覆盖所有使用在全球范围内具有相同的名称)。
我知道这有点老了,但总的来说答案是<load-on-startup>两次出现都给出了相同的ID,即两次。 这可能会混淆加载顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.