Axis1.4底层加载server-config.wsdd文件的过程

曾经做过两年的Axis2开发Webservice的各种接口,传参是XML报文,到如今已经快两年没怎么接触过Webservice相关的内容了。前一周,接了个需求,需要对外部系统提供一个Webservice接口,于是又回来折腾Webservice相关的东东。

因为看到外部系统之前与我们公司核心系统对接的Webservice采用的都是axis1.4的,于是,我就用axis1.4下弄了个小demo,因为考虑到业务需求,将最简单的demo升级了一下,传参入参自己设计了一套javaBean,就是之前的一篇文章里的demo。之后再结合业务需求,将这个demo放入到现有的系统中,各种测试都没有问题。

然而,虽然通过demo和网上的资料知道了Webservice的搭建过程,却不知道Webservice底层是怎么操作的,server-config.wsdd文件又是怎么加载的,于是,又把axis1.4相关的jar包都大致浏览了一遍。

首先,配置web.xml的时候,有这样的一段代码:

<listener>
		<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>AxisServlet</servlet-name>
		<servlet-class>
			org.apache.axis.transport.http.AxisServlet
		</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>/servlet/AxisServlet</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>

  可以看到,axis其实本质还是一个servlet,通过路径org.apache.axis.transport.http.AxisServlet,找到这个servlet的初始化方法:

public class AxisServlet extends AxisServletBase:

 public void init()
    throws ServletException
  {
    super.init();
    ServletContext context = getServletConfig().getServletContext();

    isDebug = log.isDebugEnabled();
    if (isDebug) {
      log.debug("In servlet init");
    }
    this.transportName = getOption(context, "transport.name", "http");

    if (JavaUtils.isTrueExplicitly(getOption(context, "use-servlet-security", null)))
    {
      this.securityProvider = new ServletSecurityProvider();
    }

    this.enableList = JavaUtils.isTrueExplicitly(getOption(context, "axis.enableListQuery", null));

    this.jwsClassDir = getOption(context, "axis.jws.servletClassDir", null);

    this.disableServicesList = JavaUtils.isTrue(getOption(context, "axis.disableServiceList", "false"));

    this.servicesPath = getOption(context, "axis.servicesPath", "/services/");

    if (this.jwsClassDir != null) {
      if (getHomeDir() != null)
        this.jwsClassDir = (getHomeDir() + this.jwsClassDir);
    }
    else {
      this.jwsClassDir = getDefaultJWSClassDir();
    }

    initQueryStringHandlers();
    try
    {
      ServiceAdmin.setEngine(getEngine(), context.getServerInfo());
    } catch (AxisFault af) {
      exceptionLog.info("Exception setting AxisEngine on ServiceAdmin " + af);
    }
  }

  一般初始化的时候都会去加载各种需要的配置文件,这个servlet继承的父类里有这样的方法:(由上到下,分别是方法调用的过程)

AxisServletBase:

public void init()
    throws ServletException
  {
    ServletContext context = getServletConfig().getServletContext();

    this.webInfPath = context.getRealPath("/WEB-INF");
    this.homeDir = context.getRealPath("/");

    isDebug = log.isDebugEnabled();
    if (log.isDebugEnabled()) log.debug("In AxisServletBase init");
    this.isDevelopment = JavaUtils.isTrueExplicitly(getOption(context, "axis.development.system", null));
  }

 protected String getOption(ServletContext context, String param, String dephault)
  {
    String value = AxisProperties.getProperty(param);

    if (value == null) {
      value = getInitParameter(param);
    }
    if (value == null)
      value = context.getInitParameter(param);
    try {
      AxisServer engine = getEngine(this);
      if ((value == null) && (engine != null))
        value = (String)engine.getOption(param);
    }
    catch (AxisFault axisFault) {
    }
    return (value != null) ? value : dephault;
  }

  public static AxisServer getEngine(HttpServlet servlet)
    throws AxisFault
  {
    AxisServer engine = null;
    if (isDebug) {
      log.debug("Enter: getEngine()");
    }
    ServletContext context = servlet.getServletContext();
    synchronized (context) {
      engine = retrieveEngine(servlet);
      if (engine == null) {
        Map environment = getEngineEnvironment(servlet);

        engine = AxisServer.getServer(environment);

        engine.setName(servlet.getServletName());
        storeEngine(servlet, engine);
      }
    }

    if (isDebug) {
      log.debug("Exit: getEngine()");
    }
    return engine;
  }

  protected static Map getEngineEnvironment(HttpServlet servlet)
  {
    Map environment = new HashMap();

    String attdir = servlet.getInitParameter("axis.attachments.Directory");
    if (attdir != null) {
      environment.put("axis.attachments.Directory", attdir);
    }
    ServletContext context = servlet.getServletContext();
    environment.put("servletContext", context);

    String webInfPath = context.getRealPath("/WEB-INF");
    if (webInfPath != null) {
      environment.put("servlet.realpath", webInfPath + File.separator + "attachments");
    }

    EngineConfiguration config = EngineConfigurationFactoryFinder.newFactory(servlet).getServerEngineConfig();

    if (config != null) {
      environment.put("engineConfig", config);
    }

    return environment;
  }

  于是,我发现了EngineConfigurationFactoryFinder.newFactory(servlet).getServerEngineConfig();这个方法在axis的jar包中的这个类里:EngineConfigurationFactoryServlet

