[web service]axis2免部署实现web service

一、Axis2的下载和安装

1.可从http://ws.apache.org/axis2/
下载Axis2的最新版本:
      可以下载如下两个zip包:
      axis2-1.5.4-bin.zip
     
axis2-1.5.4-war.zip
      其中 axis2-1.5.4-bin.zip文件中包含了Axis2中所有的jar文件,

axis2-1.5.4-war.zip文件用于将WebService发布到Web容器中。

2.将axis2-1.5.4-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中,
    
并启动Tomcat,在浏览器地址栏中输入如下的URL:
     http://localhost:8080/axis2/,如看到axis2的主页面则安装成功。

  二、编写和发布WebService

(1)用POJO形式发布(无需配置)

在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。
  
 其中POJO中所有的public方法将被发布成WebService方法。
    示例代码如下:

Java代码  

  1. public class HelloService {
  2. public String sayHello(){
  3. return "hello";
  4. }
  5. public String sayHelloToPerson(String name){
  6. if(name==null){
  7. name = "nobody";
  8. }
  9. return "hello,"+name;
  10. }
  11. }
public class HelloService {
	public String sayHello(){
		return "hello";
	}
	public String sayHelloToPerson(String name){
		if(name==null){
			name = "nobody";
		}
		return "hello,"+name;
	}
}

编译HelloService类后,将HelloService.class文件放到<Tomcat安装目录>\webapps\axis2\WEB-INF\pojo目录中
  (如果没有pojo目录,则建立该目录)。现在我们已经成功将HelloService类发布成了WebService。
  在浏览器地址栏中输入如下的URL:
    
http://localhost:8080/axis2/services/listServices

在浏览器地址栏中输入如下的两个URL来分别测试sayHelloToPerson和sayHello方法:
   
1.http://localhost:8080/axis2/services/HelloService/sayHello
   
2.http://localhost:8080/axis2/services/HelloService/sayHelloToPerson?name=bill

页面显示如下结果:

Xml代码  

  1. <ns:sayHelloToPersonResponse xmlns:ns="http://ws.apache.org/axis2">
  2. <return>hello,bill</return>
  3. </ns:sayHelloToPersonResponse>
 <ns:sayHelloToPersonResponse xmlns:ns="http://ws.apache.org/axis2">
  	<return>hello,bill</return>
 </ns:sayHelloToPersonResponse>

在编写、发布和测试WebService时应注意如下几点:
     1.
POJO类不能使用package关键字声明包。

2.
Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,
       
Tomcat不需要重新启动就可以自动发布WebService。
       
如果想取消Axis2的热发布功能,可以打开<Tomcat安装目录>\webapps\axis2\WEB-INF\conf\axis2.xml,
       
找到如下的配置代码:

Xml代码  

  1. <parameter name="hotdeployment">true</parameter>
<parameter name="hotdeployment">true</parameter>

将true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新.
  也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。
  这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。
  在axis2.xml文件中找到

Xml代码  

  1. <parameter name="hotupdate">false</parameter>
<parameter name="hotupdate">false</parameter>

将false改为true即可。

3.
在浏览器中测试WebService时,如果WebService方法有参数,需要使用URL的请求参数来指定该WebService方法
    
参数的值,请求参数名与方法参数名要一致,例如,要测试sayHelloToPerson方法,请求参数名应为name,如上面的URL所示。

4. 发布WebService的pojo目录只是默认的,如果读者想在其他的目录发布WebService,
    
可以打开axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:

Xml代码  

  1. <deployer extension=".class" directory="my" class="org.apache.axis2.deployment.POJODeployer"/>
 <deployer extension=".class" directory="my" class="org.apache.axis2.deployment.POJODeployer"/>

上面的配置允许在<Tomcat安装目录>\webapps\axis2\WEB-INF\my目录中发布WebService。
 
 例如,将本例中的HelloService.class复制到my目录中也可以成功发布
  
(但要删除pojo目录中的SimpleService.class,否则WebService会重名)。

(2)使用services.xml配置文件发布

用Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web
Service,
  这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便.
  为此,Axis2也允许将带包的POJO类发布成Web
Service。先实现一个POJO类,代码如下:

