WebService 学习笔记

1. 目的java

       提供一种服务,能支持任何平台、任何语言和任何方式访问,使它们能够在不一样平台,不一样语言间进行通讯。
 
       利用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(简单对象访问协议)的首字母。SOAPXML文档形式的调用商业方法的规范,它能够支持不一样的底层接口,象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都已包含。
相关文章
相关标签/搜索