深入探索SOAP1.1--使用SAAJ1.2.1(转)

本文的预定作者应该对SOAP1.1的基本规范有所了解,并熟悉了j2ee的基本开发,如果不熟悉的话,可以看一下我的Blog:使用SOAP开发java web服务--Axis开发方案 ,详细标准可以查看w3c的官方网站,连接如下:http://www.w3.org/TR/2000/NOTE-SOAP-20000508/ 。本文主要是探讨SAAJ(SOAP with Attachment API for Java),JAXM(Java API for XML Messaging),了解SOAP在j2ee开发中的作用与其接口。JAXM和SAAJ均支持针对B2B和Web服务应用程序、基于XML的消息交换,支持诸多行业标准,包括SOAP和ebXML。 SAAJ是JWSDP的组成部分之一,JWSDP目前已经更新到了1.5版,SAAJ可以从SUN的网站单独下载:http://java.sun.com/xml/downloads/saaj.html,JAXM是用于XML消息交换的标准,不在JWSDP1.5的发行包内,可以另外下载:http://java.sun.com/xml/jaxm/downloads/index.html ,由于SAAJ是基于JavaMailTM API (1.2) 、 JavaBeansTM Activation Framework (JAF) (1.1.3)和JAXP(1.2.6) 的,所以也要把他们下载下来,SUN的官方网站都有提供的,好了,现在我们得到了以下包(按我下载的名称):activation.jar(JAF), jaxm-api.jar(JAXM),mail.jar(JavaMail),saaj-api.jar(SAAJ),saaj-impl.jar (SAAJ),我的JAXP已经包括在jdk1.5中了。另外还要有个支持Servlet的容器。 好了,准备工作完毕了,下面开始我们的学习: 一、 SAAJ可用于将XML文档作为SOAP消息发送和接收,而无需JAXM提供商的基础程序结构,也无需处理基于SOAP的HTTP请求/响应。SAAJ最初是JAXM1.0API软件包的组成部分,而从JAXM1.1开始,该软件包更名为SAAJ1.1API。 以下我们先了解一个简单的SOAP1.1消息: POST /StockQuote HTTP/1.1 Host: www.stockquoteserver.com Content-Type: text/xml; charset="utf-8" Content-Length: nnnn SOAPAction: "Some-URI" <------------这是信封标志 <------------这是消息头标志 5 <------------这是主体标志 DEF SAAJ API为我们提供了一个高层次SOAP消息封装接口,如:信封接口:javax.xml.soap.SOAPEnvelope,并提供了操作 getHeader(),该方法返回一个消息头:javax.xml.soap.SOAPHeader。所以,通过调用SAAJ的接口函数,我们就可以对 SOAP消息进行操作。 二、现在我们来讨论一下在不使用消息交换提供程序的JAXM时,应用程序客户端通过SOAP直接与其远程伙伴发送和接收消息操作(定义了点到点的交互作用和同步通信模型,其中发送方和接收方以请求和响应的形式交换消息。发送方发送消息并等待锁定目标位置的响应)。 发送方步骤: 1)创建SOAP连接; 2)创建消息工厂; 3)创建消息; 4)填充消息; 5)添加消息; 6)添加SOAP附件; 7)发送消息并接收响应; 8)关闭提供程序连接; 一下是我写的一个例子: /** *Sender.java *Copyright 2005-2-10 */ import javax.xml.soap.SOAPConnectionFactory; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPConnection; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPBodyElement; import javax.xml.soap.SOAPHeaderElement; import javax.xml.soap.Name; import javax.xml.soap.SOAPElement; import java.net.URL; import javax.xml.messaging.URLEndpoint; import javax.activation.DataHandler; import java.io.IOException; public class Sender{ public SOAPMessage getMessage() throws SOAPException,Exception{ //消息工厂 MessageFactory msgFactory=MessageFactory.newInstance(); SOAPMessage message=msgFactory.createMessage(); //获得一个SOAPPart对象 SOAPPart soapPart=message.getSOAPPart(); //获得信封 SOAPEnvelope soapEnvelope=soapPart.getEnvelope(); //获得消息头 SOAPHeader soapHeader=soapEnvelope.getHeader(); //获得SOAP主体 SOAPBody soapBody=soapEnvelope.getBody(); //添加头元素 SOAPHeaderElement headerElement=soapHeader.addHeaderElement( soapEnvelope.createName("StudentNo","stu","http://www.cun.edu.cn/jws")); headerElement.addTextNode("JWS0229043"); //添加消息主体 Name bodyName=soapEnvelope.createName("getStudentInfo","stu","http://www.cun.edu.cn/jws"); SOAPBodyElement bodyElement=soapBody.addBodyElement(bodyName); Name eleName=soapEnvelope.createName("StudentName"); SOAPElement se=bodyElement.addChildElement(eleName); se.addTextNode("Wang wenyin"); //添加SOAP附件 URL url=new URL("http://img20.photo.163.com/gdanthrowwy/5123911/80707051.jpg"); DataHandler dataHandler=new DataHandler(url);//use the JAF message.addAttachmentPart(message.createAttachmentPart(dataHandler)); //更新SOAP消息 message.saveChanges(); return message; } public void send(SOAPMessage message) throws SOAPException,IOException{ //创建SOAP连接 SOAPConnectionFactory scf=SOAPConnectionFactory.newInstance(); SOAPConnection sc=scf.createConnection(); //发送SOAP消息到目的地,并返回一个消息 URLEndpoint urlEndpoint=new URLEndpoint("http://localhost/saaj/StudentInfoServlet"); SOAPMessage response=sc.call(message,urlEndpoint); if(response!=null){ //输出SOAP消息到控制台 System.out.println("Receive SOAP message from localhost:"); response.writeTo(System.out); }else{ System.err.println("No response received from partner!"); } sc.close(); } public static void main(String[] args) throws SOAPException,Exception{ Sender sender=new Sender(); SOAPMessage message=sender.getMessage(); sender.send(message); } } 然后编译,注意classpath变量的设置要把以上的那些包加进去(可以设置一个脚本来完成,熟悉Ant的话,那就更加简单了)。 编译成功后,我们等到了一个Sender.class文件,这是发送方文件。当你运行java Sender的时候,就会把SOAP消息发向我们的同伴http://localhost/saaj/StudentInfoServlet ,并等待返回。以下我们继续编写一个Servlet好接收刚才发送的消息。 三、接收方Servlet应用程序saaj.war。 /** *JAXMReceiveServlet.java *Copyright 2005-2-10 */ import javax.xml.messaging.JAXMServlet; import javax.xml.messaging.ReqRespListener; import javax.xml.soap.MessageFactory; import javax.servlet.ServletException; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPEnvelope; import javax.servlet.ServletConfig; import java.io.FileOutputStream; import java.io.File; public class JAXMReceiveServlet extends JAXMServlet implements ReqRespListener{ static MessageFactory mf=null; //创建一个消息工厂 static{ try{ mf=MessageFactory.newInstance(); }catch(Exception e){ e.printStackTrace(); } }; public void init(ServletConfig sc) throws ServletException{ super.init(sc); } //处理传过来的SOAP消息,并返回一个SOAP消息 public SOAPMessage onMessage(SOAPMessage msg){ SOAPMessage resp=null; try{ System.out.println("传入的消息:"); msg.writeTo(new FileOutputStream(new File("../webapps/soapmessage.xml"))); //创建一个返回消息 resp=mf.createMessage(); SOAPEnvelope se=resp.getSOAPPart().getEnvelope(); se.getBody().addChildElement( se.createName("ResponseMessage")).addTextNode("Received Message,Thanks"); return resp; }catch(Exception e){ e.printStackTrace(); } return resp; } } 然后把相关的classpath添加进去,编译(不会的话,自己去查有关Servlet的编程,篇幅有限) web.xml部署文件: StudentInfoServlet JAXMReceiveServlet 1 StudentInfoServlet /StudentInfoServlet 至此 我们的基本工作完成了,部署好程序saaj,当你在浏览器访问 http://localhost/saaj/StudentInfoServlet ,将会返回一个错误信息,因为这里使用的是SOAP协议。 四、测试 如果部署成功的话,那开始我们的测试。 我们继续第二步的步骤,java Sender,接着我们就等待,我们在发送方创建了一个SOAP消息(有个jpg图片的附件),并发送到Servlet容器中(我的是tomcat),在服务器方接送到消息,并在webapps文件夹下创建soapmessage.xml文件,把接收到的SOAP信息写进去,并返回一个soap消息。 等过了一段时间后,sender方会返回一个soap格式的xml文件,在控制台上输出。 好了,今天的关于SOAP的深入探索就到这里了。 如果对这篇文章有问题的话可以连续我:gdanthrowwy@126.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值