<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    精彩的人生

    好好工作,好好生活

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks
    CSDN - 專家門診 - Java J2SE / 基礎類問題

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

    簡單對象訪問協議(SOAP):
    用于Internet上的分布式計算,可以實現跨平臺跨編程語言的對象訪問和方法調用.
    它通過HTTP協議實現參數的傳輸,同時以特定的XML格式表示參數.這樣,只需要一個支持H
    TTP協議的WEB服務器和一個XML解析器就可以實現簡單的SOAP功能.由于成為了標準,所以
    會有越來越多的軟件支持它.大家若有興趣的話可以去看SOAP1.1標準.
    同時,還有許多SOAP的開發工具,以簡化SOAP的開發.隨著這些開發工具的完善,我們
    甚至可以不用管具體的SOAP格式就可以開發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());
    }
    }
    }
    發布用的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
    把服務器端程序發布到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代表從人民幣到美元和從美元到人民幣,下一個參數是要換算的錢數.
    另外,在http://www.xmethods.com/gettingstarted/apache.html
    有一個簡單的教程介紹怎樣用APACHE的SOAP包寫SOAP客戶端程序.講解比較詳細.
    注意點:
    *如果SOAP傳回來的參數是一個CLASS,這個CALSS會被序列化(Serializer)為一段XML
    代碼,在客戶端接這個CLASS時,仍然需要一個同名CLASS,而且那些被傳遞過來的數據的SE
    T和GET方法名和參數名要相同.如果是自定義的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就不行,所以最好用簡單的數據類
    型,如String,String,Integer,Double及其數組來傳遞變量,對復雜的參數,可以直接做成
    XML Document傳遞(使用Constants.NS_URI_LITERAL_XML作為EncodingStyleURI),這樣就
    省得客戶端專門做個CLASS來接參數,也方便跨語言的調用.在使用APACHE的SOAP包時,XML
    Document在客戶端會被轉換為XML DOM的Element class.
    現在唯一的方法是自己寫進行序列化的程序,不過以后也許會有標準的序列化方法.

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

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

    Feedback

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

    主站蜘蛛池模板: 亚洲AV一二三区成人影片| 国产亚洲综合色就色| 亚洲的天堂av无码| 久久青草精品38国产免费| 久久久无码精品亚洲日韩软件| 边摸边吃奶边做爽免费视频99| 国产网站在线免费观看| 国产精品亚洲专区无码不卡| 日韩免费高清视频网站| 国产精品亚洲一区二区无码| 国产hs免费高清在线观看| 男女污污污超污视频免费在线看| 亚洲真人日本在线| a毛片在线免费观看| 久久91亚洲精品中文字幕| 国产成人精品免费视频大| 亚洲字幕AV一区二区三区四区| 拔擦拔擦8x华人免费久久| 污污视频免费观看网站| 亚洲色欲久久久综合网| 3d动漫精品啪啪一区二区免费| 中文字幕 亚洲 有码 在线| 国产一级淫片a免费播放口之| 成人特级毛片69免费观看| 亚洲av无码无在线观看红杏| 91精品免费久久久久久久久| 天堂亚洲国产中文在线| 亚洲精品人成无码中文毛片| 中文字幕无码日韩专区免费| 亚洲国产中文在线视频| 日本v片免费一区二区三区| 91免费国产视频| 亚洲av无码不卡久久| 伊在人亚洲香蕉精品区麻豆| 久草免费福利资源站| 亚洲乱码一二三四区麻豆| 亚洲国产高清精品线久久| 少妇太爽了在线观看免费视频| 亚洲国产区男人本色在线观看| 亚洲色欲久久久久综合网| 亚洲免费网站在线观看|