资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 编程开发 >
Advertisement
文章正文

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

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   
  • Java与XML(二)用java编写xml的读写程序  
  • jboss4.0下使用MySql数据源的设置方法  
  • 雇用dbunit来维持你的数据环境稳定  
  • 如何在web上实现等待提示。  
  • 穷人的通用OLAP方案I  
  • 让PHP支持大型项目-构建JSP、PHP与JAVA融为一体的开发环境  
  • Tiger系列四:Annotation第二部分:定制Annotation  
  • 集成测试Strtus+Spring+Hibernate  
  • Java中通过代理服务器(proxy)访问网络  
  • 在RIA大潮里湿了一下身--Flex  
  • 页面导航:

    正文内容:

     本文的预定作者应该对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
     



     

     
    热门推荐笔记本: 腾龙笔记本
    相关文章:
    webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
    ©2007 popbb.net All Rights Reserved