对于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是一种标准,自然在使用上不会有过于偏离的地方。深刻掌握理解仍需要阅读相应文献。