1. 目的

       提供一种服务,能支持任何平台、任何语言和任何方式访问,使它们可以在不同平台,不同语言间进行通信。
 
       利用Eclipse推荐使用的插件XFire 来快速开发WebService, XFire是一个免费的开源SOAP框架, 当使用XFire时,你不需要编写一行额外的Java代码。只需要编辑发布描述符,然后你就会得到一个Web Services。有利于减少错误,提高开发效率,快速提供对外接口,以供客户端使用。
       利用Eclipse推荐使用的插件XFire 来快速开发WebService,支持任何平台、任何语言和任何方式访问。服务采用xfire方式,客户端有axis、xfire方式两种。
 
  • XFire是一个免费的开源SOAP框架,它不仅可以极大方便地实现这样一个环境,并且可以提供许多Web Services规范中高级特征,这些特征在多数的商业或者开源工具都没有提供。
  • lWeb Service:使我们能够在网络上建立分布式系统,应用程序组件可以通过任何平台、任何语言和任何方式访问。无论应用程序如何开发,使用了什么语言,以及运行在什么操作系统平台上,只要它作为Web Service,并且为协同解决问题而设计,那么你的应用程序,以任何语言开发或在任何平台上,都可以利用它的服务。
  • XML: 在Web Services环境中各层之间进行传递的默认数据格式。所以使用XML是因为它的独立于编程语言,良好的可扩展性以及强大的工业支持。
  • SOAP: 封装和交换信息的默认协议。Simple Object Access Protocol(简单对象访问协议)的首字母。SOAP是XML文档形式的调用商业方法的规范,它可以支持不同的底层接口,象HTTP(S)或者SMTP。SOAP的强大是因为它简单。SOAP是一种轻量级的,非常容易理解的技术,并且很容易实现。它有工业支持,可以从各主要的电子商务平台供应商那里获得。从技术角度来看,SOAP详细指明了如何响应不同的请求以及如何对参数编码。一个SOAP封装了可选的头信息和正文,并且通常使用HTTP POST方法来传送到一个HTTP 服务器,当然其他方法也是可以的,例如SMTP。SOAP同时支持消息传送和远程过程调用。
 
 

基本流程如图
基本流程图
  • Webservice 的概念是使用一个标准的输出接口来定义代码提供的功能,以便让外界可以通过这个标准的输出接口来调用,而所谓的标准输出接口就是wsdl,wsdl是一个xml组成的文件,描述了实现程序对外提供函数的原型,客户端可以通过wsdl来调用实现程序提供的服务代码。
  • UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。UDDI 项目中的成员可以通过UDDI Business Registry (UBR) 来操作Web服务的调用,UBR是一个全球性的服务。 Web服务供应商可以在UBR中描述并且注册他们的服务。 用户可以在UBR中查找并定位那些他们需要的服务。 UDDI是一种根据描述文档来引导系统查找相应服务的机制。
  • WSDL
       对于商业用户来说,要找到一个自己需要使用的服务,他必须知道如何来调用。 WSDL (Web Services Description Language) 规范是一个描述接口,语义以及Web服务为了响应请求需要经常处理的工作的XML文档。这将使简单地服务方便,快速地被描述和记录。
 

WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,截然不同的网站都可以实现。随网站而异的东西如序列化便归入底部分,因为它包含具体的定义。
l. 抽象定义
  Types   独立与机器和语言的类型定义
  Messages 包括函数参数(输入与输出分开)或文档描述
  PortTypes 引用消息部分中消息定义来描述函数签名(操作名、输入参数、输出参数)
2. 具体定义
  Bindings PortTypes部分的每一操作在此绑定实现
  Services  确定每一绑定的端口地址

定义方式

各Messages栏使用Types栏的定义,PortTypes栏使用Messages栏的定义;Bindings栏引用了PortTypes栏,Services栏引用Bindings栏,PortTypes和Bindings栏包含了operation元素,而Services栏包含了port元素。PortTypes栏里的operation元素由Bindings栏里的operation元素进一步修改或描述。
注意:文档之中可能只有一个Types栏,或根本没有。所有其他的栏可以只有零元素、单元素或是多元素。WSDL的列表要求所有的栏以固定的顺序出现:import, types, message, portType, binding, service。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。
<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="FooSample" targetNamespace="http://tempuri.org/wsdl/"
 xmlns:wsdlns="http://tempuri.org/wsdl/" xmlns:typens="http://tempuri.org/xsd"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"
 xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace="http://tempuri.org/xsd"
  xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"  elementFormDefault="qualified" >
