精彩的人生

          好好工作,好好生活

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(43)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          Friends

          Web Site

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          CSDN - 專家門診 - Java J2SE / 基礎類問題

          回復人: panq(漫隨天外) ( ) 信譽:100 2001-10-25 13:40:12Z 得分:300

          簡單對象訪問協(xié)議(SOAP):
          用于Internet上的分布式計算,可以實現(xiàn)跨平臺跨編程語言的對象訪問和方法調用.
          它通過HTTP協(xié)議實現(xiàn)參數(shù)的傳輸,同時以特定的XML格式表示參數(shù).這樣,只需要一個支持H
          TTP協(xié)議的WEB服務器和一個XML解析器就可以實現(xiàn)簡單的SOAP功能.由于成為了標準,所以
          會有越來越多的軟件支持它.大家若有興趣的話可以去看SOAP1.1標準.
          同時,還有許多SOAP的開發(fā)工具,以簡化SOAP的開發(fā).隨著這些開發(fā)工具的完善,我們
          甚至可以不用管具體的SOAP格式就可以開發(fā)SOAP應用.
          下面以APACHE的SOAP包為例,舉個例子:
          服務器端的Class:
          package samples.soap;
          public class SOAPCal {
          double rate;
          public SOAPCal() {
          rate = 8.7;
          }
          public void setRate(double rate) {
          this.rate = rate;
          }
          public Double calculate(int direction, double value) {
          Double retVal;
          switch(direction) {
          case 0:
          retVal = new Double(value * rate);
          break;
          case 1:
          retVal = new Double(value / rate);
          break;
          default:
          retVal = null;
          }
          return retVal;
          }
          }
          客戶端Class:
          package samples.soap;
          import java.io.*;
          import java.util.*;
          import java.net.*;
          import org.w3c.dom.*;
          import org.apache.soap.util.xml.*;
          import org.apache.soap.*;
          import org.apache.soap.encoding.*;
          import org.apache.soap.encoding.soapenc.*;
          import org.apache.soap.rpc.*;
          public class SOAPCalUser {
          public static void main(String[] args) throws Exception {
          if (args.length != 3
          && (args.length != 4 || !args[0].startsWith("-"))) {
          System.err.println("Usage:");
          System.err.println(" java " + SOAPCalUser.class.getName() +
          " [-encodingStyleURI] SOAP-router-URL name " +
          "(0: dollor to yuan | 1: yuan to dollor) value");
          System.exit (1);
          }
          int offset = 4 - args.length;
          String encodingStyleURI = args.length == 11
          ? args[0].substring(1)
          : Constants.NS_URI_SOAP_ENC;
          URL url = new URL(args[1 - offset]);
          int direction = Integer.parseInt(args[2 - offset]);
          double value = Double.parseDouble(args[3 - offset]);
          Call call = new Call();
          call.setTargetObjectURI("urn:SOAPCal");
          call.setMethodName("calculate");
          call.setEncodingStyleURI(encodingStyleURI);

          Vector params = new Vector();
          params.add(new Parameter("direction", int.class, new
          Integer(direction), null));
          params.add(new Parameter("value", double.class, new Double(value),
          null));
          call.setParams(params);
          Response resp;
          try {
          resp = call.invoke(url, "");
          } catch (SOAPException e) {
          System.err.println("Caught SOAPException (" +
          e.getFaultCode() + "): " +
          e.getMessage());
          return;
          }
          // Check the response.
          if (!resp.generatedFault()) {
          Parameter ret = resp.getReturnValue();
          Object retVal = ret.getValue();
          System.out.println(retVal != null ? "\n" + retVal : "I don't
          know.");
          } else {
          Fault fault = resp.getFault();
          System.err.println("Generated fault: ");
          System.out.println (" Fault Code = " +
          fault.getFaultCode());
          System.out.println (" Fault String = " +
          fault.getFaultString());
          }
          }
          }

          package samples.soap;
          import java.io.*;
          import java.util.*;
          import java.net.*;
          import org.w3c.dom.*;
          import org.apache.soap.util.xml.*;
          import org.apache.soap.*;
          import org.apache.soap.encoding.*;
          import org.apache.soap.encoding.soapenc.*;
          import org.apache.soap.rpc.*;

          public class SOAPCalAdmin {
          public static void main(String[] args) throws Exception {
          if (args.length != 2
          && (args.length != 3 || !args[0].startsWith("-"))) {
          System.err.println("Usage:");
          System.err.println(" java " + SOAPCalAdmin.class.getName()
          + " [-encodingStyleURI] SOAP-router-URL name " +
          "rate ");
          System.exit (1);
          }
          int offset = 3 - args.length;
          String encodingStyleURI = args.length == 11
          ? args[0].substring(1)
          : Constants.NS_URI_SOAP_ENC;
          URL url = new URL(args[1 - offset]);
          double rate = Double.parseDouble(args[2 - offset]);
          Call call = new Call();
          call.setTargetObjectURI("urn:SOAPCal");
          call.setMethodName("setRate");
          call.setEncodingStyleURI(encodingStyleURI);
          Vector params = new Vector();
          params.add(new Parameter("rate", double.class, new Double(rate),
          null));
          call.setParams(params);
          Response resp;
          try {
          resp = call.invoke(url, "");
          } catch (SOAPException e) {
          System.err.println("Caught SOAPException (" +
          e.getFaultCode() + "): " +
          e.getMessage());
          return;
          }
          // Check the response.
          if (!resp.generatedFault()) {
          System.out.println("The rate has been changed.");
          } else {
          Fault fault = resp.getFault();
          System.err.println("Generated fault: ");
          System.out.println (" Fault Code = " +
          fault.getFaultCode());
          System.out.println (" Fault String = " +
          fault.getFaultString());
          }
          }
          }
          發(fā)布用的XML文件dd.xml:
          <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
          id="urn:SOAPCal">
          <isd:provider type="java"
          scope="Application"
          methods="setRate calculate">
          <isd:java class="samples.soap.SOAPCal"/>
          </isd:provider>
          </isd:service>
          這個程序的功能是設置和計算美元/人民幣的兌換價格,用
          java org.apache.soap.server.ServiceManagerClient
          http://sb3server:8080/soap/servlet/rpcrouter deploy dd.xml
          把服務器端程序發(fā)布到TOMCAT上,然后在客戶端用:
          java samples.soap.SOAPCalAdmin http://sb3server:8080/soap/servlet/rpcrouter
          XX.XX
          來設置匯率(1美元兌換多少人民幣), 用
          java samples.soap.SOAPCalUser http://sb3server:8080/soap/servlet/rpcrouter
          (1|0) XX.XX
          來換算,其中1和0代表從人民幣到美元和從美元到人民幣,下一個參數(shù)是要換算的錢數(shù).
          另外,在http://www.xmethods.com/gettingstarted/apache.html
          有一個簡單的教程介紹怎樣用APACHE的SOAP包寫SOAP客戶端程序.講解比較詳細.
          注意點:
          *如果SOAP傳回來的參數(shù)是一個CLASS,這個CALSS會被序列化(Serializer)為一段XML
          代碼,在客戶端接這個CLASS時,仍然需要一個同名CLASS,而且那些被傳遞過來的數(shù)據(jù)的SE
          T和GET方法名和參數(shù)名要相同.如果是自定義的CLASS,就要做maping聲明.聲明方法見APA
          CHE SOAP包的samples\addressbook\DeploymentDescriptor.xml文件中isd:mappings的
          寫法.
          在客戶端調用時要加上
          SOAPMappingRegistry smr = new SOAPMappingRegistry();
          BeanSerializer beanSer = new BeanSerializer();
          smr.mapTypes(/*encodingStyle*/Constants.NS_URI_SOAP_ENC,
          new QName(/*Namespace URI*/"urn:xml-soap-address-demo", /*Local
          Part*/"address"),
          /*Class type*/Address.class, /*java2XMLClassName*/beanSer,
          /*xml2JavaClassName*/beanSer);
          call.setSOAPMappingRegistry(smr);
          *目前不是所有的CLASS都能被序列化,如Hashtable就不行,所以最好用簡單的數(shù)據(jù)類
          型,如String,String,Integer,Double及其數(shù)組來傳遞變量,對復雜的參數(shù),可以直接做成
          XML Document傳遞(使用Constants.NS_URI_LITERAL_XML作為EncodingStyleURI),這樣就
          省得客戶端專門做個CLASS來接參數(shù),也方便跨語言的調用.在使用APACHE的SOAP包時,XML
          Document在客戶端會被轉換為XML DOM的Element class.
          現(xiàn)在唯一的方法是自己寫進行序列化的程序,不過以后也許會有標準的序列化方法.

          *CLASS被序列化時CLASS中的靜態(tài)的變量是不會被加入的來的,這一點要注意.

          posted on 2006-03-09 11:23 hopeshared 閱讀(3923) 評論(1)  編輯  收藏 所屬分類: Java

          Feedback

          # re: 轉:一個soap的例子 2009-06-22 14:52 1123
          也不排個版..  回復  更多評論
            

          主站蜘蛛池模板: 绵竹市| 大丰市| 白银市| 贵溪市| 樟树市| 平遥县| 若尔盖县| 长泰县| 涞水县| 合水县| 望都县| 西城区| 措勤县| 威宁| 湄潭县| 建始县| 兴国县| 即墨市| 和顺县| 巴塘县| 旅游| 沂源县| 贺兰县| 毕节市| 盘山县| 盐山县| 长葛市| 石景山区| 淄博市| 康马县| 满洲里市| 车致| 海门市| 师宗县| 凤冈县| 忻城县| 东兴市| 如东县| 二手房| 黄骅市| 乌兰察布市|