CXFServlet

package org.apache.cxf.transport.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;

public class CXFServlet extends CXFNonSpringServlet
{
  protected void loadBus(ServletConfig sc)
  {	//获取servlet信息
    ApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(sc.getServletContext());
	//默认找web.xml配置文件中的"config-location"
	
	//<!-- 配置CXF的核心Servlet -->
	//<servlet>
	//	<servlet-name>cxf</servlet-name>
	//	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
	//	<!-- 通过初始化参数指定cxf配置文件的位置 -->
	//	<!-- 以下不注释则调用服务时会重新加载 -->
	//	<!-- 
	//	<init-param>
	//		<param-name>config-location</param-name>
	//		<param-value>classpath:cxf-servlet.xml</param-value>
	//	</init-param>
	//	 -->
	//</servlet>
	
    String configLocation = sc.getInitParameter("config-location");
    if (configLocation == null)
      try {
		//当找不到默认的"config-location"时,去找cxf-servlet.xml文件
        InputStream is = sc.getServletContext().getResourceAsStream("/WEB-INF/cxf-servlet.xml");
        if ((is != null) && (is.available() > 0)) {
          is.close();
          configLocation = "/WEB-INF/cxf-servlet.xml";
        }
      }
      catch (Exception ex)
      {
      }
    if (configLocation != null) {
      wac = createSpringContext(wac, sc, configLocation);
    }
    if (wac != null)
      setBus((Bus)wac.getBean("cxf", Bus.class));
    else
      setBus(BusFactory.newInstance().createBus());
  }

  private ApplicationContext createSpringContext(ApplicationContext ctx, ServletConfig sc, String location)
  {
    XmlWebApplicationContext ctx2 = new XmlWebApplicationContext();
    ctx2.setServletConfig(sc);

    Resource r = ctx2.getResource(location);
    try {
      InputStream in = r.getInputStream();
      in.close();
    }
    catch (IOException e) {
      r = ctx2.getResource("classpath:" + location);
      try {
        r.getInputStream().close();
      }
      catch (IOException e2) {
        r = null;
      }
    }
    try {
      if (r != null)
        location = r.getURL().toExternalForm();
    }
    catch (IOException e)
    {
    }
    if (ctx != null) {
      ctx2.setParent(ctx);
      String[] names = ctx.getBeanNamesForType(Bus.class);
      if ((names == null) || (names.length == 0)) {
        ctx2.setConfigLocations(new String[] { "classpath:/META-INF/cxf/cxf.xml", location });
      }
      else
        ctx2.setConfigLocations(new String[] { location });
    }
    else {
      ctx2.setConfigLocations(new String[] { "classpath:/META-INF/cxf/cxf.xml", location });
    }

    ctx2.refresh();
    return ctx2;
  }
}

 

你可能感兴趣的:(servlet)