복붙노트

[SPRING] 하나의 Spring 애플리케이션에서 web.xml에 여러 서블릿을 등록하는 방법

SPRING

하나의 Spring 애플리케이션에서 web.xml에 여러 서블릿을 등록하는 방법

Spring web.xml에 두 개의 서블릿을 정의하고자한다. 하나는 애플리케이션 html / JSP 페이지이고 다른 하나는 외부 애플리케이션에 의해 호출 될 웹 서비스이다. 다음은 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을 사용하면 정상적으로 작동합니다. 내가 config-file-user-service-servlet.xml 파일을위한 context-param을 가진 user-webservice를 가지고 있다면 잘 동작한다. 그러나 파일에 둘 다 있으면 myservlet-servlet.xml 파일이 자동으로로드되지 않으므로 myservlet이 작동하지 않습니다. 컨텍스트 매개 변수를 제거하면 myservlet이 작동하지만 구성 파일 (user-service-servlet.xml)이로드되지 않아서 user-webservice가 작동하지 않습니다.

서블릿을 모두 정의하고 두 구성 파일을 모두로드 할 수 있습니까?

해결법

  1. ==============================

    1.cxf-user 메일 링리스트의이 스레드에서 설명했듯이 CXFServlet이 user-webservice-servlet.xml에서 자체 스프링 컨텍스트를로드하는 대신 루트 전체 컨텍스트에 전체를로드 할 수 있습니다. 기존 user-webservice-servlet.xml의 이름을 다른 이름 (예 : user-webservice-beans.xml)으로 변경 한 다음 contextConfigLocation 매개 변수를 다음과 같이 변경합니다.

    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>
    
  2. ==============================

    2.다음과 같이 config를 사용하십시오 :

    다음과 같이 config를 사용하십시오 :

    <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 파일은 자동으로 사용되며 각각은 해당 서블릿에 대한 응용 프로그램 컨텍스트를 작성합니다.

    Spring의 문서에서, 13.2. DispatcherServlet :

  3. ==============================

    3.나는 이것이 조금 오래되었다는 것을 압니다. 그러나 짧은 대답은 일 것입니다. 두 사건 모두 1 번 같은 id를 두 번 부여했습니다. 이로 인해로드 순서가 혼란 스러울 수 있습니다.

    나는 이것이 조금 오래되었다는 것을 압니다. 그러나 짧은 대답은 일 것입니다. 두 사건 모두 1 번 같은 id를 두 번 부여했습니다. 이로 인해로드 순서가 혼란 스러울 수 있습니다.

  4. from https://stackoverflow.com/questions/1865088/how-to-register-multiple-servlets-in-web-xml-in-one-spring-application by cc-by-sa and MIT license