实例2.HelloService
(1)首先定义服务方法,代码如下所示:
- package?edu.sjtu.webservice;??
- ??
- public?class?HelloService?{??
- ????public?String?sayHelloNew()?{??
- ????????return?"hello";??
- ????}??
- ??
- public?String?sayHelloToPersonNew(String?name)?{??
- if?(name?==?null)?{??
- ????????????name?=?"nobody";??
- ????????}??
- ????????return?"hello,"?+?name;??
- ????}??
- ????void?updateData(String?data)?{??
- ????????System.out.println(data?+?"?已更新。");??
- }??
(2)参考实例1将这个方法发布为服务。
(3)编写客户端代码调用WebService(主要参考[5])
本文例子与其他例子最大的不同就在这里,其他例子一般需要根据刚才的服务wsdl生成客户端stub,然后通过stub来调用服务,这种方式显得比较单一,客户端必须需要stub存根才能够访问服务,很不方面。本例子的客户端不采用stub方式,而是一种实现通用的调用方式,不需要任何客户端存根即可访问服务。只需要指定对于的web servce地址、操作名、参数和函数返回类型即可。代码如下所示:
HelloServiceTest2.java
package?edu.sjtu.webservice.test;??
- import?javax.xml.namespace.QName;??
- import?org.apache.axis2.AxisFault;??
- import?org.apache.axis2.addressing.EndpointReference;??
- import?org.apache.axis2.client.Options;??
- import?org.apache.axis2.rpc.client.RPCServiceClient;??
- class?HelloServiceTest2?{??
- private?RPCServiceClient?serviceClient;??
- private?Options?options;??
- private?EndpointReference?targetEPR;??
- public?HelloServiceTest2(String?endpoint)?throws?AxisFault?{??
- ????????serviceClient?=?new?RPCServiceClient();??
- ????????options?=?serviceClient.getOptions();??
- ????????targetEPR?=?new?EndpointReference(endpoint);??
- ????????options.setTo(targetEPR);??
- public?Object[]?invokeOp(String?targetNamespace,?String?opName,??
- ????????????Object[]?opArgs,?Class<?>[]?opReturnType)?throws?AxisFault,??
- ????????????ClassNotFoundException?{??
- ??????????
- ????????QName?opQName?=?new?QName(targetNamespace,?opName);??
- //?设定返回值??
- ??????????
- //?操作需要传入的参数已经在参数中给定,这里直接传入方法中调用??
- return?serviceClient.invokeBlocking(opQName,?opArgs,?opReturnType);??
- ?????
- ?
- ?
- ?????*?@throws?ClassNotFoundException?
- ?????*/??
- static?void?main(String[]?args)? ????????????ClassNotFoundException?{??
- //?TODO?Auto-generated?method?stub??
- final?String?endPointReference?=?"http://localhost:8080/WebServiceTest1/services/HelloService";??
- final?String?targetNamespace?=?"http://webservice.sjtu.edu";??
- ????????HelloServiceTest2?client?=?new?HelloServiceTest2(endPointReference);??
- ????????String?opName?=?"sayHelloToPersonNew";??
- ????????Object[]?opArgs?=?new?Object[]?{?"My?Friends"?};??
- ????????Class<?>[]?opReturnType?=?new?Class[]?{?String[].class?};??
- ????????Object[]?response?=?client.invokeOp(targetNamespace,?opName,??
- ????????????????opReturnType);??
- ????????System.out.println(((String[])?response[0])[0]);??
- 运行该程序,点击Run As->Java application,可以看到控制台端口的输出是:Hello,My Friends,表明客户端调用成功。该例子最大的不同和优势表现在客户端的调用方式,或者说是发起服务调用的方式,虽然比起客户端stub存根的方式,代码稍多,但是这种方式统一,不需要生产stub存根代码,解决了客户端有很多类的问题。如果读者对这些代码进一步封装,我想调用方式很简单,只需要传递相关参数,这更好地说明了服务调用的优势。而且这种方式更加简单明了,一看便知具体含义。而不需要弄得stub类的一些机制。
(4)改写客户端调用服务的代码
(3)中提到的客户端应用代码写的略微有些繁杂,下面将上面的客户端调用service程序进行改写,简洁了许多。代码如下:
HelloServiceTest.java
copy
import?org.apache.axis2.AxisFault;??
- import?org.apache.axis2.addressing.EndpointReference;??
- import?org.apache.axis2.client.Options;??
- import?org.apache.axis2.rpc.client.RPCServiceClient;??
- class?HelloServiceTest?{??
- void?main(String?args[])?throws?AxisFault?{??
- //?使用RPC方式调用WebService??
- ????????RPCServiceClient?serviceClient?=? ????????Options?options?=?serviceClient.getOptions();??
- //?指定调用WebService的URL??
- ????????EndpointReference?targetEPR?=?new?EndpointReference("http://localhost:8080/WebServiceTest1/services/HelloService");??
- ????????options.setTo(targetEPR);??
- ??????????
- //?指定要调用的sayHelloToPerson方法及WSDL文件的命名空间??
- ????????QName?opAddEntry?=?new?QName("http://webservice.sjtu.edu","sayHelloToPersonNew");??
- //?指定sayHelloToPerson方法的参数值??
- ????????Object[]?opAddEntryArgs?=?new?Object[]?{?"xuwei"?};??
- //?指定sayHelloToPerson方法返回值的数据类型的Class对象??
- ????????Class[]?classes?=?new?Class[]?{?String.//?调用sayHelloToPerson方法并输出该方法的返回值??
- ????????System.out.println(serviceClient.invokeBlocking(opAddEntry,op
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|