您的位置:首页 > 其它

CXF WebService笔记day1.txt

2013-03-03 20:43 183 查看
Web Service

--不是框架。更不是一种技术。

而是一种跨平台、跨语言的规范。



为了解决这样的需求场景:

不同平台、不同语言所编写的应用之间如何相互调用?

通俗点:假如java里有如下方法

public List<Cat> getCatsByUser(User user)

要求是,有一个C语言写的程序,它想去调用上面getCatsByUser方法。



Web Service集中解决:

- 远程调用

- 跨平台调用

- 跨语言调用

Web Service实际中用途:



1.同一个公司的新、旧系统的整合。

Linux上的Java应用,去调用windows平台的Delphi应用。

2.不同公司的业务整合。

业务的整合就要带来,不同公司的系统整合。

不同公司的系统可能存在平台不同、语言不同的问题。

3.内容聚合。

一个应用需要提供,天气预报、股票行情、黄金行情、编程语言行情……

这个内容聚合的应用,需要调用大量不同平台,不同语言编写的应用的方法。

……

CXF

Axis(Apache) -> Axis 2(Apache)

XFire -> CXF(XFire + Celtrix)

XFire (Web Service框架)

Celtrix (ESB框架)

SOA (面向服务的架构)

Service1, Service2, Service3--所有组件都是“即插即用”的。

IBM提倡的SOA架构: 希望以“组装电脑”的方式来开发软件。

1.各种提供服务的组件。(Web Service)

2.企业服务总线(Enterprise Service Bus , ESB)

CXF号称是SOA框架

CXF (Apache)

CXF内置了一个Jetty Web服务器。

--------------------------------------------

使用CXF开发Web Service服务器端:

/****************************************

每个Web Service组件需要2个部分:接口和实现类。

*****************************************/

(1)开发一个Web Service业务接口。

该接口要用@WebService修饰。

(2) 开发一个Web Service实现类。

实现类也需要用@WebService修饰。

(3) 使用Endpoint类的静态方法来发布WebService

--------------------------------------------

使用CXF开发Web Service客户端:

(1) 调用CXF提供的wsdl2java工具,根据WSDL文档生成相应的Java代码。

WSDL - Web Service Definition Language

任何语言实现了Web Service, 都需要提供、并暴露WSDL文档。

(2) 找到wsdl2java所生成类中,一个继承了Service的类。

该类的实例可当成工厂来使用。

(3) 调用Service子类的实例的getXxxPort方法,返回远程Web Service的代理。

形参、返回值



1. 当形参、返回值的类型是String、基本数据类型时,CXF肯定可以轻松地处理。

2. 当形参、返回值类型是JavaBean式的复合类、List集合、数组等时

CXF也可以很好的的处理。

3. 还有一些像Map、非JavaBean式的复合类,CXF是处理不了的。

/***********************************

XML里的两个属性:

targetNamespace - 相当于Java语言里的package

xmlns - 相当于Java语言的import

import:u java.util.*;

import:s java.sql.*;

u:Date d = new u:Date();

************************************/

Web Service的三个技术基础:

1. WSDL Web Service Definition Language - Web Service定义语言。

2. SOAP Simple Object Access Protocol ,简单对象访问协议。

3. UDDI

一次Web Service的调用 -- 其实并不是方法调用,而是发送SOAP消息(即XML文档片段)。

对于sayHi操作来说,

传入消息是:

<sayHi>

<arg0>字符串</arg0>

<sayHi>

传出消息是:

<sayHiResponse>

<return>字符串</return>

</sayHiResponse>

对于getCatsByUser操作来说,

传入消息是:

<getCatsByUser>

<arg0>

<address>字符串</adress>

<id>整数值</id>

<name>字符串</name>

<pass>字符串</pass>

</arg0>

</getCatsByUser>

传出消息是:

<getCatsByUserResponse>

<return> --可能出现0~N次

<color>字符串</color>

<id>整数值</id>

<name>字符串</name>

</return>

</getCatsByUserResponse>

----------------------------------------

阅读wsdl文档个人小总结:

1.进入wsdl接口文档http://192.168.1.27:9999/fkjava?wsdl=HelloWorld.wsdl

+<wsdl:types>

+<wsdl:message name="sayHiResponse">

+<wsdl:message name="getCatsByUserResponse">

+<wsdl:message name="sayHi">

+<wsdl:message name="getCatsByUser">

+<wsdl:portType name="HelloWorld">

2.先展开portType,->找到operation(<wsdl:operation name="sayHi">)->input message(message="nsl:sayHi")

再展开对应的message->part element

再展开types->找到对应元素,通过对应元素的类型type,找到下面相应的复合类型complexType->展开就可以看到传入/传出消息的参数名/返回name,及返回类型type

----------------------------------------

通俗地说,WSDL文档描述了Web Service如下3个方面:

- WHAT :该Web Service包含“什么”操作。

- HOW :该Web Service的操作应该“怎样”调用?

- WHERE :该Web Service的服务地址。

/********************************

只要得到Web Service的WSDL文档

接下来程序就可以调用Web Service

********************************/

调用一次Web Service的本质:

1.客户端把调用方法参数,转换XML文档片段(SOAP消息,input消息)

--该文档片段必须符合WSDL定义的格式。

2.通过网络、把XML文档片段从传给服务器。

3.服务器接收到XML文档片段。

4.服务器解析XML文档片段,提取其中的数据。

并把数据转换调用Web Service所需要的参数值。

5.服务器执行方法

6.把执行方法得到的返回值,再次转换生成为XML文档片段(SOAP消息,output消息)

--该文档片段必须符合WSDL定义的格式。

7.通过网络、把XML文档片段传给客户端。

8.客户端接收到XML文档片段。

9.客户端解析XML文档片段,提取其中的数据。

并把数据转换调用Web Service的返回值。

从上面调用本质来看,要一个语言支持Web Service,

唯一的要求是:该语言支持XML文档解析、生成、支持网络传输。

在CXF开发中,如果遇到系统无法自动处理的类型,就需要程序员自行处理。

处理思路是:提供一个转换器,该转换器负责把CXF搞不定的类型,转换CXF搞得定的类型

(1) 使用@XmlJavaTypeAdapter修饰CXF无法自动处理的类型.

使用该Annotation时,通过value属性指定一个转换器。

(2) 实现自己的转换器。

实现转换器时,需要开发一个CXF搞得定的类型。

对于getAllCats操作来说,

传入消息是:

<getAllCats>

</getAllCats>

传出消息是:

<getAllCatsResponse>

<return>

<entries> -- 可出现0~N次

<key>字符串</key>

<value>

<color>字符串</color>

<id>整数值</id>

<name>字符串</name>

</value>

</entries>

</return>

</getAllCatsResponse>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: