Web service—不是框架,更不是一种技术,二是一种跨平台、跨语言的规范
为了解决这样的需求场景:
不用平台、不同语言所编写的应用之间如何相互调用?
web service实际中的用途:
1、 同一公司的新、旧系统的整合
Linux上java应用去调用windows平台的delphi应用
2、 不同公司的业务整合
业务的整合就要带来。不同公司的系统整合
不同公司的系统可能存在平台不同、语言不同的问题
3、 内容聚合
一个应用,比如需要提供天气预报、股票行情、黄金行情、编程语言排行
这个内容聚合的应用,需要调用大量不同平台、不用语言编写的应用的方法
CFX
Axis(Apache)---Axis2(Apache)
XFire---CFX(XFire+Celtrix)
XFire(Web Service框架)
Celtrix(ESB框架)
SOA(面向服务的架构)
Sercice1,Sercice2,Sercice3—所有组件都是“即插即用”的
IBM提倡的SOA架构,希望以“组装电脑”的方式来开发软件
1. 各种提供服务的组件(Web Service)
2. 企业服务总线(Enterprise Service Bus,ESB)
CFX号称是SOA框架
CFX(Apache)
CFX内置了一个JettyWeb服务器
/********************************
每个web service需要两个部分:接口是实现类
**********************************/
使用CFX开发web service开发服务器端:
(1) 开发一个web service业务接口
该接口要用@webservice修饰
(2) 开发一个web service实现类
实现累也需要用@webservice修饰
(3) 发布webservice
使用CFX开发web service开发客户端:
(1) 调用CFX提供的wsdl2java工具,根据wsdl文档生成相应的java代码
Wsdl-web service definition language
任何语言实现了web service,都需要提供、并暴露wsdl文档
(2) 找到wsdl2java所生成类中,一个继承了service的类
该类的实例可当成工厂来使用
(3) 调用service子类的实力的getXxxPort()方法,返回远程web service的代理
形参、返回值
1、 当形参、返回值的类型是String、基本数据类型时,CFX肯定可以轻松的处理
2、 当形参、返回值类型是JavaBean形式的复合类、List集合、数组时
CFX也可以很好的处理
3、 还有一些像Map、非JavaBean式的复合类,CFX是不可以处理的
/**************************
XML里的两个属性:
targetNamespace - 相当于Java语言里的package
Xmlns: - 相当于Java语言里的impor
*************************/
Web Service的三个技术基础:
1、WSDL Web ServiceDefinition Language Web服务定义语言
2、SOAP SimpleObject Access Protocol 简单对象访问协议
3、UDDI
一次web Service的调用----其实不是方法调用,而是发送SOAP消息(即XML文档片段)
对于sayHi操作来说
传入消息是:
<sayHi>
<argo>字符串</arg0>
</sayHi>
传出消息是:
<sayHiResponse>
<return>字符串</return>
对于getCatsByUser操作来说
传入消息是:
<getCatsByUser>
<arg0>
<address>字符串</address>
<id>整数值</id>
<pass>字符串</pass>
</arg0>
</getCatsByUser>
传出消息是:
<getCatsByUserResponse>
<return> ----可出现0~N次(模拟了List对象)
<color>字符串</color>
<id>整数型</id>
<name>字符串</name>
</return>
</getCatsByUserResponse>
通俗的说,WSDL文档描述了web Service如下2个方面:
What:该web Service包含了几个
How:该web Service的操作应该怎样调用
Where:该web Service的服务地址。
/*******************************
只要得到web Service的WSDL文档,接下来程序就可以调用web Service
*******************************/
调用一次web service的本质:
1、 客户端把调用方法参数,转换成XML文档片段(SOAP消息)
----给文档片段必须复合WSDL定义的格式。
2、 通过网络,把XML文档片段发送给服务区
3、 服务器接收到XML文档片段
4、 服务器解析XML文档片段,提取其中的数据,并把数据转换调用web Service所需的参数值
5、 服务器执行方法
6、 把执行方法得到的返回值再次转换成为XML文档片段(SOAP消息)
---该文档片段必须符合WSDl定义的格式
7、 通过网络把XMl文档片段传给客户端
8、 客户端接收到XML文档片段
9、 客户端解析XML文档片段,提取其中的数据,并把数据转换调用web Service的返回值
从上面调用本质来看,要一个语言支持web Service,唯一的要求是:该语言支持XML文档的解析、生成、支持网络传输
在CFX开发中,如果遇到CFX无法处理的类型,就需要程序员自行处理
处理思路是:提供一个转换器,该转换器负责把CFX搞不定的类型,转换成CFX搞得定的类型
(1) 使用@xmlJavaTypeAdapter修饰CFX无法处理的类型。
使用该Annotation时,通过value属性指定一个转换器
(2) 实现自己的转换器,实现转换器时,需要开发一个CFX搞得定的类型
对于getAllCats操作来说。
传入消息是:
<getAllCats>
</getAllCats>
传出消息是:
<getAllCatsResponse>
<return>
<entries> ------可出现0~N次
<key>字符串</key>
<value>
<color>字符串</color>
<id>整数值</id>
<name>字符串</name>
</vlaue>
</entries>
</return>
</getAllCatsResponse>