加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService 学习笔记

发布时间:2020-12-17 01:15:38 所属栏目:安全 来源:网络整理
导读:1. 目的 ???????提供一种服务,能支持任何平台、任何语言和任何方式访问,使它们可以在不同平台,不同语言间进行通信。 ? ?????? 利用Eclipse推荐使用的插件XFire 来快速开发WebService, XFire是一个免费的开源SOAP框架, 当使用XFire时,你不需要编写一行

1. 目的

???????提供一种服务,能支持任何平台、任何语言和任何方式访问,使它们可以在不同平台,不同语言间进行通信。
?
?????? 利用Eclipse推荐使用的插件XFire 来快速开发WebService, XFire是一个免费的开源SOAP框架, 当使用XFire时,你不需要编写一行额外的Java代码。只需要编辑发布描述符,然后你就会得到一个Web Services。有利于减少错误,提高开发效率,快速提供对外接口,以供客户端使用。
2. 范围
?????? 利用Eclipse推荐使用的插件XFire 来快速开发WebService,支持任何平台、任何语言和任何方式访问。服务采用xfire方式,客户端有axis、xfire方式两种。
?
3. 技术术语
  • 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文档。

?
4. 准备工作
操作系统: 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 类的冲突造成的。
解决方式:将会在异常处理中有详述。
5. 服务器编写
服务采用xfire方式,客户端有axis、xfire方式两种。
5.1 第一步: 新建web Service 工程项目

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

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

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

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

?
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 的配置 (此步也可手动修改)

?

生成后的的项目工程结构图, 如下图所示:

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

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

然后点击 [Go],将在弹出如下图所示信息,在窗口中输入 参数信息,然后点击 [Go],如下图所示,要下栏出现如下图信息。
?

6. 异常处理
6.1 第一种:JDK 与Tomcat 版本不匹配
  • 异常信息: provider org.apache.xalan.processor .TransformerFactoryImpl
  • 原因:由于jdk1.5 与 tomcat5.0之间的关于 TransformerFactoryImpl 类的冲突造成的。tomcat-5.0.28commonendorsed下有两个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都已包含。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读