無為

          無為則可為,無為則至深!

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
          帶附件的soap消息api,其內(nèi)容很豐富,它是一個允許用soap消息而不是用jax-rpc來調(diào)用web service的API .它通過直接創(chuàng)建XML消息來完成web serivce的調(diào)用.SOAP API 簡化了創(chuàng)建XML的工作.?取自j2ee文檔的soap消息的結(jié)構(gòu)圖.
          saaj-noAttach.gif?
          完整的SAAJ客戶端程序. 服務器端的程序在j2ee web service開發(fā)(一) 里可以找到.沒有詳細介紹saaj的一些類
          的使用.好在它們都有很好的自解釋性.
          package array;

          import javax.xml.soap.*;
          import java.net.*;
          import java.io.*;
          import java.util.*;
          import java.text.SimpleDateFormat;
          public class SaajClient {
          ??? public SaajClient() {
          ??? }

          ??? public static void main(String[] args) throws Exception {
          ??????? SaajClient client = new SaajClient();
          ??????? User[] user = new User[2];
          ??????? user[0] = new User("張三", "027-88888888", new Date());
          ??????? user[1] = new User("lisi", null, new Date());
          ??????? saajTest(user);

          ??? }

          ??? private static void saajTest(User[] user) throws MalformedURLException,
          ??????????? IOException,
          ??????????? UnsupportedOperationException, SOAPException {
          ??????? MessageFactory factory = MessageFactory.newInstance();//SAAJ的根工廠類
          ??????? SOAPMessage message = factory.createMessage();
          ??????? //SOAPMessage 對象需要一些元素,包括SOAPPart,SOAPEnvelope,SOAPHeader,SOAPBody對象
          ??????? //SAAJ通過返回一個新的已經(jīng)包括這些元素的SOAPMessage對象來簡化操作

          ??????? SOAPFactory s = SOAPFactory.newInstance();//通用工廠類,創(chuàng)建Name,SOAPElement對象

          ??????? Name countUser = s.createName("countUser", "mh", "http://array");
          ??????? //Name對象表示一個XML限定名稱
          ??????? Name arrayOfUser_1 = s.createName("arrayOfUser_1");
          ??????? Name xsi = s.createName("xmlns:xsi");
          ??????? Name nullAttribute = s.createName("xsi:nil");

          ??????? //下面的代碼創(chuàng)建soap對象
          ??????? SOAPBody body = message.getSOAPBody();
          ??????? SOAPBodyElement bodyChildElement = body.addBodyElement(countUser);
          ??????? SOAPElement arrayOfUser = bodyChildElement.addChildElement(
          ??????????????? arrayOfUser_1);
          ????? //? arrayOfUser.addAttribute(xsi, "http://www.w3.org/2001/XMLSchema-instance");
          ??????? arrayOfUser.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");
          ??????? //定義arrayOfUser的 xmlns:xsi屬性? 該名稱空間是XML模式實例命名空間,由XML模式規(guī)范定義,它定義了
          ??????? //可以在XML文檔中使用的屬于該命名空間的一些特性.

          ??????? for (int i = 0; i < user.length; i++) {
          ??????????? //需要注意順序,也就是和復雜類型的sequence元素的順序?qū)?/font>
          ??????????? Name valueName = s.createName("value");
          ??????????? SOAPElement value = arrayOfUser.addChildElement(valueName);
          ??????????? Name birthday = s.createName("birthDay");
          ??????????? SOAPElement birthdayElement = value.addChildElement(birthday);

          ??????????? if (user[i].getBirthDay() == null) {
          ??????????????? birthdayElement.addAttribute(nullAttribute, "1");
          ??????????? } else {
          ??????????????? //日期類型必須進行格式化
          ??????????????? SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
          ??????????????? birthdayElement.addTextNode(format.format(user[i].getBirthDay()));
          ??????????? }
          ??????????? Name name = s.createName("name");
          ??????????? SOAPElement nameElement = value.addChildElement(name);
          ??????????? if (user[i].getName() == null) {
          ??????????????? //傳送空值
          ??????????????? nameElement.addAttribute(nullAttribute, "1");
          ??????????? } else {
          ??????????????? nameElement.addTextNode(user[i].getName());
          ??????????? }
          ??????????? Name phone = s.createName("phone");
          ??????????? SOAPElement phoneElement = value.addChildElement(phone);
          ??????????? if (user[i].getPhone() == null) {
          ??????????????? phoneElement.addAttribute(nullAttribute, "1");
          ??????????? } else {
          ??????????????? phoneElement.addTextNode(user[i].getPhone());
          ??????????? }

          ??????? }

          ??????? //發(fā)送soap消息
          ??????? SOAPConnectionFactory f = SOAPConnectionFactory.newInstance();
          ??????? SOAPConnection conn = f.createConnection();
          ??????? URL url = new URL("http://localhost:8082/complexType-array/services/CountUser");
          ??????? SOAPMessage response = conn.call(message, url);

          ??????? SOAPBody soapBody = response.getSOAPBody();
          ??????? Iterator it = soapBody.getChildElements();
          ??????? while (it.hasNext()) {
          ??????????? SOAPBodyElement bodyElement = (SOAPBodyElement) it.next();
          ??????????? String returnValue = bodyElement.getValue();
          ??????????? System.out.println(bodyElement.getElementName().getLocalName() +
          ?????????????????????????????? "????? " + returnValue);
          ??????? }


          ??????? response.writeTo(System.out);
          ??? }
          }

          程序向服務器端傳送的數(shù)據(jù):

          POST /complexType-array/services/CountUser HTTP/1.1
          SOAPAction: ""
          Content-Type: text/xml; charset=UTF-8
          User-Agent: Java/1.5.0_03
          Host: localhost:8082
          Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
          Connection: keep-alive
          Content-Length: 448

          <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
          ?? <env:Header/>
          ?? <env:Body>
          ????? <mh:countUser xmlns:mh='http://array'>
          ???????? <arrayOfUser_1 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
          ??????????? <value>
          ?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
          ?????????????? <name>張三</name>
          ?????????????? <phone>027-88888888</phone>
          ??????????? </value>
          ??????????? <value>
          ?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
          ?????????????? <name>lisi</name>
          ?????????????? <phone xsi:nil='1'/>
          ??????????? </value>
          ???????? </arrayOfUser_1>
          ????? </mh:countUser>
          ?? </env:Body></env:Envelope>
          從傳送的數(shù)據(jù)來看,就是一個符合soap規(guī)范的xml文檔.既然是xml文檔,也就是說可以用jdom api 來操作它
          事實上就是這樣,soap api 可以跟 jdom api混合使用.
          如果你想賜教或者討論,歡迎加入QQ群:30406099



          凡是有該標志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
          、轉(zhuǎn)載請注明來處和原文作者。非常感謝。

          posted on 2006-11-09 12:25 草兒 閱讀(765) 評論(0)  編輯  收藏 所屬分類: 軟件構(gòu)架 、java
          主站蜘蛛池模板: 阳高县| 会同县| 吕梁市| 松溪县| 左云县| 敦煌市| 大安市| 济宁市| 门头沟区| 吉安县| 夏邑县| 得荣县| 平山县| 印江| 苗栗县| 泰兴市| 阿城市| 宜兴市| 海兴县| 疏勒县| 芷江| 乐亭县| 湟源县| 新乡县| 如东县| 霍城县| 富顺县| 巴林右旗| 扎兰屯市| 云龙县| 稷山县| 洞口县| 永仁县| 三河市| 敦化市| 濮阳县| 东兴市| 绥德县| 乃东县| 石嘴山市| 延庆县|