用Java实现SOAP的XML文档网络传输及远程过程调用RPC.docx
- 文档编号:24409535
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:26
- 大小:26.66KB
用Java实现SOAP的XML文档网络传输及远程过程调用RPC.docx
《用Java实现SOAP的XML文档网络传输及远程过程调用RPC.docx》由会员分享,可在线阅读,更多相关《用Java实现SOAP的XML文档网络传输及远程过程调用RPC.docx(26页珍藏版)》请在冰豆网上搜索。
用Java实现SOAP的XML文档网络传输及远程过程调用RPC
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)
SOAP(SimpleObjectAccessProtocol,简单对象访问协议)是一种基于XML的,用于计算机之间交换信息的协议。
SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。
SOAP是Webservice的一个重要组成部份,如果把Webservice比喻成Internet,那么SOAP就可以比喻成TCP/IP。
SOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是ApacheSOAP,不过它的下一个版本已经改名成AXIS了。
SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。
一般企业的防火墙都开放HTTP的80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。
信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。
1.环境配置
为了运行程序,我们首先必须配置好环境:
共要下载四个软件包,它们都是开源免费的。
其中,前两个是Apache的,后两个是SUN网站的,如下所示:
⏹ SOAP:
⏹ Xerces:
http:
//xml.apache.org/dist/xerces-j/
⏹ JavaMail:
⏹ JAF:
下载后将它们分别解压缩。
分别在这四个包的解压目录中找到:
xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。
本机安装环境:
WindowsXP(SP2)+JDK1.4.2_06+Tomcat5.0.28+SOAP2.3.1
配置步骤:
1、安装JDK和Tomcat。
过程比较简单,这里不再详述。
2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat5.0\common\lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。
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会自动将其解压,并配置好路径。
可以尝试在浏览器中输入“http:
//localhost:
8080/soap/”,看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"?
>
oreilly-jaws-samples"> 其对应的SOAP消息为: POST/ServletTemp/HTTPReceiveHTTP/1.0 Host: localhost Content-Type: text/xml;charset=utf-8 Content-Length: 939 SOAPAction: "urn: oreilly-jaws-samples" xmlversion=1.0encoding=UTF-8? > Envelope xmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance"xmlns: xsd="http: //www.w3.org/2001/XMLSchema"> Header> MessageHeaderxmlns: jaws="urn: oreilly-jaws-samples"SOAP-ENV: mustUnderstand="1"xmlns: SOAP-ENV="urn: oreilly-jaws-samples"> MessageHeader> Header> Body> oreilly-jaws-samples"> Body> Envelope> 一个SOAP消息包括: SOAP封套,SOAP头(可选),SOAP主体。 我们首先将XML文档包装到一个SOAP体中,然后再把SOAP体包装到一个SOAP封套中,可以在封套中再添加一个SOAP头(不是必须),最后将SOAP封套绑定到一个协议中。 我们来仔细分析一下代码。 ⏹ SOAP封套 SOAP封套的声明在XML标签的最外层,它表明了一个SOAP文档的边界。 下面的封套标签显示了三个必要的属性,这些属性指明了封套中使用的名字空间和语法。 Envelope xmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance"xmlns: xsd="http: //www.w3.org/2001/XMLSchema"> …… Envelope> 其中第一个属性: xmlns: SOAP-ENV="http: //schemas.xmlsoap.org/soap/envelope/"是一个名字空间声明,防止多个XML文件组合时发生标签名字的冲突。 第二个属性声明了XML模式实例的名字空间。 前缀xsi必须放在这个名字空间定义的所有元素和属性之前。 最后一个属性是另外一个名字空间声明,它定义了XMLSchema名字空间,这个名字空间下的元素用来指定xsi: type属性的值(如xsd: string)。 ⏹ SOAP头 SOAP头和体在语法上非常类似。 SOAP1.1和SOAP1.2都没有头里应该有些什么,它就是简单的存放一些指令,提供给接收消息的SOAP处理器。 建立在SOAP之上的更高级协议(比如ebXML消息服务)就通过定义一些特殊元素来规范SOAP头的格式。 另外当对RPC使用SOAP时,头部也可以用来表示一些底层信息。 Header> MessageHeaderxmlns: jaws="urn: oreilly-jaws-samples"SOAP-ENV: mustUnderstand="1"xmlns: SOAP-ENV="urn: oreilly-jaws-samples"> MessageHeader> Header> ⏹ SOAP主体 SOAP主体用来存放实际数据或消息的有效负载(本例中为XML文档),从而提供给最终的接受者使用或处理。 ⏹ SOAP协议绑定 当绑定到一个HTTP协议时,需要在SOAP封套前面添加HTTP头的信息。 POST/ServletTemp/HTTPReceiveHTTP/1.0 Host: localhost Content-Type: text/xml;charset=utf-8 Content-Length: 939 SOAPAction: "urn: oreilly-jaws-samples" 在SOAP1.1中SOAPAction是HTTP绑定所必须的部分,它的目的是让那些路由或分派的信息知道该做些什么,即使它们根本不知道SOAP或者没有解析SOAP封套的方法。 而在SOAP1.2中SOAPAction已变成可选的了。 ⏹ SOAP消息的发送与接收 我们已经看到了一个SOAP消息的各个组成块,接下来我们要了解消息是怎样被创建的,以及怎样在两个端点之间进行传输的。 SOAP的发送端的代码: packagejavaSoap01; importjava.io.*; importjava.util.*; publicclassGenericHTTPSoapClient { PrivatestaticfinalStringDEFAULT_HOST_URL="http: //localhost: 8080/ServletTemp/HTTPReceive"; privatestaticfinalStringDEFAULT_DATA_FILENAME="./PO.xml"; privatestaticfinalStringURI="urn: oreilly-jaws-samples"; privateStringm_hostURL; privateStringm_dataFileName; publicGenericHTTPSoapClient(StringhostURL,StringdataFileName)throwsException { m_hostURL=hostURL; m_dataFileName=dataFileName; System.out.println(); System.out.println("_________________________________________________________"); System.out.println("StartingGenericHTTPSoapClient: "); System.out.println("hosturl="+m_hostURL); System.out.println("datafile="+m_dataFileName); System.out.println("___________________________________________________________"); System.out.println(); } //实际的传送工作是由sendSOAPMessage()方法完成的 publicvoidsendSOAPMessage() { try {//首先读取XML文档,将其解析成DOM树。 FileReaderfr=newFileReader(m_dataFileName); //通过调用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,"jaws: MessageHeader"); headerElement.setAttributeNS(URI,"SOAP-ENV: mustUnderstand","1"); //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); tempNode=headerElement.appendChild(ele); ele=doc.createElement("MessageId"); textNode=doc.createTextNode("9999"); tempNode=ele.appendChild(textNode); tempNode=headerElement.appendChild(ele); 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."); //从传输中接受响应并将其打印到屏幕上 System.out.println("Waitingforresponse...."); org.apache.soap.transport.SOAPTransportst=msg.getSOAPTransport(); BufferedReaderbr=st.receive(); Stringline=br.readLine(); if(line==null) { System.out.println("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,Servlet
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 实现 SOAP XML 文档 网络 传输 远程 过程 调用 RPC
![提示](https://static.bdocx.com/images/bang_tan.gif)