繁体   English   中英

如何在一个Spring应用程序中的web.xml中注册多个servlet

[英]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>

然后您将需要三个文件:

  • applicationContext.xml;
  • myservlet-servlet.xml;
  • user-webservice-servlet.xml。

*-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM