CXF WebService笔记day1.txt

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>  

 
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值