Java代码  

  1. package com.sinosoft.webservice;
  2. public class HelloServiceNew {
  3. public String sayHelloNew(){
  4. return "hello";
  5. }
  6. public String sayHelloToPersonNew(String name){
  7. if(name==null){
  8. name = "nobody";
  9. }
  10. return "hello,"+name;
  11. }
  12. public void updateData(String data){
  13. System.out.println(data+" 已更新。");
  14. }
  15. }
package com.sinosoft.webservice;
public class HelloServiceNew {
	public String sayHelloNew(){
		return "hello";
	}
	public String sayHelloToPersonNew(String name){
		if(name==null){
			name = "nobody";
		}
		return "hello,"+name;
	}
	public void updateData(String data){
		System.out.println(data+" 已更新。");
	}
}

要想将HelloServiceNew类发布成Web Service,需要一个services.xml文件,
  
这个文件需要放在META-INF目录中,该文件的内容如下:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <service name="HelloServiceNew">
  3. <description>
  4. Web Service例子
  5. </description>
  6. <parameter name="ServiceClass">
  7. com.sinosoft.webservice.HelloServiceNew
  8. </parameter>
  9. <messageReceivers>
  10. <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
  11. class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  12. <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
  13. class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
  14. </messageReceivers>
  15. </service>
<?xml version="1.0" encoding="UTF-8"?>
<service name="HelloServiceNew">
    <description>
        Web Service例子
    </description>
    <parameter name="ServiceClass">
        com.sinosoft.webservice.HelloServiceNew
    </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>元素用于发布Web
Service,一个<service>元素只能发布一个WebService类,
  name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:
  http://localhost:8080/axis2/services/HelloServiceNew?wsdl
  其中name属性名就是上面URL中"?"和"/"之间的部分。
  <description>元素表示当前Web
Service的描述,<parameter>元素用于设置WebService的参数,
  在这里用于设置WebService对应的类名。
  在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。
  例如,sayHelloNew方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,
  而updateData方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。
  
  使用这种方式发布WebService,必须打包成.aar文件,.aar文件实际上就是改变了扩展名的.jar文件。
  现在建立了两个文件:HelloServiceNew.java和services.xml。
  将HelloServiceNew.java编译,生成HelloServiceNew.class。
  services.xml和HelloServiceNew.class文件的位置如下:
  D:\ws\
com\sinosoft\webservice\HelloServiceNew.class
  D:\ws\META-INF\services.xml
  在windows控制台中进入ws目录,并输入如下的命令生成.aar文件.

jar cvf ws.aar
.

实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使用.aar文件发布webservice.
  最后将ws.aar文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\services目录中,
  启动Tomcat后,就可以调用这个WebService了。

另外services.xml文件中也可以直接指定WebService类的方法,如可以用下面的配置代码来发布WebService

Xml代码  

  1. <service name=" HelloServiceNew ">
  2. <description>
  3. Web Service例子
  4. </description>
  5. <parameter name="ServiceClass">
  6. com.sinosoft.webservice.HelloServiceNew
  7. </parameter>
  8. <operation name="sayHello">
  9. <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
  10. </operation>
  11. <operation name="updateData">
  12. <messageReceiver
  13. class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
  14. </operation>
  15. </service>
<service name=" HelloServiceNew ">
<description>
    Web Service例子
</description>
<parameter name="ServiceClass">
    com.sinosoft.webservice.HelloServiceNew
</parameter>
<operation name="sayHello">
    <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</operation>
<operation name="updateData">
    <messageReceiver
        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
    </operation>
</service>

如果想发布多个WebService,可以使用<serviceGroup>元素

Xml代码  

  1. <serviceGroup>
  2. <service name="myService1">
  3. ...
  4. </service>
  5. <service name="myService2">
  6. ...
  7. </service>
  8. </serviceGroup>
<serviceGroup>
<service name="myService1">
	...
</service>
<service name="myService2">
	...
</service>
</serviceGroup>

中间省略的代码同上面services.xml文件的配置。

三、 用Java实现调用WebService的客户端程序

WebService是为程序服务的,只在浏览器中访问WebService是没有意义的。调用WebService的客户端代码如下:

