Axis2 WebService 服务端发布和客户端调用
下载最新的Axis2 地址:http://mirrors.cnnic.cn/apache/axis/axis2/java/core/
下载 最新的war 包 axis2-1.7.4-war.zip ,下载完后将axis2.war放至tomcat安装目录下的webapps文件夹下,然后启动tomcat后,
一.在webapps目录下会生成axis2文件夹。 访问http://localhost:8080/axis2/能看到以下页面表示axis2运行成功。
二. 接下来,构建自己的项目 在MyEclipse下新建Web Project,项目名:webServicePrj。
三.新建一个HelloWorld类 作为测试类。
package com.webService; public class HelloWorld { // 服务器端访问地址: http://localhost:8080/webServicePrj/services/HelloWorld?wsdl //webServicePrj是项目名,services public String sayHello(String name) { return " hello " + name; } }
四. 把tomcat安装目录下的webapps/axis2/WEB-INF下的modules、service和conf文件拷至WebRoot下的WEB-INF目录下。同时把axis2/WEB-INFO/lib下的jar包也拷到项目的lib目录下。
关键点来了:项目 WebRoot/WEB-INF 下services 目录下 新建一个任意名称的文件夹,建完后在新建 META-INF/services.xml. services.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <service name="HelloWorld"> <description> HelloWorld Service Example </description> <parameter name="ServiceClass"> com.webService.HelloWorld </parameter> <operation name="sayHello"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> </service>
具体的文件路径如下:
五.WEB-INF新建web.xml.内容如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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_3_0.xsd"> <display-name></display-name> <!-- 加载Axis --> <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>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> </web-app>
至此,我们将项目部署的tomcat下。访问下webService服务。
访问路径: http://localhost:8080/webServicePrj/services/HelloWorld?wsdl
有如下消息,表示我们访问webService服务成功!
接下来我们新建一个客户端类,调用服务类HelloWorld。新建类代码如下
package com.client; 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; public class clientTest { /** * 方法一:应用rpc的方式调用 这种方式就等于远程调用, * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。 * @param args */ public static void main(String[] args) { String url = "http://127.0.0.1:8080/webServicePrj/services/HelloWorld?wsdl"; String result = null; // 使用RPC方式调用WebService RPCServiceClient serviceClient = null; try { serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference(url); options.setTo(targetEPR); // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值 // // 指定要调用的sayHello方法及WSDL文件的命名空间..... QName opAddEntry = new QName("http://webService.com", "sayHello"); Object[] opAddEntryArgs = new Object[] { "jack" }; Class[] classes = new Class[] { String.class }; // 调用sayHello方法并输出该方法的返回值....... result = (String) serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]; System.out.println(result); } catch (AxisFault e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Axis2 客户端调用需要引入 三个jar文件。
此时,我们能访问我们web服务的接口。运行main方法 输出 hello jack.
接下来,咱们新建一个比较简单的远程调用类。
package com.client; import java.rmi.RemoteException; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; public class RemoteTest { /** * 方法二:利用AXIS2远程调用 * @return */ public String invokeRemoteMethod(){ // 远程调用路径 String endpoint = "http://localhost:8080/webServicePrj/services/HelloWorld?wsdl"; String result = "call failed!"; Service service = new Service(); Call call = null; try { call = (Call) service.createCall(); call.setTargetEndpointAddress(endpoint); // 调用的方法名 // call.setOperationName("sayHello"); QName opName = new QName("http://webService.com", "sayHello"); call.setOperationName(opName); // 设置参数名(可不用设置) call.addParameter("name", // 参数名 XMLType.XSD_STRING, // 参数类型:String ParameterMode.IN); // 参数模式:'IN' or 'OUT' // 设置返回值类型(可不用设置) call.setReturnType(XMLType.XSD_STRING); // 返回值类型:String String name = "Alexia"; result = (String) call.invoke(new Object[] { name });// 远程调用 } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } return result; } public static void main(String[] args) { RemoteTest rt = new RemoteTest(); String result = rt.invokeRemoteMethod(); System.out.println(result); } }
回调方法 Call 是Axis 自带的方法。
关于Axis2 的服务端发布,以及客户端的调用,内容分享就这些。有不明白或不合理之处还请各位小伙伴指点。