</schema>
</types>
< message name="Simple.foo"> <part name="arg" type="xsd:int"/> </message>
< message name="Simple.fooResponse"><part name="result" type="xsd:int"/ ></message>
< portType name="SimplePortType">
 <operation name="foo" parameterOrder="arg" >
  <input message="wsdlns:Simple.foo"/>
  <output message="wsdlns:Simple.fooResponse"/>
 </operation>
</portType>
< binding name="SimpleBinding" type="wsdlns:SimplePortType">
 <stk:binding preferredEncoding="UTF-8" />
 <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
 <operation name="foo">
  <soap:operation soapAction="http://tempuri.org/action/Simple.foo"/>
  <input>
   <soap:body use="encoded" namespace="http://tempuri.org/message/"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
  </input>
  <output>
   <soap:body use="encoded" namespace="http://tempuri.org/message/"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
  </output>
 </operation>
</ binding>
 
< service name="FOOSAMPLEService">
 < port name="SimplePort" binding="wsdlns:SimpleBinding">
  <soap:address location="http://carlos:8080/FooSample/FooSample.asp"/>
  </port>
</service>
</definitions>
第一行申明该文档是XML。尽管这并不是必需的,但它有助于XML解析器决定是否解析WSDL文件或只是报错。
第二行是WSDL文档的根元素:<definitions>。一些属性附属于根元素,就像<schema>子元素对于<types>元素。
<types>元素包含了Types栏。如果没有需要声明的数据类型,这栏可以缺省。在WSDL范例中,没有应用程序特定的types声明,但我仍然使用了Types栏,只是为了声明schema namespaces。

  <message>元素包含了Messages栏。如果我们把操作看作函数,<message>元素定义了那个函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相隔离--输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出<message>元素以"Response"结尾,就像以前所用的"fooResponse"。每个<part>元素都有名字和类型属性,就像函数的参数有参数名和参数类型。
一个PortTypes栏中,可以有零个、单个或多个<portType>元素。由于抽象PortType定义可以放置在分开的文件中,在某个WSDL文件中没有<portType>元素是可能的。上面的例子里只是用了一个<portType>元素。而一个<portType>元素可在<operation>元素中定义一个或是多个操作。示例仅使用了一个名为"foo"的<operation>元素。这和某个函数名相同。<operation>元素可以有一个、两个、三个子元素:<input>, <output> 和<fault>元素。每个<input>和<output>元素中的消息都引用Message栏中的相关的<message>元素。
Bindings栏可以有零个、一个或者多个<binding>元素。它的意图是制定每个<operation>通过网络调用和回应。Services栏同样可以有零个、一个、多个<service>元素。它还包含了<port>元素,每个<port>元素引用一个Bindings栏里的<binding>元素。Bindings和Services栏都包含WSDL文档。
 
操作系统: winxp或win2k
开发工具: jdk 1.4以上版本,tomcat5.0以上版本+eclipsea3.2
           Myeclipse5.1(可选 )
注意:当使用 jdk1.5 与 tomcat5.0 全出异常。
异常信息为: provider org.apache.xalan.processor.T
错误原因:
是由于jdk1.5 与 tomcat5.0之间的关于 TransformerFactoryImpl 类的冲突造成的。
解决方式:将会在异常处理中有详述。
服务采用xfire方式,客户端有axis、xfire方式两种。
5.1 第一步: 新建web Service 工程项目
建立工程项目
点击 【Next】 进入下一步个操作。
下一步
点击 【Next】 进入下一步个操作。
 

下一步

点击 【Next】 进入下一步个操作。 

下一步

此步骤中Xfire 1.2 HTTP Client Libraries 中可选项。
点击 【Finish】 完成项目创建工作。
web.xml 中配置XFire 的Servlet 及其配置 
 

web.xml 配置

 
5.2 第二步: 提供服务接口
 

服务接口定义 

服务接口定义 

服务接口定义 

服务接口定义

服务端接口定义如下 :

package com.smt.service;
 
/******************************************************
 *
 * 功能描述: WebService Xfire 对象提供服务接口类</br></br>
 *
 * 作者: chenab </br></br>
 *
 * 创建时间: 2011-7-14 上午11:22:26</br></br>
 *
 * 版本号:V1.0 </br></br>
 *****************************************************/
