您的位置:首页 > Web前端

第6章 CXF的前端应用

2015-11-21 11:12 357 查看
第6章 CXF的前端应用

6.1 CXF的前端应用(Frontends)简介

Apache CXF的前端应用(Frontends)就是Apache CXF作为Web Services的消费者,通过采用客户端模式来调动后台的Web Services服务。

Apache CXF的前端应用(Frontends)有5种实现模式:JAX-WS、JAX-RS、动态客户端技术、Provider和Dispatch接口方式、简化前端模式。

JAX-WS前端模式和简化前端模式都是支持SOAP协议的Web Services。

JAX-WS前端模式也有两种实现方式:一种是代码优先(Java First)、一种是协议优先(WSDL First)。

基于代码优先(Java First)的编程方式就是编写Java程序代码,然后发布Java代码来产生客户端和服务器端的Web Services。

基于协议优先(WSDL First)的编程方法就是首先生成WSDL文档,然后通过WSDL文档来产生客户端和服务器端的Java代码,然后发布这些生成的客户端和服务器端的Web Services。

6.2 基于代码优先(Java First)的JAX-WS前端模式实现

6.2.1 基于代码优先(Java First)的Web Services的步骤

6.2.1.1 创建SEI

服务端点接口(Service Endpoint Interface,SEI)是一堆Java代码,SEI是一个标准的Java接口。代码共享于客户端和服务端,用于实现两者请求和响应的关系,即客户端通过SEI来提交请求,而服务端通过SEI来反馈响应。

在SEI中,定义方法是为了映射到一个公开操作的服务。SEI对应wsdl:portType元素。SEI的方法对应wsdl:portType元素中的wsdl:operation元素。

6.2.1.2 代码注释

JAX-WS注释用于指定SEI映射到一个服务定义的元数据。注释提供的内容如下:

*定义服务的目的地命名空间

*定义用于请求(request)消息的类名称

*定义用于响应(response)消息的类名称

*说明操作是否单向操作

*说明服务的数据绑定类型

*说明可使用的任何自定义异常类名称

*定义该类型下服务使用的命名空间

建立一个SEI,必须同时在SEI的实现类上添加@WebService注释。

1.@WebService注释

@WebService目的是说明该接口作为服务来使用的。



2.@SOAPBinding注释

@SOAPBinding提供有关SOAP绑定的相关详细信息。



3.@WebMethod注释

@WebMethod放置在SEI的方法上,提供了通常在wsdl:operation元素描述相关的操作方法。



4.@RequestWrapper注释

@RequestWrapper指定的实现包装Bean的Java类请求的方法参数,该方法参数是由一个远程调用发送请求消息中包含的参数。@RequestWrapper还可用于在运行时进行请求消息编组和解组过程中指定元素的名称和命名空间。



5.@ResponseWrapper注释

@ResponseWrapper指定实现包装Bean的Java类响应的方法参数,该方法参数由一个远程调用发送响应消息中包含的参数。它还可用于在运行响应消息编组和解组过程中指定元素的名称和命名空间。

6.@WebFault注释

@WebFault注释用来映射Java异常到wsdl:fault元素。此信息用于编组异常到一个代理,该代理可以有服务的创建者和消费者来进行意外处理。



7.@Oneway注释

@Oneway注释放置在SEI不需要的服务响应的方法。@Oneway注释说明在此方法执行过程中不需要等待,不保留任何资源来处理响应,这样的优势在于可以进行性能优化。

8.@WebParam注释

如果@WebParam参数放置在SOAP标头或者wsdl:part生成的其他属性,@WebParam注释允许开发人员指定参数的方向。



9.@WebResult注释

@WebResult注解可以指定生成的wsdl:part属性,wsdl:part部分是该方法的返回值生成的。



6.2.1.3 发布Web Services服务

发布Web Services服务,就是在服务器上注册Service组件。Web Services客户端可以通过HTTP等协议访问Service组件暴露出来的服务方法。

发布类的静态方法提供了一种可以方便地发布和测试的JAX-WS服务的方法。该方法使用的端点URL地址和一个projectManager对象作为参数。

6.2.1.4 开发Web Services客户端程序

开发一个客户端类,将查找ProjectManager服务,并调用其getDefaultProject方法。

6.2.2 基于代码优先(Java First)的Web Services的例子

6.2.2.1 采用POJO并基于JAX-WS服务的前端实现

(1)服务器端点接口(SEI)和相关对象

(2)服务器端应用程序

创建了SEI,要把这个SEI发布出去,还需要一个部署程序,即服务端的发布程序,本案例采用JAX-WS规范来编写服务端程序。

(3)客户端应用程序

客户端的核心实现主要有三种方式:1)基于JAX-WS的实现模式、2)采用Apache CXF模式、3)采用Spring IoC注入模式。

1)基于JAX-WS的实现模式

SERVICE_NAME表明Web Services的服务名称。PORT_NAME表明Web Services的服务端口名称。按照程序的包名的反向方式自动生成命名空间。

通过服务名称创建Service实现类,通过addPort方法传入服务的端口类、绑定方式和Web Services的地址,最后通过getPort方法来获得服务器的SEI接口。

2)采用Apache CXF模式

