WebService之Axis2

写在前面

 本文只说Axis2的用法。

1、下载与部署

  需要下载两个文件:

  下载地址:http://mirrors.cnnic.cn/apache/axis/axis2/java/core/1.7.1/axis2-1.7.1-war.zip,该文件是部署所用;

      下载地址:http://mirrors.cnnic.cn/apache/axis/axis2/java/core/1.7.1/axis2-1.7.1-bin.zip,该文件是开发所用;

      解压axis2-1.7.1-war.zip会得到一个axis2.war,将之扔到tomcat之webapps目录之下,启动tomcat,war包会自动解压;

      测试:http://localhost:8080/axis2,看到欢迎界面了吧,恭喜第一步成功了!

 

2、配置axis2

   打开/axis2/WEB-INF/conf/axis2.xml配置文件,找到<parameter name="hotupdate">false</parameter>改为true;

     只是为了热更新,方便调试。不配置也可以的。

3、HelloWorld

    在/axis2/WEB-INF目录下,新建一个目录pojo,在该目录下新建一个java文件:

public class HelloWorld
{
	public String sayHello(){
		return "hello world!";
	}
}

   编译之,shift,在此处打开命令行,javac HelloWorld.java, 不用解释吧?

   看到多了一个HelloWorld.class文件吧,就是它!

   打开浏览器,输入:http://localhost:8080/axis2/services/HelloWorld;

4、pojo目录说明

   为什么是pojo目录,新建个不行么?

   当然行,不过需要配置一下下,打开/axis2/WEB-INF/conf/axis2.xml配置文件,找到如下内容,新增目录

 <deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>
<!--新增的目录--> <deployer extension=".class" directory="pojo2" class="org.apache.axis2.deployment.POJODeployer"/>

   注意:这里面放置的类不能保护package,另外如果多个目录,service名称不能重复.

5、no package?那怎么能行!

    打开eclipse,建一个java project,并建立com.ws.test.services包,在该包下创建一个类HelloService,代码如下:

package com.ws.test.services;

public class HelloService {
	
	/**
	 * 没有返回值
	 * @param info
	 */
	public void send(String info) {
		System.out.println(info);
	}

	/**
	 * 有返回值
	 * @param x
	 * @param y
	 * @return
	 */
	public int add(int x, int y) {
		return x + y;
	}
}

     在src目录下新建META-INF文件夹,在其下建立两个文件:MANIFEST.MF和services.xml

serviecs.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<service name="HelloService">
	<description>一个简单的WebService</description>
	<!-- 服务全类名 -->
	<parameter name="ServiceClass">com.ws.test.services.HelloService</parameter>

	<operation name="send">
		<!-- 信息接收器, 无返回值用:RPCInOnlyMessageReceiver-->
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only"
			class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
	</operation>
	<operation name="add">
		<!-- 信息接收器, 有返回值用:RPCMessageReceiver-->
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
			class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	</operation>

</service>  

 注:\axis2-1.7.1\samples\pojo\src\META-INF目录下有services.xml例子,可以复制过来修改。

6、打包

     选择包名和META-INF,export为server.jar,修改为servier.aar,扔进\webapps\axis2\WEB-INF\services目录下,重启tomcat

     测试:http://localhost:8080/axis2,点击services,出现如下界面:

     

     成功了一大步!

   测试:http://localhost:8080/axis2/services/HelloService/send?info=hello,如果tomcat控制台输出hello,测试成功!

     测试:http://localhost:8080/axis2/services/HelloService/add?x=1&y=4,如果返回5,测试成功!

 

7、如何发布多个Service呢?

    在com.ws.test.services目录下新建HelloService2,代码如下:

package com.ws.test.services;

public class HelloService2 {
	public int sub(int x, int y) {
		return x - y;
	}
}

  修改services.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<serviceGroup>
	<service name="HelloService">
		<description>一个简单的WebService</description>
		<!-- 服务全类名 -->
		<parameter name="ServiceClass">com.ws.test.services.HelloService
		</parameter>

		<operation name="send">
			<!-- 信息接收器, 无返回值用:RPCInOnlyMessageReceiver -->
			<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only"
				class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		</operation>
		<operation name="add">
			<!-- 信息接收器, 有返回值用:RPCInOnlyMessageReceiver -->
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
				class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
		</operation>

	</service>

	<service name="HelloService2">
		<description>一个简单的WebService 2</description>
		<parameter name="ServiceClass">com.ws.test.services.HelloService2
		</parameter>
		<operation name="sub">
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
				class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
		</operation>
	</service>

</serviceGroup>

 重新打包,扔进\webapps\axis2\WEB-INF\services目录下;

 测试:http://localhost:8080/axis2/services/HelloService2/sub?x=5&y=2,返回3,则测试成功!

8、如何在程序中调用webservice呢?

     先加入jar包,jar包路径:\axis2-1.7.1\lib\*.jar

(1)直接看代码吧,这个方法比较麻烦

package com.ws.test.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 TestClient {

	public static void main(String[] args) throws AxisFault {

		RPCServiceClient serviceClient = new RPCServiceClient();
		Options options = serviceClient.getOptions();

		EndpointReference targetEPR = new EndpointReference(
				"http://localhost:8080/axis2/services/HelloService");
		options.setTo(targetEPR);

		Object[] entryArgs = new Object[] { 4, 2 };
		//命名空间:wsdl:definitions标签targetNamespace属性
		QName opName = new QName("http://services.test.ws.com", "add");

		//有返回值
		Object result = serviceClient.invokeBlocking(opName, entryArgs,
				new Class[] { int.class })[0];
		System.out.println(result);

		opName = new QName("http://services.test.ws.com", "send");

		//无返回值
		serviceClient.invokeRobust(opName, new Object[]{"hello world!"});
		
	}

}

 (2)使用wsdl2java

使用方法:

①先配置axis2客户端环境变量

  AXIS2_HOME:D:\Program Files\axis2-1.7.1

  path追加:%AXIS2_HOME%\bin

②在项目目录下,即跟src目录同级,shift进入命令行窗口,输入如下命令:

wsdl2java -uri http://localhost:8080/axis2/services/HelloService?wsdl -p com.ws.test.stubs -s  

③进入项目F5

是不是多了一个包叫做:com.ws.test.stubs下面有给类叫做HelloServiceStub,打开看看,吓死宝宝了,好多内容,还好不用管他。

④客户端代码,直接看代码了

package com.ws.test.client;

import java.rmi.RemoteException;
import com.ws.test.stubs.HelloServiceStub;
import com.ws.test.stubs.HelloServiceStub.Add;

public class TestClient2 {

	public static void main(String[] args) throws RemoteException {
		HelloServiceStub stub = new HelloServiceStub();
		Add add = new Add();
		add.setX(1);
		add.setY(2);
		int result = stub.add(add).get_return();
		System.out.println(result);
	}
}

 宝宝用起来很舒服!

9、wsdl2java好强大,是不是可以转换任何的WebService啊?

      当然可以了,废话少说,代码如下:

①干啥?当然运行命令了

wsdl2java -uri http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl -p com.ws.test.stubs -s

②客户端测试代码

package com.ws.test.client;

import java.rmi.RemoteException;
import com.ws.test.stubs.WeatherWebServiceStub;
import com.ws.test.stubs.WeatherWebServiceStub.ArrayOfString;
import com.ws.test.stubs.WeatherWebServiceStub.GetSupportCity;

public class TestWeather {

	public static void main(String[] args) throws RemoteException {
		WeatherWebServiceStub stub = new WeatherWebServiceStub();
		GetSupportCity gsc = new GetSupportCity();
		gsc.setByProvinceName("山东");
		ArrayOfString as = stub.getSupportCity(gsc).getGetSupportCityResult();
		for (String city : as.getString()) {
			System.out.println(city);
		}
	}
}

 看控制台输出:

济南 (54823)
青岛 (54857)
淄博 (54830)
威海 (54774)
曲阜 (54918)
临沂 (54938)
烟台 (54765)
枣庄 (58024)
聊城 (54806)
济宁 (54915)
菏泽 (54906)
泰安 (54827)
日照 (54945)
东营 (54736)
德州 (54714)
滨州 (54734)
莱芜 (54828)
潍坊 (54843)

ok了,结束。

大脑再牛逼,不如写博客!

 

   

 

转载于:https://www.cnblogs.com/sdnu/p/5320077.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值