网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  用saaj1.2发送接收二进制web服务内容(二)     
  文章作者:未知  文章来源:水木森林  
  查看:83次  录入:管理员--2007-11-17  
 
  带有附件的soap分析
  带有附件的soap信息并没有给soap增加新的特征。 确切的说,它定义了如何利用在soap信息中mime类型来定义附件, 并且还定义了如何引用在soap体(soap body)中的那些附件。
  mime类型的复合块/关联(multipart/related)特性能定义由多部分组成的一个文档。带有附件的soap信息一定要符合这样的复合块/关联(multipart/related)的mime类型。下面的例子展示了一个复合块/关联的 soap 信息,它被绑定到到 http 协议,带有两个附件:
  
  post /propertylisting http/1.1
  host: www.realproperties.com
  content-type: multipart/related; boundary=mime_boundary; type=text/xml; start=""
  content-length: nnnn
  
  --mime_boundary
  content-type: text/xml; charset=utf-8
  content-transfer-encoding: 8bit
  content-id:
  
  
  
  
  
         xmlns:realproperty="http://schemas.realhouses.com/listingsubmission";>
  
      really nice homes, inc.
     add
     
      1234 main st
      pleasantville
      ca    
      94323
     

     
       250000
     

  
     
     
  
    

  
  
  
  
  --mime_boundary
  content-type: image/jpeg
  content-id:
  
  ....jpeg data .....
  --mime_boundary
  content-type: image/jpeg
  content-id:
  
  ....jpeg data .....
  --mime_boundary--
  
  上述的复合块信息包含一系列的mime头和相关的数据。文件的底层是soap体(soap body)。 因为soap体只包含xml数据,整个信息的mime类型是本文/xml(text/xml)类型 。 在soap封套(soap envelope)后面是二个附件,每个附件都包含一个连同信息一起发送的图像文件。
  用内容id(content id)来识别每一个附件。w3c 备忘录允许用内容id或内容位置来引用附件,但是它优先选择前者。这样的一个内容id作为统一资源标志符uri(uniform resource identifier)引用给附件;soap 1.1的编码规则定义了如何通过uri来引用soap信息里面的任何资源,不仅仅是引用xml( 参考soap1.1第5节资源)。当soap处理机处理信息时,它会解析这些uri引用。在上述的例子中,soap处理器把元素frontimage关联到内容id为property1234_front.jpeg@realhouses.com的数据段中。
  
  创建并发送带有附件的soap信息
  saaj能让你创建并编辑soap信息的任何部份, 包括附件。 大多数的saaj以抽象类和接口为基础,所以每个供应商都能实现它自己的saaj产品。sun microsystems公司的参考实现附在jwsdp包(java web services developer pack)中。
  因为soap信息只是xml文档的一种特殊形式,jaas在dom(document.nbspobject model)api的基础上处理xml。大多数的soap信息组件派生自 avax.xml.soap.node接口, 而这个接口又是org.w3c.dom.node的子类。saaj继承了node来添加soap样式的结构。 举例来说,这个特别的node, soapelement,代表了一个soap信息元素。
  saaj依赖于接口和抽象类的直接结果是:你要通过工厂方法(factory methods)来完成大多数与soap相关的工作。 要把你的程序链接到saaj api,你首先要创建一个来自工厂方法soapconnectionfactory的链接soapconnection。要创建和编辑soap信息,你可以初始化messagefactory和soapfactory。messagefactory能让你产生soap信息,而 soapfactory则提供方法产生soap信息的各个部份:
  
  soapconnectionfactory spconfactory = soapconnectionfactory.newinstance();
  soapconnection con = spconfactory.createconnection();
  soapfactory soapfactory = soapfactory.newinstance();
  
  把这些工具用在适当的位置,你就可以创建一个 soap 信息,在前面的例子中,来自房产代理的客户可以使用这些信息发送项目表更新给一个网站入口。
  saaj 提供了几个方法来产生一个新的 soap 信息。 下面例子演示了用最简单的方法来创建一个有封套(envelope)的空白soap信息,这个封套还带有头(heade)和体(body)。如果你在这个信息中不需要soap头(soap header),那么你可以将这个元素从信息中删除:
  
  soapmessage message = factory.createmessage();
  soapheader header = message.getsoapheader();
  header.detachnode();
  
  把 xml 结构加入信息也是直接了当的:
  
  soapbody body = message.getsoapbody();
  
  name listingelementname = soapfactory.createname(
    "propertylisting", "realproperty",
    "http://schemas.realhouses.com/listingsubmission";);
  soapbodyelement listingelement = body.addbodyelement(listingelementname);
  
  name attname = soapfactory.createname("id");
  listingelement.addattribute(attname, "property_1234");
  
  soapelement listingagency = listingelement.addchildelement("listingagency");
  listingagency.addtextnode("really nice homes, inc");
  
  soapelement listingtype = listingelement.addchildelement("listingtype");
  listingtype.addtextnode("add");
  
  soapelement propertyaddress = listingelement.addchildelement("propertyaddress");
  soapelement street = propertyaddress.addchildelement("street");
  street.addtextnode("1234 main st");
  soapelement city = propertyaddress.addchildelement("city");
  city.addtextnode("pleasantville");
  soapelement state = propertyaddress.addchildelement("state");
  state.addtextnode("ca");
  soapelement zip = propertyaddress.addchildelement("zip");
  zip.addtextnode("94521");
  
  soapelement listprice = listingelement.addchildelement("listprice");
  listprice.addtextnode("25000");
  
  注意,你要把属性的id作为一个参数加入到属性列表元素(propertylisting)中。 更进一步的是,你要用qname, 或namespace来限定propertylisting元素。
  
  你可以用几种方法把附件加入到soap信息中。 在这一个例子中,你首先要创建元素来指示列表属性的背景图片和前景图片。它们每个都有一个href属性指明附件的内容id:
  
  string frontimageid = "property1234_front_jpeg@realhouses.com";
  soapelement frontimref = listingelement.addchildelement("frontimage");
  name hrefattname = soapfactory.createname("href");
  frontimref.addattribute(hrefattname, frontimageid);
  
  string interiorid = "property1234_interior_jpeg@realhouses.com";
  soapelement interiorimref = listingelement.addchildelement("interiorimage");
  interiorimref.addattribute(hrefattname, interiorid);
  
  要方便地把需要的图像文件附加在信息中,可以使用javabeans activation framework架构里面的javax.activation.datahandler对象。datahandler能自动地检测传递给它的数据类型,而且它还能自动地分配适当的mime类型给附件:
  
  url url = new url("file&:///export/files/pic1.jpg");
  datahandler datahandler = new datahandler(url);
  attachmentpart att = message.createattachmentpart(datahandler);
  att.setcontentid(frontimageid);
  message.addattachmentpart(att);
  
  另一种方法,你可以把一个对象,连同正确的mime类型一起,传递到createattachmentpart()方法里。这个方法跟第一个方法类似。在内部,saaj将会寻找处理器datacontenthandler 来处理这个mime类型。 如果它不能找一个合适的处理器,createattachmentpart() 方法将会抛出一个illegalargumentexception异常:
  
  url url2 = new url("file&:///export/files/pic2.jpg");
  image im = toolkit.getdefaulttoolkit().createimage(url2);
  attachmentpart att2 = message.createattachmentpart(im, "image/jpeg");
  att2.setcontentid(interiorid);
  message.addattachmentpart(att2);
  
  这个方法的缺点集中在:它依赖于awt中示例ui(用户界面user interface)相关的类。 在一些粗心的(服务器)设置中,这些库并没有被正确的设置。
  不管你选择什么方法来产生附件,上述的代码表示了在第一个列表里面的soap信息。 既然这只是一个简
 
 
上一篇: 用saaj1.2发送接收二进制web服务内容(一)    下一篇: weblogic 6.0中servlet的注册方法
  相关文档
设计 filesystemobject 11-16
java搜索引擎框架compass 2.1最新发布 11-07
轻松应对jsp连接mysql数据库的实例讲解 11-16
javasocket编程(二)java面向连接的类 11-17
java趋势:脚本语言引领风骚 11-16
programming a spider in java 11-17
java程序员需要了解的几个开源协议介绍 11-16
java se 6中的awt模态增强功能 11-17
常见的十四种java开发工具及其特点一 11-17
一个用配制文件连接数据库的Java工具类 08-07
发现 eclipse 中未解析的插件依赖性 11-17
java实现汉字转换为拼音 11-16
使用web.xml控制web应用的行为一 11-17
java新手上路大全 11-17
spring与ibatis的集成 11-17
jsf(javaserverfaces)介绍 11-17
sun称java企业系统支持windows和ux 11-17
sun宣布发布更多免费软件 11-17
深入理解collections api 11-16
java: jni完全手册 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息