WebService编程详解之配置篇

一、采用CXF+Spring构建WebService服务端

(1)在Myeclipse中创建一个web工程,并将Apache-cxf-2.3.x/lib中的jar包拷贝到:工程名\WebRoot\WEB-INF\lib下。

(2)在工程中编写WebService的interface和implements,注意在编写接口和实现类的过程中需要应用到各种类型的Annotation,用来描述web服务。

(3)修改:工程名\WebRoot\WEB-INF下的web.xml,主要是添加有关CXF构建服务的web描述,通常添加如下:

其中<servlet-mapping>中的<url-pattern>中设置的是对服务请求时的拦截(在实际应用中常常输入的URL到这一级,产看在此工程中总共部署了几个服务,以及每个服务下的方法名和服务的targetNamespace)。

(4)添加beans.xml,这个是Spring的配置文件。这个文件在工程名\WebRoot\WEB-INF下。通常配置如下:


 5)将服务部署到Tomcat中,启动服务,输入:http://ip地址:端口号/工程名/web.xml中配置的拦截名/beans.xml中的address配置名称?wsdl.

2、JAX-WS annotation

 主要常用接口:

Oneway 

只有输入值,无返回值

WebMethod

对方法进行注解

WebParam

对输入参数进行注解

WebResult

对返回数据进行注解

WebService

注解一个web服务

@WebService,必选的标注。用于导出的服务接口及其实现类

name

定义导出的服务接口的名字,对应于WSDL文档中wsdl:portType。默认是服务接口的Java类名加PortType

targetNamespace

定义导出的服务接口的名域(namespace),默认是倒置的服务接口Java包名。如demo.cxf.UserService的名域将会是http://cxf.demo/

serviceName

定义服务名,与名域一起唯一标识一个服务。默认是其Java类名

wsdlLocation

其WSDL文档URL。可由服务器容器自动产生

endpointInterface

指定服务接口的Java类。通常用于服务实现类的标注。应当指定类的全名,如demo.cxf.UserService

portName

对应WSDL文档中的wsdl:port元素。默认是Java类名加Port

@WebMethod,可选的标注,用于服务接口的方法

operationName

指定方法在WSDL文档中的名字,客房端用此名字调用方法

action

Specifies the value of the soapAction attribute of the soap:operation element generated for the method. The default value is an empty string.

exclude

生成WSDL文档时将该方法排除在外

@SOAPBinding,可选的标注,用于指定生成的SOAP定义文档风格。关于此标注再详细的信息请查阅SOAP标准等参考资料

style

Style.DOCUMENT (默认)

Style.RPC

SOAP消息风格

use

Use.LITERAL (默认)

Use.ENCODED

SOAP数据编码方式

parameterStyle

ParameterStyle.BARE

ParameterStyle.WRAPPED (默认)

Specifies how the method parameters, which correspond to message parts in a WSDL contract, are placed into the SOAP message body. A parameter style of BARE means that each parameter is placed into the message body as a child element of the message root. A parameter style of WRAPPED means that all of the input parameters are wrapped into a single element on a request message and that all of the output parameters are wrapped into a single element in the response message. If you set the style to RPC you must use the WRAPPED parameter style.

@RequestWrapper,可选的标注,用于指定如何包装客户端调用服务方法使用的参数

@ResponseWrapper,可选的标注,用于指定如何包装客户端调用服务方法的返回值

@WebFault,可选的标注,用于注解服务接口方法抛出的异常

name

异常的名字

targetNamespace

对应的名域,默认是服务接口的名域

faultName

实现该异类的类名

@WebParam,可选的标注,用于指定方法参数的使用方式

name

在WSDL文档中的名字,默认是arg0,arg1…

targetNamespace

对应的名域。默认是服务接口的名域

mode

Mode.IN (默认)、Mode.OUT、Mode.INOUT对于Java程序没有意义

header

true或者false(默认),指定该参数是否在SOAP消息头部发送

partName

Specifies the value of the name attribute of the wsdl:part element for the parameter when the binding is document.

@WebResult,可选的标注,用于指定返回值的使用方式

name

返回值在WSDL文件中的名字。默认是return

targetNamespace

对应的名域。默认是服务接口的名域

header

true或者false(默认),指定该参数是否在SOAP消息头部发送

partName

Specifies the value of the name attribute of the wsdl:part element for the parameter when the binding is document.

