Axis2实现WebService实例

3 篇文章 0 订阅
3 篇文章 0 订阅
[b]Web Service是实现SOA(Service-Oriented Architecture)面向服务架构的技术,而Axis2是实现Web Service的一种技术框架(架构)。[/b]

先去apache官网上下载axis2-1.6.2-bin和axis2-1.6.2-war
下载地址:[url]http://axis.apache.org/axis2/java/core/download.cgi[/url]


配置AXIS2的环境变量
将axis2-1.6.2-bin.zip解压
在环境变量里面配置AXIS2_HOME指向你的axis路径就行了。

解压axis2-1.6.2-war并将解压出来的axis2.war解压到tomcat的webapps中

访问:http://localhost:8082/axis2/端口自己改成自己的tomcat的端口就行了,
看到Welcome!就说明成功了。

[b]WebService发布方式[/b]
我们先打开axis2\WEB-INF\conf下的axis2.xml。
有一段配置:

<parameter name="hotdeployment">true</parameter>
<parameter name="hotupdate">false</parameter>


hotdeployment 是热发布,就是不需要重新启动Tomcat就可以自动发布WebService。
但不等于更新了该webService,如果你想更新,还得重新启动Tomcat,这对于我们程序员来说,非常不方便,下面这个配置都解决了这个问题:hotupdate热更新,默认为false 改为true即可。

[b]1.无包路径的发布方式:[/b]

public class TestService {
public String getName(String name){
return name;
}
public String helloWorld(){
return "hello world!";
}
}

将TestService 编译得到.class文件后,将class文件放到webapps\axis2\WEB-INF\pojo
中去,如果pojo不存在则创建它。
这样我们就将这个Service发布上去了。
在浏览器输入:http://localhost:8082/axis2/services/listServices 见下图:

[img]http://dl2.iteye.com/upload/attachment/0086/1528/3b1d3e72-cfcc-391b-bd50-a771d6ead376.jpg[/img]

红框中则是我们发布的Webservice。
输入以下url:
http://localhost:8082/axis2/services/TestService/getName?name=xxx

<ns:getNameResponse>
<return>xxx</return>
</ns:getNameResponse>


http://localhost:8082/axis2/services/TestService/helloWorld

<ns:helloWorldResponse>
<return>hello world!</return>
</ns:helloWorldResponse>


pojo是axis2默认的目录:
  <deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>


你可以添加你想要的目录:
  <deployer extension=".class" directory="xxx" class="org.apache.axis2.deployment.POJODeployer"/>

但是这些目录中的类不要重复,不然要报错。

2.有包路径的发布方式:

显然,不带包的发布方式肯定不满足我们的需求。 为此,Axis2也允许将带包的POJO类发布成WebService,见例子:

1) 首先我们编写一个带包的POJO类:

package com.jynine.webservice;

public class AxisService {
public String sayHello(){
return "hello";
}
public String saygoodBye(String name){
return "Good Bye "+name +"!";
}
public void updateName(String name){
System.out.println("Update "+name+" !");
}

}


2) 编写一个services.xml,这个文件需要放在META-INF目录中。

<!-- axis 配置 -->
<service name="AxisService">  
<description>
Web Service例子
</description>
<parameter name="ServiceClass">
com.jynine.webservice.AxisService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
</service>


在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。
例如,sayHello方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,
而updateName方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

使用这种方式发布WebService,我们需要将这2个文件打包成.aar文件

目录结构:
- test
- META-INF
- services.xml
- com
- jynine
- webservice
- AxisService.class


在cmd中进入到test的目录,输入以下命令:
jar cvf test.aar .
[color=red]ps:注意上面命令中后面的.[/color]
最后将 test.aar文件复制到\webapps\axis2\WEB-INF\services目录中,
启动Tomcat后,就可以调用这个WebService了。
如果你有多个service的话,则需要用<serviceGroup>
<serviceGroup>
<service name="AxisService">
<description>
Web Service例子
</description>
<parameter name="ServiceClass">
com.jynine.webservice.AxisService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
</service>
<service name="SimpleAxisService">
<description>
简单的axis服务
</description>
<parameter name="ServiceClass">
com.jynine.webservice.SimpleAxisService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
</service>
</serviceGroup>


[b]客户端调用webservice[/b]

先建立一个简单的pojo类:
package com.jynine.webservice;

import java.util.HashMap;
import java.util.Map;
/**
* Axis webService 例子
* @author jynine
*
*/
public class EmployeeInfo {
private Map<String, String> map = new HashMap<String, String>();
/**
* 初始化
*/
private void initEmployee(){
map.put("1000", "Tom");
map.put("1001", "Jim");
map.put("1002", "Rose");
map.put("1004", "Jack");
}
/**
* 获取员工名称
* @param num 工号
* @return
*/
public String getEmployeeName(String num){
initEmployee();
String name = "未知";
if(map.get(num) != null){
name = map.get(num);
}
return name;
}
/**
* 更新员工信息
* @param num 工号
* @param name 员工姓名
*/
public void updateEmployee(String num,String name){
initEmployee();
map.put(num, name);
}
/**
* 删除员工信息
* @param num 工号
*/
public void deleteEmployee(String num){
initEmployee();
map.remove(num);
}
}

发布该webService并能成功调用。编写客户端代码调用:

package com.jynine.webservice;

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.axiom.om.OMNode;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

public class AxisClient {
/**
* 指定调用WebService的URL
*/
private static EndpointReference targetEPR =
new EndpointReference("http://localhost:8082/axis2/services/EmployeeInfo");
public static OMElement getNameByNum(String num){
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace namespace = fac.createOMNamespace("http://webservice.jynine.com", "tns");
OMElement method = fac.createOMElement("getEmployeeName", namespace);
OMElement value = fac.createOMElement("num", namespace);
OMNode omNode = fac.createOMText(value, num);
value.addChild(omNode);
method.addChild(value);
return method;
}
public static void main(String[] args) {
//ServiceClient
try {
OMElement getName = getNameByNum("1000");
Options options = new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMElement result = sender.sendReceive(getName);
String response = result.getFirstElement().getText();
System.out.println("员工名称为:"+response);
} catch (Exception e) {
e.printStackTrace();
}
}
}

http://localhost:8082/axis2/services/EmployeeInfo是你的Service EPR路径。
http://webservice.jynine.com这个是你访问http://localhost:8082/axis2/services/EmployeeInfo?wsdl后的那个targetNamespace。

输出结果为:
员工名称为:Tom


也可以用RPC方式调用WebService

   public static void main(String[] args) throws AxisFault {
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定调用WebService的URL
options.setTo(targetEPR);
// 指定getEmployeeName方法的参数值
Object[] opAddEntryArgs = new Object[] {"1001"};
// 指定getEmployeeName方法返回值的数据类型的Class对象
Class[] classes = new Class[] {String.class};
// 指定要调用的getEmployeeName方法及WSDL文件的命名空间
QName opAddEntry = new QName("http://webservice.jynine.com", "getEmployeeName");
// 调用getEmployeeName方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
}


[color=red]ps:当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
[/color]
输出结果为:Jim
wsdl2java
也可以根据wsdl2java来简化我们客户端
在cmd中输入
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -s -o generator

则在你的当前目录下就会生成一个generator目录,在generator\src\com\jynine\webservice中就会找到一个EmployeeInfoStub.java
我们就可以用这个类来编写客户端:

public static void main(String[] args) throws RemoteException {
EmployeeInfoStub stub = new EmployeeInfoStub();
EmployeeInfoStub.GetEmployeeName gg = new EmployeeInfoStub.GetEmployeeName();
gg.setNum("1002");
System.out.println( stub.getEmployeeName(gg).get_return());
}


输出结果为:Rose
代码是不是简单多了。
用adb生成客户端:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d adb -s -o generator

同理还有xmlbeans:
%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d xmlbeans -s -o generator

JiBX:

%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8082/axis2/services/EmployeeInfo?wsdl -p com.jynine.webservice -d jibx -s -uw -o  generator


axis2相关的包的maven配置[url]http://jynine.iteye.com/blog/1893677[/url]。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值