public interface IBankingService {
    public String transferFunds(String fromAccount);
}
 
 
5.3 第三步: 提供服务接口实现类
服务接口实现类如下:

package com.smt.service;
 
/*****************************************************
 *
 * 功能描述: webService XFire 服务接口实现类</br></br>
 *
 * 作者: chenab</br></br>
 *
 * 创建时间: 2011-7-14 上午11:28:47</br></br>
 *
 * 版本号:V1.0 </br></br>
 *******************************************************/
 
public class BankingService implements IBankingService {
 
    public BankingService() {
    }// 空构造不可少
 
    public String transferFunds(String fromAccount) {
       String str=" 恭喜, 服务端测试成功! "+fromAccount;
       System. out.println(str);
       return str;
    }
}
 
 
Web Servivce 的发布的----- services.xml 的配置 (此步也可手动修改)

services.xml的配置 

生成后的的项目工程结构图, 如下图所示:
生成后结构图
5.4 第四步: 发布服务
将项目发布到 Tomcat 服务器,并运行Tomcat ,服务启动后,在地址栏中输入如下信息,如果有XML信息生成,则表示Web服务成功。
 

发布webService

当服务启动后,打开Eclipse 。
第一步:在eclipse 工具栏上选择者Web Service Exploer 如下图1所示。
第二步:在打开的标签窗口中,选择WSDL如下图 2所示。 
第三步:选择左侧 [WSDL Main],在右侧将会出现如下图3所示,在地址栏中输入“服务地址”。

服务地址

然后点击 [Go],将在弹出如下图所示信息,在窗口中输入 参数信息,然后点击 [Go],如下图所示,要下栏出现如下图信息。
  运行服务
6.1 第一种:JDK 与Tomcat 版本不匹配
  •  异常信息: provider org.apache.xalan.processor .TransformerFactoryImpl
  • 原因:由于jdk1.5 与 tomcat5.0之间的关于 TransformerFactoryImpl 类的冲突造成的。tomcat-5.0.28\common\endorsed下有两个jar包:xercesImpl.jar和xml-apis.jar,其中的类 javax.xml.transform.TransformerFactory与jdk1.5中的类org.apache.xalan.processor.TransformerFactoryImpl其实是同一个类。
  • 解决办法一:
  1.  将xml-apis.jar移出endorsed文件夹。 
  2. 用xalan系列jar包替换原来的xercesImpl.jar和xml-apis.jar。 
    xalan系列jar包:serializer.jar、xalan.jar、xercesImpl.jar和xml-apis.jar。
  3. For other application, just check this file or dom3-xml-apis.jar in your class path.
  • 解决办法二:
        使用 1.4的JDK和tomcat5.0 或者JDK1.5 tomcat5.5 这2种类型才是匹配。
 
6.2 第二种:JDK低版本无法执行高版本编译的类文件
  • 异常信息:java.lang.UnsupportedClassVersionError
  • 原因:因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误。错误尤其在JDK5与JDK5之前的版本上表现明显。因为,JDK5在Java语法上作了不少增强,引入了一些新的.class文件的元素,导致旧版本的JVM无法解释、执行.class文件。即使这个类并没有使用任何JDK5的新元素,但是JDK5生成的.class文件,JDK1.4及其以前的JVM都无法辨认!
  • 解决办法:
  1. 右键点击工程文件,选择属性(properties),
  2. 在属性窗口中选择 Build-->Java,在右边的选项中有四个下拉框,就可以看到编译选项了,
  3. 其中Compiler和Debug Option可以不用管,只在Languege features和Target VM中选择相应的JDK版本就可以了,然后确定,一切OK。
6.3 第三种:Jboss 与 Tomcat 间存在共同包冲突
  • 异常信息:The method getJspApplicationContext(ServletContext) is undefined for the type  
  • 原因:服务器环境Jboss,Java程由Tomcat5.5工程目录直接拷贝,由于WEB-INF/lib下存在jsp-api.jar、servlet-api.jar,与Jboss自带的jar包冲突造成。
  • 解决办法:删除WEB工程Lib目录中的jsp-api.jar、servlet-api.jar,重新启动Jboss服务问题解决。
     在创建工程时, jsp-api.jar、servlet-api.jar这两个jar包都无需手工加入到web工程中,tomcat与jboss都已包含。