实例化一个JaxWsProxyFactoryBean对象,设置SEI和地址属性,然后调用SEI的方法。

3)采用Spring IoC注入模式

<jaxws:client id="ProjectManagerClient"
serviceClass="demo.cxf.webservices.ProjectManager"
address="http://localhost:9000/ProjectManager" />
设置JaxWs代理工厂的属性,包括SEI和地址,然后调用SEI的方法。

6.2.2.2 采用POJO并基于Servlet容器的前端实现

6.3 基于WSDL优先(WSDL First)的JAX-WS前段模式实现

6.3.1 基于WSDL优先的JAX-WS前端模式实现的步骤

基于WSDL优先编程主要是通过已经存在的WSDL文档,然后通过CXF wsdl2java工具生成相关的客户端和服务器端的程序代码。

步骤:

(1)获得一个WSDL文档

(2)生成的Web Services组件

(3)发布Web Services

(4)开发一个Web Services

6.4 简化前端模式(Simple Frontend)

Apache CXF包括一种简单前端模式(Simple Frontend),即通过反射来创建服务。

6.4.1 简化前端模式(Simple Frontend)介绍

简化前端模式(Simple Frontend),与JAX-WS实现模式不同,简化前端模式在开发和部署Web Services时不提供任何正式的规范或标准。简化前端模式采用简单工厂模式创建服务。工厂组件采用Java反射API去动态地创建服务组件和客户端组件。这种模式易于使用,不需要任何工具来构建服务。



默认情况下简化前端模式使用JAXB数据绑定。

简化前端模式的服务端使用ServerFactoryBean对象,客户端采用ClientProxyFactoryBean对象。ServerFactoryBean产生一个服务器实例,它需要一个服务类和地址公布于服务。通过创建一个Server,可以提供服务给外部世界。

6.5 Provider/Dispatch服务前端应用模式

通过SEI的调用都是高层次的Web Services,主要针对服务方法进行调用。但在有些应用场景下,开发人员需要对服务内的XML进行更深层次的解析和处理,这就需要采用新的工具和方法。

JAX-WS API的Provider和Dispatch接口用于对底层XML进行操作。

6.5.1 Provider/Dispatch服务前端应用模式介绍

当Web Services客户端和Web Services服务端之间通过XML来传输时,信息非常大,同时,开发人员也不想再Java对象和XML消息之间的转换上开销大。在这种情况下,使用Provider和Dispatch就非常有优势。作为Web Services的组成部分,开发人员可以直接处理XML,或者采用更有效的方式来解析XML,从而不必把这些工作全部都提交给Web Services框架去处理。

JAX-WS规范中的javax.xml.ws.Provider接口提供了一个创建和执行服务Provider接口的功能,该功能可以处理XML消息。Dispatcher客户端可以通过XML消息格式来提交请求,同时遵照相同格式来获得响应。

Provider实现类作为一个服务器端点在服务器上进行发布。另一方面,JAX-WS规范的javax.xml.ws.Dispatch接口用于处理XML消息和采用XML格式发送响应到服务Provider。

6.5.1.1 JAX-WS Dispatch API

1.JAX-WS Dispatch概述

Dispatch对象有两种使用模式:

*)消息模式(Message mode)

*)负载模式(Payload mode)

消息模式:在消息模式下,一个Dispatch实例化对象与一个复杂消息一块工作。该复杂消息包括具有绑定的消息头定义和包装体。

负载模式:复杂模式,也称为消息有效负载模式,Dispatch实例化对象只与一个消息有效负载协同工作。

2.Dispatch对象的数据类型

Dispatch对象因为是更低层次的对象,因此不能使用JAXB等高层次的API来优化类型。

Dispatch对象有以下几种对象:

*)javax.xml.transform.Source

*)javax.xml.soap.SOAPMessage

*)javax.activation.DataSource

*)JAXB

(1)Source对象

Source接口对象是具有支持XML文档的低层次对象。每个Source接口对象的实现提供了访问存储的方法和操作XML文档的内容。

(2)SOAPMessage对象

使用条件:Dispatch对象使用SOAP绑定;Dispatch对象使用消息模式

(3)DataSource对象

使用条件:Dispatch对象使用HTTP绑定;Dispatch对象采用消息模式

DataSource对象提供一种与MIME类型协同工作的机制,该机制可以来源于一系列数据源,如网址、数据文件和字节数组。

(4)使用JAXB对象

虽然Dispatch对象是低层次的API,但允许开发者使用原始消息来调用JAXB对象。

3.Dispatch对象的使用

要使用Dispatch对象来调用远程服务,需要执行下列操作:

(1)创建Dispatch对象

(2)构件请求消息

(3)调用适当的invoke()方法

(4)解析响应消息

6.5.1.2 Provider服务

1.JAX-WS Provider概述

实现Provider接口的对象有两种模式:

*)消息模式

*)有效载荷模式

2.JAX-WS Provider数据类型

Provider对象有以下几种对象:

1)Source

2)SOAPMessage

3)DataSource

3.实现Provider接口

Provider接口有一个方法invoke。

Provider接口实现必须有一个@WebServiceProvider注释。

Provider接口实现必须有一个默认的构造函数。

Provider接口必须有实现版本的方法。

6.6 采用Apache CXF的动态客户端技术
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: