`
walksing
  • 浏览: 216932 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多
深入探索SOAP1.1--使用SAAJ1.2.1

日期:2006-9-18 20:49:00     [Host01.Com]   访问:     [全屏查看全文]
       本文的预定作者应该对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"

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>              <------------这是信封标志
   <SOAP-ENV:Header>                                                                                           <------------这是消息头标志
       <t:Transaction
           xmlns:t="some-URI"
           SOAP-ENV:mustUnderstand="1">
               5
       </t:Transaction>
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>                                                                                              <------------这是主体标志
       <m:GetLastTradePrice xmlns:m="Some-URI">
           <symbol>DEF</symbol>
       </m:GetLastTradePrice>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
      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部署文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
<servlet>
  <servlet-name>StudentInfoServlet</servlet-name>
  <servlet-class>JAXMReceiveServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>StudentInfoServlet</servlet-name>
  <url-pattern>/StudentInfoServlet</url-pattern>
</servlet-mapping>
</web-app>

      至此 我们的基本工作完成了,部署好程序saaj,当你在浏览器访问  http://localhost/saaj/StudentInfoServlet ,将会返回一个错误信息,因为这里使用的是SOAP协议。
四、测试
     如果部署成功的话,那开始我们的测试。
     我们继续第二步的步骤,java Sender,接着我们就等待,我们在发送方创建了一个SOAP消息(有个jpg图片的附件),并发送到Servlet容器中(我的是tomcat),在服务器方接送到消息,并在webapps文件夹下创建soapmessage.xml文件,把接收到的SOAP信息写进去,并返回一个soap消息。
     等过了一段时间后,sender方会返回一个soap格式的xml文件,在控制台上输出。


好了,今天的关于SOAP的深入探索就到这里了。
如果对这篇文章有问题的话可以连续我:gdanthrowwy@126.com
分享到:
评论
1 楼 jinkunaier 2011-11-18  
,受教了!

相关推荐

    java jar包

    digester-1.8 commons-discovery-0.2 commons-discovery-0.4 commons-email-1.1-javadoc commons-email-1.1-sources commons-email-1.1 commons-fileupload-1.2.1-javadoc commons-fileupload-1.2.1-sources commons...

    geronimo-saaj-1.1-14.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    geronimo-saaj-javadoc-1.1-14.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    saaj-api.jar.zip_saaj-api_saaj-api-1.3.jar_saaj-api.jar

    标题"saaj-api.jar.zip_saaj-api_saaj-api-1.3.jar_saaj-api.jar" 提到了几个关键元素:'saaj-api.jar.zip' 是压缩文件的名称,暗示了里面包含的文件与SAJJ(SOAP消息抽象API)有关。'saaj-api' 是一个重复出现的...

    axis-saaj-1.2.1-sources.jar

    官方版本,亲测可用

    jar包(java开发所需)

    commons-cli-1.1.jar commons-codec-1.3.jar commons-codec-1.4.jar commons-collections-3.2.1.jar commons-collections-3.2.1-javadoc.jar commons-collections-3.2.1-sources.jar commons-collections-test...

    saaj-api-1.3.jar

    saaj-api-1.3.jar saaj-api-1.3.jar

    cxf-2.1.4.jar

    commons-logging-1.1.jar geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar) geronimo-annotation_1.0_spec-1.1.jar (JSR 250) geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar) ...

    apache-cxf-2.1.3

    commons-logging-1.1.jar geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar) geronimo-annotation_1.0_spec-1.1.jar (JSR 250) geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar...

    J2EE Web Services: XML SOAP WSDL UDDI WS-I JAX-RPC JAXR SAAJ JAXP

    本篇将深入探讨与J2EE Web服务相关的九大关键技术:XML、SOAP、WSDL、UDDI、WS-I、JAX-RPC、JAXR、SAAJ以及JAXP。 1. **XML(eXtensible Markup Language)**:XML是一种标记语言,用于结构化数据的交换。在Web服务...

    saaj.jar包

    - **创建SOAP请求**:开发者可以使用SAAJ API构建SOAP消息,包括设置方法名、参数和响应目标URL。 - **处理SOAP响应**:收到服务器返回的SOAP响应后,通过解析`SOAPMessage`获取结果数据。 - **发送带有附件的SOAP...

    axis.jar,axis-saaj-1.4.jar

    总的来说,"axis.jar"和"axis-saaj-1.4.jar"是Web服务开发的关键组件,它们简化了SOAP消息的处理,支持高效的附件传输,并且提供了强大的工具集来创建和使用Web服务。在Java开发环境中,这些库对于构建基于SOAP的Web...

    xmldsig.jar,saaj-api-1.3.jar,activation.jar相关jar包资源

    `saaj-api-1.3.jar`对应的是版本1.3,其中包含了对SOAP 1.1和1.2的支持。 最后,`activation.jar`是JavaBeans Activation Framework(JAF)的一部分,这是一个Java平台的标准组件,用于识别和操作未知的数据类型。...

    saaj-impl-1.3.jar

    saaj-impl-1.3.jar saaj-impl-1.3.jar

    xfire相关jar包

    aegis-1.2.6.jar、xbean-spring-2.8.jar、wsdl4j-1.5.2.jar、stax-api-1.0.1.jar、saaj-impl-1.3.jar、saaj-api-1.3.jar、jsr173_1.0_api.jar、jdom-1.0.jar、jaxws-api-2.0.jar、jaxen-1.1-beta-9.jar、commons-...

    使用SAAJ 和JAXM的 SOAP客户端及服务

    本文将深入探讨如何利用SAAJ和JAXM来构建SOAP客户端和服务,并在Sun Java System Application Server上部署它们。 **SAAJ (SOAP with Attachments API for Java)** SAAJ是Java平台的一部分,它为开发人员提供了一...

    javax-xml-soap-1.6.0.jar

    3. **SAAJ(SOAP with Attachments API for Java)**:javax.xml.soap包是SAAJ的一部分,SAAJ是Java平台上的SOAP处理标准,它支持在SOAP消息中附加非XML数据,如图像或文件。 4. **Java Web Services**:使用javax....

    axis2-saaj-1.1.jar

    官方版本,亲测可用

    Java SOAP协议

    4. **saaj-api.jar**:SAAJ API,用于处理SOAP消息。 5. **saaj-impl.jar**:SAAJ实现类库。 6. **JAXP**:Java API for XML Processing,通常已包含在JDK 1.5及以上版本中。 此外,还需要一个支持Servlet的容器来...

Global site tag (gtag.js) - Google Analytics