Axis2+tomcat5.5?实现webService?服务端发布与客户端的调用
?
Aixs2开发webService的方法有很多,在此只介绍一种比较简单的实现方法。
第一步:首先要下载开发所需要的jar包
?
下载:axis2-1.6.2-war.zip
http://axis.apache.org/axis2/java/core/download.cgi
下载完后解压至tomcat安装目录下的webapps文件夹下,启动tomcat后,在webapps目录下会生成axis2文件夹。
访问http://localhost:8080/axis2/能看到以下页面表示axis2运行成功。
?
?
?
第二部
在Eclipse下新建Web Project,工程名:webServe。新建包com.cm.service,新建类HelloWorld,代码如下:
package?com.cm.service;
?
public?class?HelloWorld?{
?
????public?String sayHello(String name){return?"Hello,?"+name+".";}
????public?String saySorry(String name){"Sorry,"+name+public?String getWorld(){"Hello,World";}
???
}
?
在WEB-INF目录下修改web.xml文件,内容如下:
<?xml?version="1.0"?encoding="UTF-8"?>
<web-app?"2.5"
????xmlns="http://java.sun.com/xml/ns/javaee"
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
???
<!--Axis2?config?start-->
<servlet>
????<servlet-name>AxisServlet</servlet-name>
????<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
????<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>?
?<servlet-name>?
?<url-pattern>/services/*</url-pattern>?
</servlet-mapping>
?
<!--Axis2??end-->
??<welcome-file-list>
????<welcome-file>index.jsp</welcome-file>
??</welcome-file-list>
</web-app>
?
把tomcat安装目录下的webapps/axis2/WEB-INF下的modules、service和conf文件件拷至HelloWorld下的WEB-INF目录下。把lib下的如下jar包夜拷过去。
?
?
?
然后再services下新建HelloWorld/META-INF路径,META-INF下新建services.xml,内容如下:
<service?name="HelloWorld">?
????<description>?
????????HelloWorld Service Example
????</description>?
????<parameter?"ServiceClass">?
????????com.cm.service.HelloWorld
????</parameter>?
????<operation?"sayHello">?
????????<messageReceiverclass="org.apache.axis2.rpc.receivers.RPCMessageReceiver"?/>?
????</operation>?
????<"saySorry">?
????????<"getWorld">?
????????<"org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"?/>?
????</operation>?
</service>??
?
启动tomcat后访问http://127.0.0.1:8888/webServe/services/HelloWorld?wsdl能看到服务信息了。
到此Axis2的WebService服务已成功发布
?
Axis2客户端调用:
下面看看利用axis2?客户端调用实例
?
新建一个客户端调用类AxisUtil
代码如下:
package?com.cm.client;
?
?
import?javax.xml.namespace.QName;
import?org.apache.axis2.addressing.EndpointReference;
import?org.apache.axis2.client.Options;
import?org.apache.axis2.rpc.client.RPCServiceClient;
?
class?AxisUtil {
????static?void?main(String[] args) {
??????
???????String xmlStr="xiaoxu.wang";
???????String url="http://127.0.0.1:8888/webServe/services/HelloWorld";
???????String method="saySorry";
???????AxisUtil.sendService(xmlStr,url,method);
????}
????static?String sendService(String xmlStr,String url,String method){
???????String xml=null;
???????try?{
??????????
???????????RPCServiceClient serviceClient =?new?RPCServiceClient();
???????????Options options = serviceClient.getOptions();
???????????EndpointReference targetEPR =?new?EndpointReference(url);
???????????options.setTo(targetEPR);
???????????//?在创建QName对象时,类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值
????????????QName opAddEntry =?new?QName("http://service.cm.com",method);
????????????参数,如果有多个,继续往后面增加即可,不用指定参数的名称
????????????Object[] opAddEntryArgs =?new?Object[] {xmlStr};
????????????返回参数类型,这个和axis1有点区别
????????????// invokeBlocking方法有三个参数,其中第一个参数的类型是对象,表示要调用的方法名;
????????????第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
????????????第三个参数表示方法的返回值类型的Class对象,参数类型为Class[]。
????????????当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}
????????????如果被调用的方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,
????????????该方法只有两个参数,它们的含义与方法的前两个参数的含义相同
????????????Class[] classes =?new?Class[] { String.class?};
????????????xml=(String)serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0];
????????????System.out.println(xml);
?
?
???????}?catch?(Exception e) {
???????????e.printStackTrace();
???????????long?end?= System.currentTimeMillis();
???????}
???????return?xml;
????}
}
?
运行结果:
Sorry,xiaoxu.wang.
?
?
?
运用AXIOM方式的客户端调用
import?org.apache.axiom.om.OMAbstractFactory;
import?org.apache.axiom.om.OMElement;
import?org.apache.axiom.om.OMFactory;
import?org.apache.axiom.om.OMNamespace;
import?org.apache.axis2.addressing.EndpointReference;
import?org.apache.axis2.client.Options;
import?org.apache.axis2.client.ServiceClient;
?
?
public?class?Test {
???
????private?static?EndpointReference?targetEPR=newEndpointReference("http://192.168.1.200:8080/IntegratedLS/services/HelloWorld");
????static?void?main(String[] args) {
???????try{
???????????Options options=new?Options();
???????????options.setTo(targetEPR);
???????????ServiceClient sender=new?ServiceClient();
???????????sender.setOptions(options);
???????????options.setAction("urn:sayHello");
??????????
???????????//创建request SOAP包。
???????????OMFactory fac=OMAbstractFactory.getOMFactory();?
???????????// OMNamespace指定此SOAP文档名称空间。
???????????OMNamespace omNs = fac.createOMNamespace("http://service.com","tc");
???????????创建调用方法元素sayHello,并指定其在omNs指代的名称空间中。
???????????OMElement methodSH = fac.createOMElement("sayHello",omNs);
???????????的参数元素,指定其在指代的名称空间。
???????????OMElement valueSH = fac.createOMElement("name",95); font-size:10pt">指定元素的文本内容。
???????????valueSH.addChild(fac.createOMText(valueSH,255); font-size:10pt">"张三"));
???????????methodSH.addChild(valueSH);
???????????发出,
???????????同时将得到的远端由方法返回的信息保存到result。
???????????通过services.xml能准确找到方法所在的文件。
???????????OMElement result=sender.sendReceive(methodSH);
???????????System.out.println(result);
??????????
???????}catch(Exception axisFault){
???????????axisFault.printStackTrace();?
???????}
????}
}
总结:以上就是
Axis2?
服务发布与调用的简单案例。至于其他的实现方法有兴趣的可以继续研究。