private static EngineConfiguration getServerEngineConfig(ServletConfig cfg)
  {
    ServletContext ctx = cfg.getServletContext();

    String configFile = cfg.getInitParameter("axis.ServerConfigFile");
    if (configFile == null) {
      configFile = AxisProperties.getProperty("axis.ServerConfigFile");
    }
    if (configFile == null) {
      configFile = "server-config.wsdd";
    }

    String appWebInfPath = "/WEB-INF";

    FileProvider config = null;

    String realWebInfPath = ctx.getRealPath(appWebInfPath);

    if ((realWebInfPath == null) || (!new File(realWebInfPath, configFile).exists()))
    {
      String name = appWebInfPath + "/" + configFile;
      InputStream is = ctx.getResourceAsStream(name);
      if (is != null)
      {
        config = new FileProvider(is);
      }

      if (config == null) {
        log.error(Messages.getMessage("servletEngineWebInfError03", name));
      }

    }

    if ((config == null) && (realWebInfPath != null)) {
      try {
        config = new FileProvider(realWebInfPath, configFile);
      } catch (ConfigurationException e) {
        log.error(Messages.getMessage("servletEngineWebInfError00"), e);
      }

    }

    if (config == null) {
      log.warn(Messages.getMessage("servletEngineWebInfWarn00"));
      try {
        InputStream is = ClassUtils.getResourceAsStream(AxisServer.class, "server-config.wsdd");

        config = new FileProvider(is);
      } catch (Exception e) {
        log.error(Messages.getMessage("servletEngineWebInfError02"), e);
      }
    }

    return config;
  }
}

  找到这里,我们就可以知道,axis 的servlet是怎么取找server-config.wsdd文件,进而知道我们配置了那些service了。

时间: 2024-10-25 03:19:23

Axis1.4底层加载server-config.wsdd文件的过程的相关文章

java如何加载本地的dll文件

首先,应当明确,dll有两类:(1)Java所依赖的dll和,(2)dll所依赖的dll.正是由于第(2)种dll的存在,才导致了java中加载dll的复杂性大大增加,许多说法都是这样的,但我实验的结果却表明似乎没有那么复杂,后面会予以详细阐述. 其次,Java中加载dll的方式也有两种:(1)通过调用System.loadLibrary(String filename)和,(2)通过调用System.load(String filename)方法.其底层都是通过使用ClassLoader中的l

spring配置加载多个properties文件

(一)首先,我们要先在spring配置文件中.定义一个专门读取properties文件的类.例: 1 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 2 <property name="locations"> 3 <list> 4 <v

在IIS上新发布的网站,样式与js资源文件加载不到(资源文件和网页同一个域名下)

在IIS上新发布的网站,网站能打开,但样式与js资源文件加载不到(资源文件和网页是同一个域名下,例如:网页www.xxx.com/index.aspx,图片www.xxx.com/pic.png). 然后单独打开资源文件(例如打开图片的链接)是,报错: 这个问题应该是web.config配置文件的设置问题. 在配置文件的<httpHandlers>下的节点,对应的资源文件的type值设置可能是“System.Web.DefaultHttpHandler”值(默认),例如: <httpHa

.net core加载加密的sqlite文件失败解决方案

.net core加载加密的sqlite文件失败解决方案 ??在项目开发过程中,遇到使用sqlite的场景.在加载加密的sqlite时,连接sqlite时报错,,先用百度查询了下资料,尚未找到对应解决方法,故接着在stackoverflow上查找,找到了解决思路,并已解决问题. 1.开发时所用到的相关内容 1.1相关项目组件 组件名称 版本 Microsoft.NETCore.App 2.1.0 sqlSugarCore 5.0.0.9 1.2 sqlite加密软件 软件名称 版本 SQLite

JQuery 加载 CSS、JS 文件的方法有哪些?

在进行web前端开发(http://www.maiziedu.com/course/web-px/)时,我们可能会需要使用JQuery加载一个外部的css文件或者js文件,加载外部文件的方法有多种,下面具体看看各种加载方法 JS 方式加载 CSS.JS 文件: //加载 css 文件function includeCss(filename) { var head = document.getElementsByTagName('head')[0]; var link = document.cre

浏览器加载、解析、渲染的过程

最近在学习性能优化,学习了雅虎军规 ,可是觉着有点云里雾里的,因为里面有些东西虽然自己也一直在使用,但是感觉不太明白所以然,比如减少DNS查询,css和js文件的顺序.所以就花了时间去了解浏览器的工作,有一篇经典的文章<how browsers work> ,讲的很详细,也有中文译本 .不过就是文章有点太长,也讲了一堆东西,还是自己总结一下. 为什么要了解浏览器加载.解析.渲染这个过程? 好,我们先说一下,为什么要了解这些呢?如果想写出一个最佳实践的页面,就要好好了解. 了解浏览器如何进行加载

一个link加载多个css文件

细看正则时匹配慕课网链接时发现的,一个link加载多个css文件 http://static.mukewang.com/static/css/??base.css,common/common-less.css?t=2.5,u/u_common-less.css,u/plans-less.css,u/dynamic/home-less.css?v=201708111926 淘宝也有这样的链接 http://a.tbcdn.cn/p/fp/2011a/??html5-reset-min.css,gl

js便签笔记(8)——js加载XML字符串或文件

1. 加载XML文件 方法1:ajax方式.代码如下: var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xhr.open("GET", "data.xml", false); xhr.send(null); var xmlDoc = xhr.responseXML; console.log(xmlDoc

使用getScript()方法异步加载并执行js文件

使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(url,[callback])或$.getScript(url,[callback]) 参数url为服务器请求地址,可选项callback参数为请求成功后执行的回调函数. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E