具体请参考j2EE API是如下两个包:javax.jwsjavax.jws.soap

3、CXF之JAXB

通常情况下我们不直接传对象,因为直接传递对象安全性差,而且暴露了实体对象。所以我们选择传递XML文件,当然也可以传递JSON对象。对于传递XML,JAX-WS采用的是JAXB工具。

JAXB(Java Architecture for XML Binding)提供了一个快速而方便的方式绑定XML Schemas和java,使java程序员能够很方便的在java应用程序中处理XML数据。JAXB提供了将XML文档解组为java内容树的方法, 以及将java内容树重新编组回XML文档的方法。JAXB同样也提供了一种从java对象生成XML Schema的方式。

这里有几个重要的定义:

编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。

解组(Unmarshalling) 是把数据从存储媒介转换到内存中的过程--正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。

JAXB 数据类型相互映射:

JAXB annotation

XmlRootElement

@XmlRootElement 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中会以一个全局元素的形式出现,元素的类型是一个包含 Java 类属性的 XML 复杂数据类型。我们可以通过 @XmlRootElement 注解的 name 属性来定制映射的 schema 全局元素的名称,一般来说以 @XmlRootElement 标注的类在相应的 XML 文档中会以最外层或根节点形式出现。

XmlAccessorType

@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。

XmlAccessType

用于控制字段或属性的序列化。

FIELD ,JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML

NONE, 只有使用一些 JAXB 注释专门对它们进行注释的所有字段或属性才绑定到 XML。

PROPERTY, JAXB 绑定类中的每个获取方法/设置方法对将会自动绑定到 XML。

PUBLIC_MEMBER, 每个公共获取方法/设置方法对和每个公共字段将会自动绑定到 XML。

XmlType

@XmlType 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中中会以一个 XML 复杂数据类型的形式出现。可以通过 @XmlType 注解的 name 属性来定制映射的 XML 数据类型的名称,用 propOrder 属性来定制映射后的复杂数据类型的内容顺序等。

XmlElement

@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。

XmlTransient

@XmlTransient表明当前字段不用映射成为xml的属性

XmlAttribute

@XmlAttribute 注解用于标注 Javabean 属性,用它标注的属性在映射后的 schema 中以元素属性形式表现。我们可以通过 @XmlAttribute 注解的 name 属性来定制映射后的名称,用 required 属性来指定是否映射后的属性为必须出现的。

XmlJavaTypeAdapter

XmlAdapter

使用这两个主要是为了那种 xml data type无法映射为Java object而准备的,比如Collection和Map及实现类等。

例:@XmlJavaTypeAdapter(AdapterPurchaseListToHashMap.class)// 使用自定义的实现 XmlAdapter 接口的适配器 for custom marshaling。

对于基本类型(如int, long, double, string),不需要添加任何的annotation就可以进行把java data type映射到web service schema data type,即使是自定义的class来包装基本类型也不需要添加任何的annotation就可以进行把java data type映射到web service schema data type。

但总是有一些特殊的data type,如

1. BigDecimal Type

2. java.net.URI Type

3. Duration

4. Binary Types

5. XMLGregorianCalendar Type

6. UUID Type

7. Typed Variables

8. Collections Types

9. Array Types

10. Enum type

请参考:

²  http://docs.sun.com/app/docs/doc/820-1072/ahigx?l=zh_TW&a=view

²  http://www.ibm.com/developerworks/cn/webservices/1003_sunzg_jaxb/

具体请参考j2EE API是如下两个包:

²  javax.xml.bind.annotation

²  javax.xml.bind.annotation.adapters

@WebResult,可选的标注,用于指定返回值的使用方式

name

返回值在WSDL文件中的名字。默认是return

targetNamespace

对应的名域。默认是服务接口的名域

header

true或者false(默认),指定该参数是否在SOAP消息头部发送

partName

Specifies the value of the name attribute of the wsdl:part element for the parameter when the binding is document.

 具体请参考j2EE API是如下两个包:javax.jwsjavax.jws.soap

4 、CXF之WSDL

     WSDL 是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似 远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服 务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。

     WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。因此,WSDL 文档在Web服务的定义中使用下列元素:

l  Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。

l  Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。

l  Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。

l  PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。

l  Binding - 特定端口类型的具体协议和数据格式规范的绑定。

l  Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。

l  Service - 相关服务访问点的集合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值