web-dev-qa-db-ja.com

1つのSpringアプリケーションでweb.xmlに複数のサーブレットを登録する方法

Springのweb.xmlで2つのサーブレットを定義します。1つはアプリケーションのhtml/jspページ用で、もう1つは外部アプリケーションによって呼び出される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を単独で使用する場合、正常に機能します。設定ファイル(user-service-servlet.xml)のcontext-paramを持つuser-webserviceがある場合、正常に動作します。ただし、ファイルに両方がある場合、myservlet-servlet.xmlファイルが自動的にロードされないため、myservletは機能しません。 context-paramを削除すると、myservletは機能しますが、構成ファイル(user-service-servlet.xml)がロードされないため、user-webserviceは機能しません。

両方のサーブレットを定義し、両方の構成ファイルをロードするにはどうすればよいですか?

27
David Buckley

Cxf-userメーリングリストの このスレッド で説明されているように、CXFServletにuser-webservice-servlet.xmlから独自のスプリングコンテキストをロードさせるのではなく、ロット全体をルートコンテキストにロードできます。既存の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>
17
Pascal Thivent

次のような構成を使用します。

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

次に、3つのファイルが必要になります。

  • applicationContext.xml;
  • myservlet-servlet.xml;そして
  • user-webservice-servlet.xml。

*-servlet.xmlファイルは自動的に使用され、それぞれがそのサーブレットのアプリケーションコンテキストを作成します。

Springのドキュメントから 13.2。DispatcherServlet

フレームワークは、DispatcherServletの初期化時に、WEB-INFで[servlet-name] -servlet.xmlという名前のファイルを探します。 Webアプリケーションのディレクトリを作成し、そこで定義されたBeanを作成します(グローバルスコープで同じ名前で定義されたBeanの定義をオーバーライドします)。

6
cletus

私はこれが少し古いことを知っていますが、要するに答えは<load-on-startup>です。これにより、ロードシーケンスが混乱する可能性があります。

1
Tony Shih