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

30

我希望在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>
如果我让myservlet单独使用DispatcherServlet,它可以正常工作。如果我在用户webservice中使用了context-param来配置它的配置文件(user-service-servlet.xml),那么也可以正常工作。但是,如果两者都在文件中,则myservlet无法工作,因为myservlet-servlet.xml文件不会自动加载。如果我删除context-param,则myservlet就可以工作,但是用户webservice将无法工作,因为其配置文件(user-service-servlet.xml)未加载。
如何定义两个servlet并加载它们的配置文件?
3个回答

18

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>

2
如果使用不同的数据库和其他设置,如何使两个servlet的上下文都在根上下文中?它们在一个文件中如何区分? - Mikhail Batcer

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 文件会被自动使用,每个文件都会为该 servlet 创建一个应用程序上下文。

从 Spring 文档中,13.2. The DispatcherServlet

在初始化 DispatcherServlet 时,框架将会在你的 Web 应用程序的 WEB-INF 目录中查找名为 [servlet-name]-servlet.xml 的文件,并创建在其中定义的 bean(覆盖全局范围内定义的任何同名 bean 的定义)。


这并没有帮助 - 我的应用程序中有这些文件,但是当我访问 http://localhost:8080/MyApp/index.jsp 时,它显示页面,但是当我访问 http://localhost:8080/MyApp(没有斜杠),它会打开用户 Web 服务,但是单击 WSDL 链接会显示“未找到服务”的消息。也许我的问题不是配置文件没有被加载,而是对 Web 服务的映射不正确。 - David Buckley

1

我知道这有点老了,但简短的答案是 <load-on-startup>。两个实例都给出了相同的ID,即1次。这可能会混淆加载顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接