用Java实现SOAP的XML文档网络传输及远程过程调用RPCWord文档格式.docx
- 文档编号:20722199
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:20
- 大小:25.60KB
用Java实现SOAP的XML文档网络传输及远程过程调用RPCWord文档格式.docx
《用Java实现SOAP的XML文档网络传输及远程过程调用RPCWord文档格式.docx》由会员分享,可在线阅读,更多相关《用Java实现SOAP的XML文档网络传输及远程过程调用RPCWord文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
3、将\JDK1.4.2\lib\路径下的tools.jar也复制到Tomcat的“Tomcat5.0\common\lib”目录下。
4、将soap解压目录的webapps目录下的soap.war文件,复制到Tomcat的“Tomcat5.0\webapps”目录下,这个目录是Tomcat的WEB应用所在目录。
重新启动Tomcat,Tomcat会自动将其解压,并配置好路径。
可以尝试在浏览器中输入“”,看SOAP是否安装好。
5、注意在编写程序时,需要将所得到的四个jar文件路径设置到所使用的Java编程环境中,因为在程序中需要用到其中的类文件。
具体步骤略。
6、重启Tomcat服务。
这时Tomcat会将“Tomcat5.0\common\lib”目录下新加入的包加载到内存中。
到此,我们已经配置好了程序运行所需要的环境。
2.基于SOAP的XML文档网络传输
SOAP规范主要定义了四个元素:
SOAP信封规范,传输和协议绑定,编码规则和一个RPC协定。
用于实现消息的网络传输。
SOAP信封规范,SOAP信封规范对计算机间传递的数据如何封装定义了具体的规则。
这包括应用特定的数据,如要调用的方法名,方法参数和返回值;
还包括谁将处理封装内容,失败时如何编码错误消息等信息。
数据编码规则,为了交换数据,计算机必须在编码特定数据类型的规则上达成一致,SOAP也有自己的一套编码数据类型的约定。
大部分约定都基于W3CXMLSchema规范。
RPC协定,SOAP能用于单向和双向等各种消息接发系统。
SOAP为双向消息接发定义了一个简单的协定来进行远程过程调用和响应,这使得客户端应用可以指定远程方法名,获取任意多个参数并接受来自服务器的响应。
传输和协议绑定,提供了更底层协议传输SOAP封套的一套通用机制。
而以上四个部分统称为一个SOAP消息。
我们先来看一篇XML文档是如何变成SOAP的。
采用一个简单的购物订单文件PO.xml。
内容为:
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
PurchaseOrderxmlns="
urn:
oreilly-jaws-samples"
<
shipTocountry="
US"
<
name>
JoeSmith<
/name>
street>
14OakPark<
/street>
city>
Bedford<
/city>
state>
MA<
/state>
zip>
01730<
/zip>
/shipTo>
items>
itempartNum="
872-AA"
<
productName>
CandyCanes<
/productName>
quantity>
444<
/quantity>
price>
1.68<
/price>
comment>
Iwantcandy!
/comment>
/item>
/items>
/PurchaseOrder>
其对应的SOAP消息为:
POST/ServletTemp/HTTPReceiveHTTP/1.0
Host:
localhost
Content-Type:
text/xml;
charset=utf-8
Content-Length:
939
SOAPAction:
"
xmlversion=1.0encoding=UTF-8?
SOAP-ENV:
Envelope
xmlns:
SOAP-ENV="
"
xmlns:
xsi="
xsd="
Header>
jaws:
MessageHeaderxmlns:
jaws="
SOAP-ENV:
mustUnderstand="
1"
From>
Me<
/From>
To>
You<
/To>
MessageId>
9999<
/MessageId>
/jaws:
MessageHeader>
/SOAP-ENV:
Body>
Envelope>
一个SOAP消息包括:
SOAP封套,SOAP头(可选),SOAP主体。
我们首先将XML文档包装到一个SOAP体中,然后再把SOAP体包装到一个SOAP封套中,可以在封套中再添加一个SOAP头(不是必须),最后将SOAP封套绑定到一个协议中。
我们来仔细分析一下代码。
SOAP封套
SOAP封套的声明在XML标签的最外层,它表明了一个SOAP文档的边界。
下面的封套标签显示了三个必要的属性,这些属性指明了封套中使用的名字空间和语法。
……
其中第一个属性:
是一个名字空间声明,防止多个XML文件组合时发生标签名字的冲突。
第二个属性声明了XML模式实例的名字空间。
前缀xsi必须放在这个名字空间定义的所有元素和属性之前。
最后一个属性是另外一个名字空间声明,它定义了XMLSchema名字空间,这个名字空间下的元素用来指定xsi:
type属性的值(如xsd:
string)。
SOAP头
SOAP头和体在语法上非常类似。
SOAP1.1和SOAP1.2都没有头里应该有些什么,它就是简单的存放一些指令,提供给接收消息的SOAP处理器。
建立在SOAP之上的更高级协议(比如ebXML消息服务)就通过定义一些特殊元素来规范SOAP头的格式。
另外当对RPC使用SOAP时,头部也可以用来表示一些底层信息。
SOAP主体
SOAP主体用来存放实际数据或消息的有效负载(本例中为XML文档),从而提供给最终的接受者使用或处理。
SOAP协议绑定
当绑定到一个HTTP协议时,需要在SOAP封套前面添加HTTP头的信息。
在SOAP1.1中SOAPAction是HTTP绑定所必须的部分,它的目的是让那些路由或分派的信息知道该做些什么,即使它们根本不知道SOAP或者没有解析SOAP封套的方法。
而在SOAP1.2中SOAPAction已变成可选的了。
SOAP消息的发送与接收
我们已经看到了一个SOAP消息的各个组成块,接下来我们要了解消息是怎样被创建的,以及怎样在两个端点之间进行传输的。
SOAP的发送端的代码:
packagejavaSoap01;
importjava.io.*;
importjava.util.*;
publicclassGenericHTTPSoapClient
{
PrivatestaticfinalStringDEFAULT_HOST_URL="
;
privatestaticfinalStringDEFAULT_DATA_="
./PO.xml"
privatestaticfinalStringURI="
privateStringm_hostURL;
privateStringm_data;
publicGenericHTTPSoapClient(StringhostURL,Stringdata)throwsException
{
m_hostURL=hostURL;
m_data=data;
System.out.println();
System.out.println("
_________________________________________________________"
);
System.out.println("
StartingGenericHTTPSoapClient:
hosturl="
+m_hostURL);
datafile="
+m_data);
___________________________________________________________"
}
//实际的传送工作是由sendSOAPMessage()方法完成的
publicvoidsendSOAPMessage()
try
{//首先读取XML文档,将其解析成DOM树。
fr=new(m_data);
//通过调用ApachegetXMlDocBuilder()方法得到一个解析器,它返回一个DocumentBuilder对象。
javax.xml.parsers.DocumentBuilderxdb=
org.apache.soap.util.xml.XMLParserUtils.getXMLDocBuilder();
//通过解析器解析文档,得到一个Document对象。
org.w3c.dom.Documentdoc=
xdb.parse(neworg.xml.sax.InputSource(fr));
if(doc==null){
throwneworg.apache.soap.SOAPException
(org.apache.soap.Constants.FAULT_CODE_CLIENT,"
parsingerror"
//createavectorforcollectingtheheaderelements
VectorheaderElements=newVector();
//Createaheaderelementinanamespace
org.w3c.dom.ElementheaderElement=
doc.createElementNS(URI,"
MessageHeader"
headerElement.setAttributeNS(URI,"
mustUnderstand"
"
//CreatesubnodeswithintheMessageHeader
org.w3c.dom.Elementele=doc.createElement("
From"
org.w3c.dom.TexttextNode=doc.createTextNode("
Me"
org.w3c.dom.NodetempNode=ele.appendChild(textNode);
tempNode=headerElement.appendChild(ele);
ele=doc.createElement("
To"
textNode=doc.createTextNode("
You"
tempNode=ele.appendChild(textNode);
MessageId"
9999"
headerElements.add(headerElement);
//createavectorforcollectingthebodyelements
VectorbodyElements=newVector();
//获取顶层DOM元素,放到向量中。
顶层节点的下层节点元素的创建和添加工作由DOM解析器负责。
bodyElements.add(doc.getDocumentElement());
//CreatetheSOAPenvelope
org.apache.soap.Envelopeenvelope=neworg.apache.soap.Envelope();
//AddtheSOAPheaderelementtotheenvelope
org.apache.soap.Headerheader=neworg.apache.soap.Header();
header.setHeaderEntries(headerElements);
envelope.setHeader(header);
//CreatetheSOAPbodyelement
org.apache.soap.Bodybody=neworg.apache.soap.Body();
body.setBodyEntries(bodyElements);
//AddtheSOAPbodyelementtotheenvelope
envelope.setBody(body);
//BuildtheMessage.
org.apache.soap.messaging.Messagemsg=
neworg.apache.soap.messaging.Message();
msg.send(new.URL(m_hostURL),URI,envelope);
System.out.println("
SentSOAPMessagewithApacheHTTPSOAPClient."
//从传输中接受响应并将其打印到屏幕上
Waitingforresponse...."
org.apache.soap.transport.SOAPTransportst=msg.getSOAPTransport();
BufferedReaderbr=st.receive();
Stringline=br.readLine();
if(line==null)
HTTPPOSTwassuccessful.\n"
else
while(line!
=null)
System.out.println(line);
line=br.readLine();
catch(Exceptione)
e.printStackTrace();
publicstaticvoidmain(Stringargs[]){
//省略……
}
在上述程序中,当我们构造好SOAP封套后,它需要被送到一个目的地去。
在ApacheSOAP中,有一个Message对象来处理异步的单向传送。
Message.send()方法有三个参数:
一个URL,用于指明传送地点;
一个URI,用于表示SOAPAction头的值;
还有一个SOAP封套。
SOAPActionURI实际上是绑定HTTP的一部分,用来指定当一个消息到达传送目的地的时候调用哪个函数或服务。
Message接口用于异步单向通信,Message.seng()函数的返回值为void型。
但这并不妨碍它在双向同步会话中使用。
当这个Message接口是基于一个双向传输协议(例如HTTP)实现的时候,SOAPTransport.receive()方法就能用来接收一个响应。
在SOAPTransport是基于HTTP实现的情况下,receive()方法阻塞并等待一个错误(例如一个HTTP请求超时),或者一个正确的返回代码(例如“HTTP1.0200OK”)。
SOAP接收端代码:
publicclassHTTPReceiveextendsHttpServlet
......
//SOAP请求以HTTPPOST形式接收
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
Receivedrequest."
-----------------------"
//TraversetheHTTPheadersandshowthemonthescreen
for(Enumerationenum=request.getHeaderNames();
enum.hasMoreElements();
){
Stringheader=(String)enum.nextElement();
Stringvalue=request.getHeader(header);
+header+"
="
+value);
}
if(request.getContentLength()>
0)
try
{
java.io.BufferedReaderreader=request.getReader();
//获取DocumentBuil
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 实现 SOAP XML 文档 网络 传输 远程 过程 调用 RPC