Java代码  

  1. import javax.xml.namespace.QName;
  2. import org.apache.axis2.AxisFault;
  3. import org.apache.axis2.addressing.EndpointReference;
  4. import org.apache.axis2.client.Options;
  5. import org.apache.axis2.rpc.client.RPCServiceClient;
  6. public class TestMain {
  7. public static void main(String args[]) throws AxisFault{
  8. //  使用RPC方式调用WebService
  9. RPCServiceClient serviceClient = new RPCServiceClient();
  10. Options options = serviceClient.getOptions();
  11. //  指定调用WebService的URL
  12. EndpointReference targetEPR = new EndpointReference(
  13. "http://localhost:8080/axis2/services/HelloService");
  14. options.setTo(targetEPR);
  15. //  指定sayHelloToPerson方法的参数值
  16. Object[] opAddEntryArgs = new Object[] {"美女"};
  17. //  指定sayHelloToPerson方法返回值的数据类型的Class对象
  18. Class[] classes = new Class[] {String.class};
  19. //  指定要调用的sayHelloToPerson方法及WSDL文件的命名空间
  20. QName opAddEntry = new QName("http://ws.apache.org/axis2", "sayHelloToPerson");
  21. //  调用sayHelloToPerson方法并输出该方法的返回值
  22. System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
  23. }
  24. }
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 TestMain {
public static void main(String args[]) throws AxisFault{
   //  使用RPC方式调用WebService
    RPCServiceClient serviceClient = new RPCServiceClient();
    Options options = serviceClient.getOptions();
    //  指定调用WebService的URL
    EndpointReference targetEPR = new EndpointReference(
            "http://localhost:8080/axis2/services/HelloService");
    options.setTo(targetEPR);
    //  指定sayHelloToPerson方法的参数值
    Object[] opAddEntryArgs = new Object[] {"美女"};
    //  指定sayHelloToPerson方法返回值的数据类型的Class对象
    Class[] classes = new Class[] {String.class};
    //  指定要调用的sayHelloToPerson方法及WSDL文件的命名空间
    QName opAddEntry = new QName("http://ws.apache.org/axis2", "sayHelloToPerson");
    //  调用sayHelloToPerson方法并输出该方法的返回值
    System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
}
}

输出结果为:
   hello,美女

  在编写客户端代码时应注意如下几点:

1. 客户端代码需要引用很多Axis2的jar包,如果读者不太清楚要引用哪个jar包,
       
可以在Eclipse的工程中引用Axis2发行包的lib目录中的所有jar包。

2.
在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。
      
invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;
      
第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
      
第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。
      
当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。

3.
如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,
       
该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

4. 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
    
 也就是<wsdl:definitions>元素的targetNamespace属性值。

  四、用wsdl2java简化客户端的编写

Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。
  wsdl2java.bat命令可以在<Axis2安装目录>/bin目录中找到。
  在使用wsdl2java.bat命令之前需要设置AXIS2_HOME环境变量,该变量值是<Axis2安装目录>。
  在Windows控制台输出如下的命令行来生成调用WebService的代码:
  %AXIS2_HOME%\bin\wsdl2java
-uri http://localhost:8080/axis2/services/HelloService?wsdl

-p client -s -o
stub
  其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。
  -p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。
  在执行完上面的命令后,就会发现在当前目录下多了个stub目录,
  在stub/src/client目录可以找到一个HelloServiceStub.java文件,
  该文件复杂调用WebService,可以在程序中直接使用这个类,代码如下:

Java代码  

  1. package client;
  2. public class StupTest {
  3. public static void main(String[] args) throws Exception
  4. {
  5. HelloServiceStub stub = new HelloServiceStub();
  6. HelloServiceStub.SayHelloToPerson gg = new HelloServiceStub.SayHelloToPerson();
  7. gg.setName("美女");
  8. System.out.println( stub.sayHello().get_return());
  9. System.out.println(stub.sayHelloToPerson(gg).get_return());
  10. }
  11. }
package client;
public class StupTest {
	public static void main(String[] args) throws Exception
    {
        HelloServiceStub stub = new HelloServiceStub();
        HelloServiceStub.SayHelloToPerson gg = new HelloServiceStub.SayHelloToPerson();
        gg.setName("美女");
        System.out.println( stub.sayHello().get_return());
        System.out.println(stub.sayHelloToPerson(gg).get_return());
    }
}

