对于Axis来讲,它支持两种发布WebService服务的方式:一种是即时发布;另一种是定制发布。本例使用前者,只因其简单,足可达到本文简介目的,但同时要强调一点,它在正规的项目中是不适用用。原因是即时发布太简单,简单到有了服务的源码,将其放到Tomcat等上即可使用,这点却导致了其不够灵活,一旦我们仅有jar包等却没有源码时,则不可用了。言归正传,先发布一个WebService服务。
在下载下来的axis-bin-1_4.zip中找到webapps\axis(,将axis整个文件夹拷贝到Tomcat的webapps下,然后将下面的WebService服务类HelloFlexToWebService.jws,放到Tomcat\webapps\axis下。
public class HelloFlexToWebService{ public String getReturn(String userName) { return "you are accessing WebService, " + userName; } }
运行tomcat,访问 http://localhost:8080/axis/HelloFlexToWebService.jws?wsdl,我们会发现tomcat已经为我们自动将上面的服务解析为WSDL文件了,简单截取部分代码如下所示,对比上面的服务类,相信我们会发先其对应关系。
<wsdl:message name="getReturnResponse"> <wsdl:part name="getReturnReturn" type="xsd:string" /> </wsdl:message> - <wsdl:message name="getReturnRequest"> <wsdl:part name="userName" type="xsd:string" /> </wsdl:message> - <wsdl:portType name="HelloFlexToWebService"> - <wsdl:operation name="getReturn" parameterOrder="userName"> <wsdl:input message="impl:getReturnRequest" name="getReturnRequest" /> <wsdl:output message="impl:getReturnResponse" name="getReturnResponse" /> </wsdl:operation> </wsdl:portType>
对此WSDL文件本文不多做解释,总之它是就是我们对外发布的服务,客户端通过Axis引擎访问服务获取相应数据。下面展示java客户端访问此服务的代码示例。
import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class WSClient { public static void main(String[] args){ String wsdlUrl = "http://localhost:8080/axis/HelloFlexToWebService.jws?wsdl"; Service service = new Service(); try { Call call = (Call)service.createCall(); call.setTargetEndpointAddress(wsdlUrl); call.setOperationName(new QName(wsdlUrl,"getReturn")); try { String result = (String)call.invoke(new Object[]{"ChenWeiDong"}); System.out.println(result); } catch (RemoteException e) { e.printStackTrace(); } System.out.println(); } catch (ServiceException e) { e.printStackTrace(); } } }
对比下面使用Flex访问WebService服务的代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <s:WebService id="webService" wsdl="http://localhost:8080/axis/HelloFlexToWebService.jws?wsdl" showBusyCursor="true" result="onLoad(event)" fault="faultHandler(event)"/> </fx:Declarations> <mx:VBox> <mx:TextInput id="cityname" text="ChenWeiDong"/> <mx:Button label="CallWebService" click="callWebService(event)"/> <mx:TextInput id="myWeatherReport" height="30" width="260" editable="false" /> </mx:VBox> <fx:Script> <![CDATA[ import mx.controls.Alert; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; /* *访问webService服务 */ protected function callWebService(event:MouseEvent):void { webService.getReturn(cityname.text); } /* *访问webService成功 */ private function onLoad(event:ResultEvent):void{ myWeatherReport.text = String(event.result); } /* *访问webService失败 */ private function faultHandler(event:FaultEvent):void{ Alert.show(event.fault.toString(),'WebService Error'); } ]]> </fx:Script> </s:Application>
从Flex和java的客户端代码可以发现,访问Webservice服务,都是先定位到服务,然后访问服务对外提供的接口,获取相应的数据。
本文简单描述了发布WebService服务和使用Java和Flex访问所发布的服务。通过本文主要了解此WebService的原理性内容以及其实现框架的多样化,为工作中使用它提供点基本思路,同时了解不同语言在访问WebService上其实是大同小异的,原因是Webservice是一种标准,自然在使用上不会有过于偏离的地方。深刻掌握理解仍需要阅读相应文献。