面向服务
![](/icons/22924de.gif)
架构(SOA)和面向服务
![](/icons/22924de.gif)
集成(SOI)得到了广泛
![](/icons/22924de.gif)
应用
![](/icons/22924dou.gif)
并且有
![](/icons/22924yi.gif)
种需求变得越来越明显:业务需要集成系统
![](/icons/22924dou.gif)
并允许消费者利用基于标准
![](/icons/22924de.gif)
思路方法访问服务
![](/icons/22924dou2.gif)
SOA是
![](/icons/22924yi.gif)
种架构范例
![](/icons/22924dou2.gif)
在这种架构中
![](/icons/22924dou.gif)
可重用
![](/icons/22924de.gif)
业务逻辑表现为包含基于标准
![](/icons/22924de.gif)
、定义良好
![](/icons/22924de.gif)
接口
![](/icons/22924de.gif)
服务集
![](/icons/22924dou.gif)
并且可以以松散耦合方式访问它
![](/icons/22924dou2.gif)
![](/icons/22924yinwei.gif)
Web Service标准
![](/icons/22924de.gif)
供应商
![](/icons/22924de.gif)
支持
![](/icons/22924dou.gif)
以及利用基于这种标准
![](/icons/22924de.gif)
软件Software集成区别
![](/icons/22924de.gif)
系统相对容易
![](/icons/22924dou.gif)
所以在解决企业集成问题方面
![](/icons/22924dou.gif)
SOA得到了普遍
![](/icons/22924de.gif)
认可
![](/icons/22924dou2.gif)
基于Java
![](/icons/22924de.gif)
中间件和企业应用
![](/icons/22924chengxu.gif)
集成(EAI)产品已经被使用了
![](/icons/22924yi.gif)
段时间
![](/icons/22924dou.gif)
现在
![](/icons/22924dou.gif)
许多公司在以区别
![](/icons/22924de.gif)
方式使用这项技术
![](/icons/22924dou2.gif)
虽然
![](/icons/22924yi.gif)
些服务是在Java平台上开发和提供
![](/icons/22924de.gif)
![](/icons/22924dou.gif)
但来自基于Java
![](/icons/22924de.gif)
应用
![](/icons/22924chengxu.gif)
![](/icons/22924de.gif)
服务消费还有其他灵活
![](/icons/22924de.gif)
需求
![](/icons/22924dou2.gif)
SOAP with Attachments API for Java (SAAJ)通过提供访问服务
![](/icons/22924de.gif)
标准API来帮助这些服务
![](/icons/22924de.gif)
消费
![](/icons/22924dou2.gif)
有几个基于Java
![](/icons/22924de.gif)
API可以用来访问服务
![](/icons/22924dou2.gif)
这些服务包括SAAJ、基于Java API for XML
![](/icons/22924de.gif)
RPC(JAX-RPC)和Web服务
![](/icons/22924diaoyong.gif)
框架(WSIF)
![](/icons/22924dou2.gif)
SAAJ提供了构建服务消费者以及提供者
![](/icons/22924de.gif)
API
![](/icons/22924dou2.gif)
让我们看
![](/icons/22924yi.gif)
看如何利用SAAJ在SOA中开发Web Service
![](/icons/22924de.gif)
消费者
![](/icons/22924dou2.gif)
我们将举例介绍说明WebLogic Integration
![](/icons/22924de.gif)
组合过程
![](/icons/22924dou.gif)
该过程有机地结合了获取城市邮政编码
![](/icons/22924de.gif)
服务、获取邮政分区
![](/icons/22924de.gif)
温度
![](/icons/22924de.gif)
服务
![](/icons/22924dou.gif)
以及消费该服务
![](/icons/22924de.gif)
![](/icons/22924yi.gif)
个举例SAAJ客户机
![](/icons/22924dou2.gif)
什么是SAAJ?
SAAJ是在松散耦合软件Software系统中利用SOAP协议实现
![](/icons/22924de.gif)
基于XML消息传递
![](/icons/22924de.gif)
API规范标准
![](/icons/22924dou2.gif)
顾名思义
![](/icons/22924dou.gif)
SAAJ支持带附件
![](/icons/22924de.gif)
SOAP消息
![](/icons/22924dou2.gif)
对于Java API for XML Messaging (JAXM)
![](/icons/22924dou.gif)
您已经了解很多
![](/icons/22924dou.gif)
并且可能感到奇怪
![](/icons/22924dou.gif)
究竟JAXM发生了什么事?JAXM 1.0
![](/icons/22924de.gif)
理念是通过提供消息传递和SOAP API
![](/icons/22924dou.gif)
允许开发人员根据SOAP编写支持消息传递标准
![](/icons/22924de.gif)
业务应用
![](/icons/22924chengxu.gif)
![](/icons/22924dou2.gif)
随着JAXM 1.1版
![](/icons/22924de.gif)
推出
![](/icons/22924dou.gif)
SOAP API (javax.xml.soap)被分割成了SAAJ1.1规范标准和JAXM1.1
![](/icons/22924dou.gif)
JAXM1.1只包含基于消息传递
![](/icons/22924de.gif)
API(javax.xml.messaging)
![](/icons/22924dou2.gif)
目前
![](/icons/22924dou.gif)
正在使用
![](/icons/22924de.gif)
SAAJ版本是1.2
![](/icons/22924dou2.gif)
WebLogic Server 8.1 SP2 支持SAAJ 1.1规范标准
![](/icons/22924dou2.gif)
SAAJ 1.2 API主要由javax.xml.soap包组成
![](/icons/22924dou.gif)
它为带有多用途互连网邮件扩展协议(MIME)附件
![](/icons/22924de.gif)
SOAP消息提供抽象
![](/icons/22924dou2.gif)
该API提供了创建到端点
![](/icons/22924de.gif)
点到点连接
![](/icons/22924de.gif)
思路方法、创建并处理SOAP消息和附件
![](/icons/22924de.gif)
思路方法
![](/icons/22924dou.gif)
以及接收和处理SOAP
![](/icons/22924cuowu.gif)
![](/icons/22924de.gif)
思路方法
![](/icons/22924dou2.gif)
虽然在开发企业应用
![](/icons/22924chengxu.gif)
![](/icons/22924de.gif)
时候
![](/icons/22924dou.gif)
有几种技术供您选择
![](/icons/22924dou.gif)
但对于区别
![](/icons/22924de.gif)
问题
![](/icons/22924dou.gif)
某些技术可能更合适
![](/icons/22924dou2.gif)
选择正确
![](/icons/22924de.gif)
工具非常重要
![](/icons/22924dou2.gif)
选择SAAJ
![](/icons/22924de.gif)
理由是什么呢?SAAJ无疑很适合基于文档
![](/icons/22924de.gif)
同步或者异步Web Service
![](/icons/22924dou2.gif)
SAAJ使用简单
![](/icons/22924dou.gif)
有助于您在Java环境中集成各种Web Service
![](/icons/22924dou.gif)
它扩展了对文档风格
![](/icons/22924de.gif)
Web Service通信
![](/icons/22924de.gif)
自然支持(natural support)
![](/icons/22924dou2.gif)
SAAJ还支持基于标准接口上
![](/icons/22924de.gif)
XML消息传递
![](/icons/22924dou.gif)
并且这
![](/icons/22924yi.gif)
点得到了供应商
![](/icons/22924de.gif)
广泛支持
![](/icons/22924dou2.gif)
编写客户机
清单 1显示了
![](/icons/22924yi.gif)
个用SAAJ编写
![](/icons/22924de.gif)
简单
![](/icons/22924de.gif)
消费者
![](/icons/22924dou.gif)
它访问了
![](/icons/22924yi.gif)
个同步WebLogic Integration过程
![](/icons/22924dou.gif)
来获得给定城市
![](/icons/22924de.gif)
温度
![](/icons/22924dou2.gif)
完整
![](/icons/22924de.gif)
项目可以从www.WebLogicPro.com下载
![](/icons/22924dou2.gif)
下面将讨论完成该项目所必需
![](/icons/22924de.gif)
步骤
![](/icons/22924dou2.gif)
清单 1. 用SAAJ编写
![](/icons/22924de.gif)
这个简单
![](/icons/22924de.gif)
消费者访问了
![](/icons/22924yi.gif)
个同步WebLogic Integration过程
![](/icons/22924dou.gif)
来获得给定城市
![](/icons/22924de.gif)
温度
![](/icons/22924dou2.gif)
private
![](/icons/22924static.gif)
void invokeService(
String serviceUrl, String inputXml)
{
SOAPMessage reply = null;
try
{
//Create Soap Connection
SOAPConnectionFactory scf = SOAPConnectionFactory.
![](/icons/22924new.gif)
Instance
![](/icons/22924kh.gif)
;
SOAPConnection con = scf.createConnection
![](/icons/22924kh.gif)
;
//Create Message
MessageFactory mf = MessageFactory.
![](/icons/22924new.gif)
Instance
![](/icons/22924kh.gif)
;
SOAPMessage msg = mf.createMessage
![](/icons/22924kh.gif)
;
// Get the SOAPPart from the message
SOAPPart soapPartInput = msg.getSOAPPart
![](/icons/22924kh.gif)
;
// Creating an attachment Part[Page]
AttachmentPart attachPart = msg.createAttachmentPart
![](/icons/22924kh.gif)
;
attachPart.
![](/icons/22924set.gif)
Content( \"This is a text attachment\", \"text/plain\");
// Create and
![](/icons/22924set.gif)
the content from the
// input XML document
StringReader
![](/icons/22924string.gif)
ReaderInput =
![](/icons/22924new.gif)
StringReader(inputXml);
StreamSource ssInput = apPartInput.
![](/icons/22924set.gif)
Content(ssInput);
// Save the changes to the message
msg.saveChanges
![](/icons/22924kh.gif)
;
// Invoke the service synchronously and
// get the reply
reply = con.call(msg, serviceUrl);
// Get the SOAP body from the response
SOAPBody outSoapBody = reply.getSOAPPart
![](/icons/22924kh.gif)
.getEnvelope
![](/icons/22924kh.gif)
.getBody
![](/icons/22924kh.gif)
;
// Check to see
![](/icons/22924if.gif)
there is any SOAP Fault
![](/icons/22924if.gif)
(outSoapBody.hasFault
![](/icons/22924kh.gif)
)
{
// Take any actions for the exception scenario
SOAPFault fault = outSoapBody.getFault
![](/icons/22924kh.gif)
;
// Log the fault details
![](/icons/22924System.gif)
.out.pr
![](/icons/22924int.gif)
ln(\"SOAP Fault occurred\");
![](/icons/22924System.gif)
.out.pr
![](/icons/22924int.gif)
ln(\"Fault Code is \" + fault.getFaultCode
![](/icons/22924kh.gif)
);
![](/icons/22924System.gif)
.out.pr
![](/icons/22924int.gif)
ln(\"Fault String is \" + fault.getFaultString
![](/icons/22924kh.gif)
);
}
![](/icons/22924else.gif)
{
// Pr
![](/icons/22924int.gif)
the output SOAP envelope
![](/icons/22924System.gif)
.out.pr
![](/icons/22924int.gif)
ln( reply.getSOAPPart
![](/icons/22924kh.gif)
.getEnvelope
![](/icons/22924kh.gif)
);
}
// Close the connection
con.close
![](/icons/22924kh.gif)
;
}
catch (SOAPException e)
{
// Pr
![](/icons/22924int.gif)
the stack trace
![](/icons/22924if.gif)
there are any
// SOAPExceptions
e.pr
![](/icons/22924int.gif)
StackTrace
![](/icons/22924kh.gif)
;
}
}
首先
![](/icons/22924dou.gif)
创建
![](/icons/22924yi.gif)
个SOAP连接
![](/icons/22924dou2.gif)
SAAJ客户机可以利用SOAP Connection Factory
![](/icons/22924dou.gif)
通过创建SOAPConnection来建立点到点
![](/icons/22924de.gif)
同步连接
![](/icons/22924dou2.gif)
该连接提供了同步
![](/icons/22924diaoyong.gif)
服务
![](/icons/22924de.gif)
思路方法
![](/icons/22924dou2.gif)
接下来
![](/icons/22924dou.gif)
将利用MessageFactory.
![](/icons/22924new.gif)
Instance
![](/icons/22924kh.gif)
创建
![](/icons/22924yi.gif)
个消息工厂
![](/icons/22924de.gif)
新例子
![](/icons/22924dou2.gif)
然后利用消息工厂
![](/icons/22924de.gif)
createMessage
![](/icons/22924kh.gif)
思路方法创建
![](/icons/22924yi.gif)
条SOAPMessage
![](/icons/22924dou2.gif)
这样就创建了
![](/icons/22924yi.gif)
条没有内容
![](/icons/22924de.gif)
消息
![](/icons/22924dou2.gif)
SOAPMessage可以有
![](/icons/22924yi.gif)
个SOAPPart
![](/icons/22924dou.gif)
它包含XML SOAP消息和
![](/icons/22924yi.gif)
个用于 2进制/文本附件
![](/icons/22924de.gif)
AttachPart
![](/icons/22924dou2.gif)
通过
![](/icons/22924diaoyong.gif)
消息
![](/icons/22924de.gif)
getSOAPPart
![](/icons/22924kh.gif)
思路方法可以得到SOAPPart
![](/icons/22924dou2.gif)
利用消息
![](/icons/22924de.gif)
createAttachPart
![](/icons/22924kh.gif)
思路方法可以创建附件部分
![](/icons/22924dou2.gif)
并且可以利用AttachPart
![](/icons/22924set.gif)
Content
![](/icons/22924kh.gif)
思路方法设置附件
![](/icons/22924dou2.gif)
第1个参数是附件
![](/icons/22924dou.gif)
第2个参数是内容类型
![](/icons/22924dou2.gif)
现在
![](/icons/22924dou.gif)
要利用采用
![](/icons/22924yi.gif)
个Source 对象
![](/icons/22924de.gif)
![](/icons/22924set.gif)
Content
![](/icons/22924kh.gif)
思路方法来设置SOAPPart
![](/icons/22924de.gif)
内容
![](/icons/22924dou2.gif)
该举例展示了用StringReader 和 StreamSource对象设置String中
![](/icons/22924de.gif)
内容
![](/icons/22924de.gif)
思路方法
![](/icons/22924dou.gif)
但其源对象可以是任何东西
![](/icons/22924dou2.gif)
例如
![](/icons/22924dou.gif)
如果您正在从文件中读取输入
![](/icons/22924dou.gif)
则可以使用FileInputStream设置该内容
可以
![](/icons/22924diaoyong.gif)
SOAPMessage
![](/icons/22924de.gif)
saveChanges
![](/icons/22924kh.gif)
思路方法
![](/icons/22924dou.gif)
来保存对消息
![](/icons/22924de.gif)
更改
![](/icons/22924dou2.gif)
在
![](/icons/22924diaoyong.gif)
连接
![](/icons/22924de.gif)
“call”思路方法时(这是下
![](/icons/22924yi.gif)
步操作)
![](/icons/22924dou.gif)
这些更改也是被自动保存
![](/icons/22924de.gif)
![](/icons/22924dou2.gif)
“call”思路方法把消息和端点作为参数(接受)
![](/icons/22924dou2.gif)
所有来自服务
![](/icons/22924de.gif)
同步响应将在SOAPMessage返回参数中返回
![](/icons/22924dou2.gif)
如果服务是异步服务
![](/icons/22924dou.gif)
那么客户机应该忽略返回
![](/icons/22924de.gif)
SOAPMessage
![](/icons/22924dou2.gif)
最后
![](/icons/22924dou.gif)
检查由服务返回
![](/icons/22924de.gif)
所有
![](/icons/22924cuowu.gif)
![](/icons/22924dou2.gif)
![](/icons/22924diaoyong.gif)
close
![](/icons/22924kh.gif)
思路方法关闭连接
![](/icons/22924dou2.gif)
所有SOAP级异常都将作为SOAPException被抛出
![](/icons/22924dou2.gif)
SOAP Fault处理
SOAP规范标准定义了
![](/icons/22924yi.gif)
个利用SOAP Fault将异常传回消费者
![](/icons/22924de.gif)
标准思路方法
![](/icons/22924dou2.gif)
虽然SOAP 1.1和SOAP1.2
![](/icons/22924de.gif)
SOAP Fault 结构存在很大
![](/icons/22924de.gif)
差异
![](/icons/22924dou.gif)
但所有这些版本确实有
![](/icons/22924yi.gif)
些通用元素
![](/icons/22924dou2.gif)
有关SOAP Fault
![](/icons/22924de.gif)
更多信息
![](/icons/22924dou.gif)
请参阅 www.w3.org/TR/2003/REC-soap12-part1-20030624/#soapfault
![](/icons/22924dou2.gif)
[Page]
SAAJ提供了查找是否出现SOAP
![](/icons/22924cuowu.gif)
![](/icons/22924de.gif)
API
![](/icons/22924dou.gif)
并且如果出现SOAP
![](/icons/22924cuowu.gif)
![](/icons/22924dou.gif)
那么它将提供访问
![](/icons/22924cuowu.gif)
元素
![](/icons/22924de.gif)
思路方法
![](/icons/22924dou.gif)
比如fault code、fault
![](/icons/22924string.gif)
、fault actor和fault detail元素
![](/icons/22924dou2.gif)
SOAPBody有以下这些思路方法:
hasFault
![](/icons/22924kh.gif)
——如果返回SOAP Fault
![](/icons/22924dou.gif)
则返回true
getFault
![](/icons/22924kh.gif)
——返回SOAPFault对象
SOAPFault有下面这些处理fault对象
![](/icons/22924de.gif)
思路方法:
getFaultCode
![](/icons/22924kh.gif)
——返回SOAP
![](/icons/22924cuowu.gif)
中
![](/icons/22924de.gif)
![](/icons/22924cuowu.gif)
代码
getFaultString
![](/icons/22924kh.gif)
——返回
![](/icons/22924cuowu.gif)
![](/icons/22924zifu.gif)
串
getFaultActor
![](/icons/22924kh.gif)
——返回指出
![](/icons/22924cuowu.gif)
来源
![](/icons/22924de.gif)
![](/icons/22924cuowu.gif)
操作符
getDetail
![](/icons/22924kh.gif)
——返回fault detail元素
![](/icons/22924dou2.gif)
清单 1给出了出现
![](/icons/22924cuowu.gif)
时记录
![](/icons/22924cuowu.gif)
元素所在的处
![](/icons/22924de.gif)
![](/icons/22924yi.gif)
个举例
![](/icons/22924dou2.gif)
WebLogic Integration过程
图1展示了Get Temperature
![](/icons/22924de.gif)
组合过程
![](/icons/22924dou2.gif)
该过程将下述
![](/icons/22924de.gif)
服务有机地结合在
![](/icons/22924yi.gif)
起
![](/icons/22924dou.gif)
从而获得某
![](/icons/22924yi.gif)
给定城市和国家
![](/icons/22924de.gif)
温度:
接收城市和州
![](/icons/22924de.gif)
位置信息
![](/icons/22924dou.gif)
并将它放置在XML文档中
使用U.S. Zip Web服务(www.xmethods.net)获取具有给定名称
![](/icons/22924de.gif)
所有城市
![](/icons/22924de.gif)
邮政编码和所在州
![](/icons/22924de.gif)
列表
利用转换服务获取所提供
![](/icons/22924de.gif)
特定州中城市
![](/icons/22924de.gif)
邮政编码
![](/icons/22924diaoyong.gif)
天气-温度服务
![](/icons/22924dou.gif)
获取该邮政编码区域
![](/icons/22924de.gif)
温度(www.xmethods.net)
将结果转换成位置输出文档
![](/icons/22924dou.gif)
并返回它
合理处理所有异常
![](/icons/22924dou2.gif)
![](\"/Files/BeyondPic/2007-6/16/sxx7k5kb67jk.g<img)
\">
图 1.
以上是 WebLogic Integration Get Temperature
![](/icons/22924de.gif)
组合过程