当前位置:  技术问答>java相关

谁知道如何用java做soap?

    来源: 互联网  发布时间:2015-03-31

    本文导语:  偶现在做一个项目,用java写,要用到soap,请问应该怎样做,需要哪些库?哪里可以下载这方面的资料?谢谢! | 简单对象访问协议(SOAP):     用于Internet上的分布式计算,可以实现跨平台跨编...

偶现在做一个项目,用java写,要用到soap,请问应该怎样做,需要哪些库?哪里可以下载这方面的资料?谢谢!

|
简单对象访问协议(SOAP):
    用于Internet上的分布式计算,可以实现跨平台跨编程语言的对象访问和方法调用.它通过HTTP协议实现参数的传输,同时以特定的XML格式表示参数.这样,只需要一个支持HTTP协议的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(/tech-qa-java/args[1 - offset]/index.html);
        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(/tech-qa-java/args[1 - offset]/index.html);
        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:

  
    
  

这个程序的功能是设置和计算美元/人民币的兑换价格,用
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,而且那些被传递过来的数据的SET和GET方法名和参数名要相同.如果是自定义的CLASS,就要做maping声明.声明方法见APACHE SOAP包的samplesaddressbookDeploymentDescriptor.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中的静态的变量是不会被加入的来的,这一点要注意.

    
 
 

您可能感兴趣的文章:

  • 请问java高手,谁知道java怎么用 *.dll ???
  • 谁知道从那可以下载到Java的JDK?
  • 谁知道java认证的日期?
  • 谁知道java的反编译工具?那里可已找到?谢谢
  • 谁知道:怎样用JAVA代码实现对web客户端用户licence管理(如:licence限定为5用户)
  • 谁知道java核心技术卷一,卷二的下载地址,高分相求
  • java反编译程序MOCHA,谁知怎么用
  • 谁知到哪里有thinking in java 第二版的中文版下载(急!)
  • 谁知道为什么我的TextPad中没有编译Java、运行Application、运行Applet这三个选项????
  • 谁知道哪里有Visual Age for Java 4.0下载?先谢了!!!
  • 谁知道JAVA编程思想可以在哪下载? 有分
  • 谁知道哪里有java短期培训的地方﹖﹖﹖
  • HTML教程 iis7站长之家
  • 有谁知道怎样查看或解压扩展名为 .001(.002,.003等)我有JAVA文章是那个格式的
  • 请问有谁知道一款叫着mocha的java反编译器?
  • 谁知道java怎么发布?
  • 有谁知道如何,使用java做可以显示磁盘目录结构的选择对话框,
  • 有谁知道哪里有生成RTF文档的Java组件啊,小弟急用,分不够可在加
  • 谁知道Mastering Enterprise Java Beans II这本书在那里可以下载到???
  • 谁知道哪有JAVA的类库帮助啊!中文的!(在线给分)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 谁知道websphere的试用版怎么做掉?
  • 谁知道有类似启动kde的指令startkde,来启动gnome?
  • 谁知道jdbc有什么好一点的书,一定给分
  • 请问JBulider 4的序列号谁知到?能否提供给小弟?谢谢
  • 谁知道jbuilder3的KEY
  • 谁知道在哪儿可以找到Imap 4.5
  • 请问谁知道那有classes.zip for jdk1.2 ?
  • 谁知道哪儿有jbuilder5下载
  • 有谁知道关于Applet中怎么样调用html. 50分全送
  • jbuilder5企业版的序列号谁知道?
  • 谁知道JB的书籍下载?
  • 谁知道websphere4该怎么设置
  • 谁知道Borland application server 5.0的serial number 和 key?
  • 请问有谁知道那里有Linux系统的ADSL拨号软件下载!谢谢!
  • 谁知道如何写脚本,一开机就执行某程序?
  • 谁知道哪里有jbulider4下载,我的机器跑jbulider5很慢!
  • 谁知道如何使用sygate作二级代理〉??
  • 有谁知道哪有下载 JB6 的地方?谢谢
  • 谁知道MySQL的驱动接口程序在那里下载?
  • 谁知道红旗Linux桌面版3.0的序列号啊,请问大哥们


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3