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

Dav*_*ley 28 java spring web.xml servlets

我想在我的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>
Run Code Online (Sandbox Code Playgroud)

如果我有myservlet自己在文件中使用DispatcherServlet,它工作正常.如果我的user-webservice带有context-param,它的配置文件(user-service-servlet.xml),它可以正常工作.但是,如果我在文件中都有,那么myservlet不起作用,因为myservlet-servlet.xml文件没有自动加载.如果我删除context-param,那么myservlet可以正常工作,但是user-webservice不能正常工作,因为它没有加载配置文件(user-service-servlet.xml).

如何定义两个servlet并加载它们的两个配置文件?

Pas*_*ent 17

正如在cxf-user邮件列表中的这个主题中所解释的那样user-webservice-servlet.xml,您可以将整个批次加载到根上下文中,而不是让CXFServlet加载自己的弹簧上下文.将现有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>
Run Code Online (Sandbox Code Playgroud)

  • 如果使用单独的数据库和其他设置,两个servlet的上下文如何可以在根上下文中?它们如何在一个文件中区分? (2认同)

cle*_*tus 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>
Run Code Online (Sandbox Code Playgroud)

然后你需要三个文件:

  • applicationContext.xml中;
  • myservlet-servlet.xml中; 和
  • 用户Web服务 - servlet.xml中.

这些*-servlet.xml文件是自动使用的,每个文件都为该servlet创建一个应用程序上下文.

从Spring文档,13.2.DispatcherServlet:

在初始化a时DispatcherServlet,框架将在Web应用程序 的目录中查找名为[servlet-name] -servlet.xmlWEB-INF文件,并创建在那里定义的bean(覆盖在其中定义的任何bean的定义)全球范围).