服务器端WebServiceDispatcher.java
package com.shoo.ws;import org.apache.axis.AxisFault;public interface WebServiceDispatcher
{    public abstract String[] dispatch(String s, String s1, String s2, String s3, String as[])
        throws AxisFault;
}
服务器提供:
URL             http://www.xxx.com/services/WebServiceDispatcher
Operation Name  dispatch
returnQName    dispatchReturn
returnType     ArrayOfstring
parameter
Name Type Desc
username String 系统代码
password String 系统口令
springBean String 服务对象名称
beanMethod String 服务方法名称
args ArrayOfstring 传递给服务方法的参数
基本连接服务器端代码终于自己搞定了大侠们帮我看看怎么把参数传递过去,调用其提供的JobWSBean类的UpdateJob方法。

解决方案 »

  1.   

    楼主写得不很清楚,调用axis服务有三种方法吧:
    1 wsif
    2 axis-client
    3 wsdl2java通过客户端来调用服务,还有在配置webservices服务时要注意把配置参数!
      

  2.   

    package test.com.dayang.archive.api;import java.net.URL;
    import java.util.Random;import javax.xml.namespace.QName;
    import javax.xml.rpc.ParameterMode;import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.XMLType;
    import org.apache.axis.encoding.ser.BeanDeserializerFactory;
    import org.apache.axis.encoding.ser.BeanSerializerFactory;import com.dayang.archive.api.param.ArchiveFileInfo;
    import com.dayang.archive.api.param.ArchiveParam;
    import com.dayang.archive.api.param.CopyFileInfo;
    import com.dayang.archive.api.param.DownloadFileInfo;
    import com.dayang.archive.api.param.DownloadParam;
    import com.dayang.archive.api.param.FileCopyParam;
    import com.dayang.archive.structure.TaskInfo;
    import com.dayang.archive.structure.TaskProgress;import junit.framework.TestCase;public class TestArchiveAPIWebServices extends TestCase {
    Service service = null;
    Call call = null;
    protected void tearDown() throws Exception {
    // TODO Auto-generated method stub
    super.tearDown();
    }

    protected void setUp() throws Exception {
    super.setUp();
            //建立请求服务框架实例。
            service = new Service();
            //从框架中生成一个维护调用的实例。
            call = (Call) service.createCall();
              //注册输出参数类型
            QName qn = new QName("urn:archive_api","TaskProgress");
            call.registerTypeMapping(TaskProgress.class,qn,
                          new BeanSerializerFactory(TaskProgress.class, qn),
                                new BeanDeserializerFactory(TaskProgress.class, qn) );        QName qn1 = new QName("urn:archive_api","TaskInfo");
            call.registerTypeMapping(TaskInfo.class,qn1,
                          new BeanSerializerFactory(TaskInfo.class, qn1),
                                new BeanDeserializerFactory(TaskInfo.class, qn1) );        QName qn2 = new QName("urn:archive_api","FileCopyParam");
            call.registerTypeMapping(FileCopyParam.class,qn2,
                          new BeanSerializerFactory(FileCopyParam.class, qn2),
                                new BeanDeserializerFactory(FileCopyParam.class, qn2) );
            
            QName qn3 = new QName("urn:archive_api","CopyFileInfo");
            call.registerTypeMapping(CopyFileInfo.class,qn3,
                          new BeanSerializerFactory(CopyFileInfo.class, qn3),
                                new BeanDeserializerFactory(CopyFileInfo.class, qn3) );
            
            QName qn4 = new QName("urn:archive_api","DownloadParam");
            call.registerTypeMapping(DownloadParam.class,qn4,
                          new BeanSerializerFactory(DownloadParam.class, qn4),
                                new BeanDeserializerFactory(DownloadParam.class, qn4) );
            
            QName qn5 = new QName("urn:archive_api","DownloadFileInfo");
            call.registerTypeMapping(DownloadFileInfo.class,qn5,
                          new BeanSerializerFactory(DownloadFileInfo.class, qn5),
                                new BeanDeserializerFactory(DownloadFileInfo.class, qn5) );
            
            QName qn6 = new QName("urn:archive_api","ArchiveFileInfo");
            call.registerTypeMapping(ArchiveFileInfo.class,qn6,
                          new BeanSerializerFactory(ArchiveFileInfo.class, qn6),
                                new BeanDeserializerFactory(ArchiveFileInfo.class, qn6) );
            
            QName qn7 = new QName("urn:archive_api","ArchiveParam");
            call.registerTypeMapping(ArchiveParam.class,qn7,
                          new BeanSerializerFactory(ArchiveParam.class, qn7),
                                new BeanDeserializerFactory(ArchiveParam.class, qn7) );
            
            // 调用的web服务的url地址
            call.setTargetEndpointAddress(new URL("http://localhost:8080/archive_api_ws/services/archive_api"));
    }

    public void testGetTaskInfo() throws Exception{
            //设置需要调用的函数名称
            call.setOperationName(new QName("archive_api","getTaskInfo"));
            //设置参数
            call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);
            //设置返回参数
            call.setReturnClass(TaskInfo.class);
             String taskID = "4BF56AB9-DAE3-437C-815B-85C341ABA9C8";
             Object[] aryObj = new Object[] {taskID};
             TaskInfo a = (TaskInfo) call.invoke(aryObj);
             System.out.println(a);
             if (a != null) {
                 System.out.println(a.getCreated());
    }
    }
      

  3.   

    webservices的帮手xmlspy
    当你已经开发好了一个webservices,也发布了,你如果希望调用试一试,可以自己写java代码调用,或者别的语言的代码,更方便的是从xmlspy2007中调用。(我目前还不知道如何写java代码调用document literal的web service)
    你只要在选择SOAP/Create new SOAP request,然后输入url,比如我的是http://localhost:8080/archive_api_ws/services/archive_api?wsdl
    它就会解析出这个webservices对应的operation,你选择一个后它就会帮你生成一个request的SOAP,你只要将参数改改就可以调用了,调用完了还可以看到返回的soap结果。的确是方便,这就体现了web services作为标准的优势。
    上面在“对于不同的类型style和use的分析和理解”中我列出来的几个例子就都是xmlspy生成的。
      

  4.   

    1、访问http://www.xxx.com/services/WebServiceDispatcher?wsdl,网页打开来是一个xml文档,点击菜单查看->源文件,在记事本中把所有的拷贝下来保存为XXX.wsdl文档。
    2、根据你用的语言,比如java用axis的wsdl2java, C可以用gsoap的soapcpp2,这些工具都可以根据wsdl生成一大堆底层的代码。
    3、根据工具生成的代码放到自己建立的工程中去,然后进行调用,具体方法可以参考各种工具的documents
      

  5.   

    不用那么复杂,现在的webService复杂得入门都难.
    按上楼的下个包,再到这个地方看看就行了.很简单的:
    http://blog.csdn.net/lyj_china/archive/2006/05/18/743610.aspx
      

  6.   

    我建议你使用xmlspy来测试web services,根本就不用写代码
      

  7.   

    自从我知道xmlspy的这个功能,就爽了。
      

  8.   

    向ms开发环境学习.myecplise5.1,xfire 点几下按钮,就可以生成服务端类,客户端类。比如服务器是 server.getid();那么鼠标生成的客户端类是 client.getid();根本不用键盘。myecplise5.1也带一个websercie浏览器,输入 /webservice?wsdl,就会产生一些输入框,每个输入框对应一个参数,然后鼠标点击,就可以了。axis,有类似的ecplise支持吗? 没有的话,费那事干吗。
      

  9.   

    问个问题。在跨平台的时候,比如.net和java互相调用的时候,各种语言的自定义类型,能互相解析吗?比如java向.net返回一个多维数组,.net客户端能正确解析成自己语言的多维数组吗?
      

  10.   

    都是通过WSDL文件来生成stub的,不用的平台(不用的语言)会根据WSDL文件生成各自平台所需的stub文件,当然可以互调的了。
      

  11.   

    我发布的服务中有个方法调用了oralce数据库,然后测试服务的时候说:
    java.lang.ClassNotFoundException:oracle:jdbc.driver.OracleDriver请问有什么办法可以解决吗,与build.xml写法有关吗?
    用生成的stub测试呢