输出结果如下:
  hello
  hello,美女

上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。
  但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,
  类名为方法名,例如,sayHelloToPerson方法的参数都封装在了SayHelloToPerson类中,
  要想调用sayHelloToPerson方法,必须先创建SayHelloToPerson类的对象实例。

时间: 2024-11-10 17:31:59

[web service]axis2免部署实现web service的相关文章

[web service]axis2+eclipse+tomcat开发web service

首先需要下载相应的安装包. jsdk1.5 :自己网上搜搜有的是. tomcat:http://tomcat.apache.org/download-60.cgi 下载tomcat 6.0 zip文件. eclipse :下载http://www.eclipse.org/downloads/  Eclipse IDE For java EE developers axis2:http://axis.apache.org/axis2/java/core/download.cgi 下载Binary

在Azure Cloud Service中部署Java Web App(1)

Microsoft Azure是一个开放的,灵活的云平台,除了对自家的.Net平台有良好的支持外,对于各种开源的软件,语言,工具,框架都有着良好的支持,比如Java,Php,Python等等,你可以使用自己喜欢的语言开发任何应用部署在Azure的web site或者云服务中. Azure的云服务是Azure的一个PAAS平台,同样支持多种不同的语言和框架,并且可以基于多种不同的阈值如CPU负载,队列,定时等等实现Auto scaling等高级功能,如下图所示: 本文简单介绍如何使用Azure所提

Difference between WCF and Web API and WCF REST and Web Service

The .Net framework has a number of technologies that allow you to create HTTP services such as Web Service, WCF and now Web API. There are a lot of articles over the internet which may describe to whom you should use. Now a days, you have a lot of ch

WCF 、Web API 、 WCF REST 和 Web Service 的区别

The .Net framework has a number of technologies that allow you to create HTTP services such as Web Service, WCF and now Web API. There are a lot of articles over the internet which may describe to whom you should use. Now a days, you have a lot of ch

转 Difference between WCF and Web API and WCF REST and Web Service

http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-REST-and-Web-Service.html Posted By : Shailendra Chauhan, 05 Apr 2013 Updated On : 13 Apr 2013 Total Views : 126,254 Keywords : web api vs wcf vs wcf r

WCF、Web API、WCF REST、Web Service 区别

Web Service It is based on SOAP and return data in XML form. It support only HTTP protocol. It is not open source but can be consumed by any client that understands xml. It can be hosted only on IIS. WCF It is also based on SOAP and return data in XM

CentOS6.5中部署java web环境

原来在linux中部署java web环境,没有做好总结,这次在部署的过程中,将部署的过程做了记录,希望对大家有帮助.主要内容包括CentOS安装以后的网络设置,系统自带jdk的卸载,新版本jdk的安装,tomcat的安装部署. 一 CentOS的网络设置 利用桥接模式,让CentOS连接到网络. Vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改onboot=yes 保存退出 Ifconfig命令查看网络情况 可以看到ip地址 这时就能够ping通外

Zabbix基于Proxy分布式部署实现Web监控

前言 在日常运维工作中,难免会遇到这样或那样的故障,如何能在第一时间发现故障,并及时定位故障原因,保证业务不受影响,我想这应该是做好一个运维必须要掌握的技能.但人力不可能实时掌控系统的变化,于是监控系统应运而生,监控便是运维的眼睛,把监控和性能管理做好后,运维就是一件很轻松的事情.目前比较流行的开源监控工具有Cacti.Nagios(Icinga).Zabbix等.本文带来的是Zabbix基于Proxy分布式部署实现Web监控. Zabbix 简介 Zabbix是一个基于Web界面提供分布式系统

linux系统上部署一个web项目

对于apache开源项目中tomcat的认识,大多停留在Windows下,这次我通过一个简单的实例来介绍一下在linux下如何搭建tomcat环境,并且部署一个web项目. 先从基本安装开始,可别小看linux下的文件安装,那可不是windows下点击next就可以完成,但也并不复杂,重要的是我们学会怎么用快速理解和掌握它,那么一切就变得容易多了,开始吧,当然在安装部署tomcat之前必须先安装好jdk1.6的环境,具体见上一遍博客linux下jdk的安装. 1.先从Apache的官方网站下载下