Axis初学手册 -- 2

第四步就是写客户端程序了。

WSClient.java

try  {
            String endpoint 
=   " http://localhost:8080/ws/services/CalcService " ;

            Service service 
=   new  Service();
            Call call 
=  service.createCall();

            call.setTargetEndpointAddress(endpoint);
            call.setOperationName(
new  QName( " http://ws.mstar.org " " plus " ));
            Object[] params 
=   new  Object[ 2 ];
            params[
0 =   10 ;
            params[
1 =   20 ;
            Integer result 
=  (Integer) call.invoke(params);
            System.out.println(
" Result:   "   +  result);
        } 
catch  (Exception e) {
            e.printStackTrace();
        }

这是动态的调用WebService的方法,并不需要根据WSDL生成客户端存根。但是对于Service中有复合类型的时候就不可以了。下一个例子讲的就是如何做客户端存根。如果这个例子能够正常运行就可以了。

然后是一个有FooBeanService

很简单,就是返回一个FooBean,在参数上做了一些手脚J

然后在server-config.wsdd中加入描述

这里多了typeMapping标记用来描述复杂数据类型FooBean。对入复杂类型的序列化可以是自定义的,在serializer deserializer属性中改。那个xmlns,要留意一下,因为在客户端生成存根时的AntTask中要写一些Mapping,来确定那些xmlns映射到哪些package。当然这些也可以在WSDL中找到。而WSDL中的xmlns也是在这里定义的。

下面也各客户端。由于这次的Service中有复杂类型所以要根据WSDL生成这些复杂类型和Service的存根。取得WSDL的方法可以使用java2WSDL来做,但那样太麻烦,其实在List页面中用右键-另存为就可以了。然后写一个ant文件

运行客户端看看!

 

做简单的WebService就基本上这样了。但这样的Webservice还远远不能用户真正的项目中,还有很多问题没有解决,比如安全问题,有状态会话问题等等。这些问题很多可以通过Hanlder来解决,他有点类似于FilterServlet。具体的东西我还有没有研究,axis在这方面的资料就很少了。研究明白以后再写一篇吧。

本文源码:http://www.blogjava.net/Files/mstar/WsLearn.rar

<? xml version="1.0" encoding="UTF-8" ?>
< project  default ="GenJavaSub"  basedir ="." >
    
< taskdef  name ="wsdl2java"  classname ="org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask" />
    
< target  name ="GenJavaSub" >
        
< property  name ="output.dir"  value ="src" />
        
< property  name ="generated.dir"  value ="src/org/mstar/wsclient/generated" />
        
< property  name ="wsdl.url"  value ="wsdl/FooService.wsdl" />
        
< delete  dir ="${generated.dir}" />
        
< mkdir   dir ="${generated.dir}" />
        
< wsdl2java  all ="true"  debug ="false"  helperGen ="true"
            noimports
="false"
            output
="${output.dir}"
            serverside
="false"
            skeletonDeploy
="false"
            typeMappingVersion
="1.1"
            url
="${wsdl.url}"
            verbose
="false"
            noWrapped
="false" >
            
< mapping  namespace ="http://ws.mstar.org"  package ="org.mstar.wsclient.generated" />
            
< mapping  namespace ="http://localhost:8080/ws/services/FooService"  package ="org.mstar.wsclient.generated" />
        
</ wsdl2java >
    
</ target >
</ project >

这里上面的东西比较好理解,在下面的mapping中一定要注意,因为每个ServiceComplexType都有自己的xmlns,这里就是把xmlns映射到指定的package 比如 http://ws.mstar.org 映射到org.mstar.wsclient.generated包。这些namespace可以在wsdl文件中找到。运行ant就会看见在src中的org.mstar.wsclient.generated中多了几个java文件。接下在我们就可以用这几个类了。还有一点要注意wsdl2java output属性要指向src,而不是generated文件夹。

客户端调用就相对容易多了

 

FooServiceService serviceLocator  =   new  FooServiceServiceLocator();
try  {
FooService service 
=  serviceLocator.getFooService();
    FooBean fooBean 
=  service.getFooBean( " fooBean " 10 true );
System.out.println(fooBean);
catch  (ServiceException e) {
    e.printStackTrace();
catch  (RemoteException e) {
    e.printStackTrace();
}
< service  name ="FooService"  provider ="java:RPC" >
        
< parameter  name ="allowedMethods"  value ="*" />
        
< parameter  name ="className"  value ="org.mstar.ws.FooService" />
        
< parameter  name ="scope"  value ="session" />
        
< typeMapping  encodingStyle ="http://schemas.xmlsoap.org/soap/encoding/"
                     xmlns:ns1
="http://ws.mstar.org"
                     qname
="ns1:FooBean"
                     languageSpecificType
="java:org.mstar.ws.FooBean"
                     serializer
="org.apache.axis.encoding.ser.BeanSerializerFactory"
                     deserializer
="org.apache.axis.encoding.ser.BeanDeserializerFactory"
                     name
="FooBean" />
</ service >
public   class  FooService {
    
public  FooBean getFooBean(String foo1,Integer foo2,Boolean foo3){
        
return   new  FooBean(foo1 + " (Remote) " ,foo2 + 10 , ! foo3);
    }
}

第五步做一个稍微复杂一点的例子,对于WebServices不能仅仅对简单类型的数据进行操作,也应该能对复杂类型进行操作。下面的例子就是:

先要一个复杂类型的类

 

public   class  FooBean {
    
private  String foo1;
    
private  Integer foo2;
    
private  Boolean foo3;

    
public  FooBean(String foo1, Integer foo2, Boolean foo3) {
        
this .foo1  =  foo1;
        
this .foo2  =  foo2;
        
this .foo3  =  foo3;
}
…. Setter and Getter
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值