16
?TODO?Auto-generated?method?stub17Service?s?ObjectServiceFactory().create(IHelloWorldService.class);
18
XFireProxyFactory?xf?XFireProxyFactory(XFireFactory.newInstance().getXFire());
19
String?urlhttp://localhost:8989/HelloWorld/services/HelloWorldService;
20
21try22
????????{????????????
23
????????????
24
????????????IHelloWorldService?hs(IHelloWorldService)?xf.create(s,url);
25
????????????String?sths.example(zhangjin26
????????????System.out.print(st);
27
????????}28catch(Exception?e)
29
????????30
????????????e.printStackTrace();
3132333435
?????? 这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net?做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:
????????
?1

static
void
?main(String[]?args)?
throws
?2?3????????Service?s?4
????????XFireProxyFactory?xf
????????
//远程调用.net开发的webserviceClient?c?Client(?URL(http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl));

????????Object[]?oc.invoke(qqCheckOnline?String[]{531086641591284436}11调用.net本机开发的webservice12Client?c1http://localhost/zj/Service.asmx?wsdl13
Object[]?o1c1.invoke(HelloWorld?String[]{}14三、使用axis1.4调用webservice方法
???前提条件:下载axis1.4包和tomcat服务器???,并将axis文件夹复制到tomcat服务器的webapp文件夹中
?? 这里我就说一下最简单的方法:
???????? 首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入
http://localhost:8989/axis/HelloWorld.jws?wsdl
,就会得到一个wsdl文件,其客户端调用方法如下:
??
?javax.xml.rpc.Service;
?javax.xml.rpc.ServiceException;
?javax.xml.rpc.ServiceFactory;
?java.rmi.RemoteException;
?javax.xml.namespace.QName;

?TestHelloWorld?

????????????

????????String?wsdlUrl?http://localhost:8989/axis/HelloWorld.jws?wsdl
????????String?nameSpaceUri?http://localhost:8989/axis/HelloWorld.jws
????????String?serviceName?HelloWorldService
????????String?portName?
????????ServiceFactory?serviceFactory??ServiceFactory.newInstance();

????????Service?afService?serviceFactory.createService(?URL(wsdlUrl),0)">?QName(nameSpaceUri,?serviceName));

????????HelloWorldInterface?proxy??(HelloWorldInterface)afService.getPort(
????????System.out.println(return?value?is?proxy.getName(john)?)?;
30
四、使用axis2开发webservice(这里首先感谢李宁老师)????
? 使用axis2 需要先下载?
?? axis2-1.4.1-bin.zip
?? axis2-1.4.1-war.zip
??
http://ws.apache.org/axis2/
???
? 同理,也需要将axis2复制到webapp目录中
在axis2中部署webservice有两种方法,
??? 第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名
??? 第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明
??? 下面分别说明使用方法:
??? 1.pojo方式:
在
Axis2
中不需要进行任何的配置,就可以直接将一个简单的
POJO
发布成
WebService
。其中
中所有的
public
方法将被发布成
方法。先实现一个pojo类:
?
?1

?HelloWorld
?String?getName(String?name)

????你好??name;
????
int?add(?a,0)">?b)

?????ab;

???由于这两个方法都是public类型,所以都会发布成webservice。
编译
HelloWorld
类后,将
HelloWorld.class
文件放到%tomcat%
webappsaxis2WEB-INFpojo
目录中(如果没有
pojo
目录,则建立该目录),然后打开浏览器进行测试:
输入一下url:?
http://localhost:8080/axis2/services/listServices
会列出所有webservice
?
?
这是其中的两个webservice列表,接着,在客户端进行测试:
首先可以写一个封装类,减少编码,代码如下:
??
??
?MZ.GetWebService;
?org.apache.axis2.AxisFault;
?org.apache.axis2.addressing.EndpointReference;
?org.apache.axis2.client.Options;
?org.apache.axis2.rpc.client.RPCServiceClient;

?GetWSByAxis2?

??????private?String?EndPointUrl;
?String?QUrlhttp://ws.apache.org/axis2?QName?opAddEntry;?
?String?WSUrl;
?RPCServiceClient?setOption()??AxisFault

??????
??????????RPCServiceClient?serviceClient??RPCServiceClient();

??????????Options?options??serviceClient.getOptions();

??????????EndpointReference?targetEPR??EndpointReference(WSUrl);

??????????options.setTo(targetEPR);

???????????serviceClient;

??????}
??????

???????QName?getQname(String?Option)
??????????
?QName?(QUrl,Option);

?返回String???????String?getStr(String?Option)?
??????this.setOption();?

?????

??????????opAddEntry?.getQname(Option);
35
?????????String?str??(String)?serviceClient.invokeBlocking(opAddEntry,?
36
???????????????????????????Object[]?Class[]{String.?})[0];
37
??????????str;
38
?????}39?返回一维String数组40?String[]?getArray(String?Option)?41
??????4243444546
?????????String[]?strArray??(String[])?serviceClient.invokeBlocking(opAddEntry,128)">47
???????????????????????????Object[]?Class[]{String[].48?strArray;
4950从WebService中返回一个对象的实例51??????Object?getObject(String?Option,Object?o)?52
?????{?
53
????????RPCServiceClient?serviceClient?54
?????????QName?qname55
?????????Object?object??serviceClient.invokeBlocking(qname,0)">?Object[]?Class[]{o.getClass()}56?object;
575859/////////////////////////////////////////???????读者可以自己封装数据类型,如int,byte,float等数据类型60
}
61
客户端调用方法:
MZ.GetWebService.GetWSByAxis2?ws
=
new
?MZ.GetWebService.GetWSByAxis2();

ws.WSUrl
"
http://localhost:8989/axis2/services/HelloWorld
;

HelloWorld?hello
?(HelloWorld)ws.getObject(
getName
);

????????????

???????????

?System.out.println(hello.getName(
zhangjin
));

???? 2.使用service.xml发布webservice,
这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:
service?name
HelloWorld

????
description

????????HelloWorld?webservice

????
parameter?name
ServiceClass

????????service.HelloWorld??

????
parameter
messageReceivers

????????
messageReceiver?mep
http://www.w3.org/2004/08/wsdl/in-out

????????????
org.apache.axis2.rpc.receivers.RPCMessageReceiver
/>
http://www.w3.org/2004/08/wsdl/in-only
org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver


其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:
http://localhost:8080/axis2/services/myService?wsdl
? 除此之外,还有直接可以在其中制定webservice操作方法:可以这样些service.xml文件

???????HelloWorld?service

????????service.HelloWorld??
operation?name
messageReceiver?
operation
add
messageReceiver

????????????
15
16
如果要发布多个webservice,可以在文件两段加上
<
serviceGroup><service></service>...<service></service></serviceGroup>发布
以上纯属个人理解,如有疑义,欢迎大家拍砖啊!
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!