使用SAAJ 和JAXM的SOAP客户端及服务(一)
本模块讲述了如何使用用于JavaTM 的带附件的SOAP(SAAJ)和用于XML消息的Java TM API(JAXM)创建能够发送和接收消息的客户端,以及如何部署它们到Sun ONE Application Server上。本模块包括以下几节:
本节讲述了SOAP客户端可以采用的两种消息模型以及开发和部署这类客户端的过程。本节包括以下主题:
可以使用以下两种消息模型建立SOAP客户端
不使用消息提供者的应用程序只能交换同步消息。也就是说,扮演客户端角色的应用程序只能发送请求-响应消息。这种类型的客户端采用SAAJ API的SOAPConnection方法。下图演示了在没有消息提供者的情况下,同步消息如何在发送者和接收者之间交换。
不使用消息提供者的SOAP消息

不使用消息提供者的客户端具有以下优点:
不使用消息提供者的客户端具有以下局限性:
如果想要获得并且保存在任何时间发送给你的请求,你必须使用消息提供者。JAXM API提供了使用消息提供者发送和接收消息的框架。你需要在容器中运行客户端,容器提供了消息基础结构让提供者使用。下图演示了在使用消息提供者的情况下,异步消息如何在发送者和接收者之间交换。
使用消息提供者的SOAP消息

使用消息提供者的客户端具有以下优点:
注意
Sun ONE Application Server包含了一个示例JAXM提供者,它演示了如何使用提供者为发送客户端激活“发后不理(fire and forget)”消息。请察看示例文档获取关于如何激活、部署和使用它的全面信息。示例应用程序可以从以下位置得到:
install_dir/samples/webservices/jaxm/jaxm-provider/
Sun ONE Application Server的未来版本将会包括支持可靠SOAP消息和ebXML消息的JAXM提供者。
SOAP消息是一个包括SOAPEnvelope、一个可选的SOAPHeader、以及SOAPBody的XML文件。SOAP消息头包含了使消息在到达最终目的地之前,能够被路由到一个或多个中间节点的信息。

这个图展示了SOAP消息的结构和组成部分。不同对象代表了SOAP消息的每一个部分。
SOAPMessage对象包括:
SOAPEnvelope是代表消息的XML文件的根元素。它为消息如何处理、由谁处理定义了框架。XML内容从SOAPEnvelope开始。
SOAPHeader是添加特性到SOAP消息的基本机制。它可以容纳任意数目的扩展了基础协议的子元素。例如,header子元素可能会定义认证信息、事务信息、本地信息、等等。处理消息的软件可以在没有事先约定的情况下,使用这个机制定义谁应该处理某个特性,以及该特性是强制的还是可选的。
body是发给消息最终接收者的强制信息的容器。SOAP消息还可以容纳一个附件,它不一定非得是XML文件。
当创建消息体或附件的时候,以及处理消息的时候,你需要访问消息的组成部分。
SOAPMessage对象含有一个SOAPPart对象。通过message对象可以得到它。
SOAPPart soapPart = message.getSOAPPart();
然后你可以利用SOAPPart获得它所含有的SOAPEnvelope对象。
SOAPEnvelope envelope = soapPart.getEnvelope();
现在你可以利用envelope获得它的空SOAPHeader和SOAPBody对象。
SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();
SOAPBody对象最初是空的。
XML命名空间是一种限定元素和属性名称的方法,目的是消除它们与同一文件中其他名称之间产生的歧义。一个名确的XML命名空间声明采用如下格式:
<prefix:myElement
xmlns:prefix ="URI">
声明定义prefix作为一个特定URI的别名。在myElement元素内,你可以对任何元素或属性使用前缀,从而指定元素或属性属于URI指定的命名空间。下面的代码是命名空间声明的一个例子。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
该定义定义了SOAP_ENV作为命名空间http://schemas.xmlsoap.org/soap/envelope/
的别名。
定义了别名之后,可以使用它作为Envelope元素中任何属性或元素的前缀。
当使用SAAJ或JAXM构造或者消费消息的时候,你有责任保证正确设定或处理命名空间,并且丢弃含有错误命名空间的消息。
当创建SOAP消息的body或header元素的时候,你必须使用命名空间为元素指定一个完整的名称。通过调用方法SOAPEnvelope.createName可以获得一个名称。
调用该方法时,可以传递一个本地名称作为参数,或者可以指定本地名称、前缀、以及URI。例如,下面的命令行定义了一个名为bodyName的Name对象。
Name bodyName = MyEnvelope.createName("TradePrice", "GetLTP", "http://foo.eztrade.com");
这和下面的命名空间声明作用相同。
<GetLTP:TradePrice xmlns:GetLTP= "http://foo.eztrade.com">
下面的代码演示了如何创建一个名称并把它和SOAPBody元素绑定。注意createName方法的使用和位置。
SoapBody body = envelope.getBody();//get body from envelope
Name bodyName = envelope.createName("TradePrice", "GetLTP", "http://foo.eztrade.com");
SOAPBodyElement gltp = body.addBodyElement(bodyName);
利用SAAJ,客户端能够以点对点的方式创建并且发送SOAP消息。JAXM为使用消息提供者的XML消息定义了API。JAXM依赖用于 Java 的带有附件的 SOAP API(SAAJ),它定义了在Java中操作带有附件的SOAP消息模型的API。Sun ONE Application Server不包括它所支持的JAXM消息提供者。然而它的确包含了示例应用程序,一个简单的JAXM提供者,演示了一个消息提供者如何处理来自客户端的异步SOAP消息。本节讲述以下主题:
当消息工厂生产的SOAP消息通过连接被发送到一个端点的时候,SOAP消息就出现了。本节讲述以下主题:
端点标识消息的最终目的地。端点是由URLEndpoint类来定义的。如果不使用提供者,你可以构造或者查找到一个消息端点。
构造端点
你可以通过调用构造函数或者在名称服务中查找来初始化一个端点。
以下代码使用构造函数创建一个URLEndpoint:
myEndpoint = new URLEndpoint("http://host/myServlet")
使用端点发送消息
指定端点作为SOAPConnection.call方法的一个参数,该方法是用来发送SOAP消息的。
向多个端点发送消息
管理对象是封装了针对提供者的配置和命名信息的对象。如果使用管理对象定义端点,需要注意的是:可以把该管理对象绑定到多个URL——每个URL都能够处理到达的SOAP消息。
以下代码示例把lookup名称为myEndpoint的端点绑定到两个URL:http://www.myServlet1/
和 http://www.myServlet2/。这个语法允许你使用SOAP连接发布SOAP消息到多个端点。
imqobjmgr add
-t e
-l "cn=myEndpoint"
-o "imqSOAPEndpointList=http://www.myServlet1/
http://www.myServlet2/"
想要利用SAAJ或JAXM发送SOAP消息,必须分别获得一个SOAPConnection 或ProviderConnection。你还可以使用消息队列传输消息;更多信息请参见Sun ONE消息队列开发人员指南。
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3343095
[2005-10-24 16:56:20.0] SOAP的HelloWord实例
[2005-10-27 16:53:53.0] Java中的SOAP技术应用
[2005-10-27 16:58:47.0] 使用SOAP开发Java Web服务详解
[2005-10-26 11:38:57.0] 使用SOAP开发java web服务--Axis开发方案
[2005-10-23 19:49:55.0] 一个人用ADSL真爽