- 浏览: 60015 次
- 性别:
- 来自: 四川
最新评论
转自:http://space.itpub.net/12921506/viewspace-526472
Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。这些都将在后面的系列教程中讲解。在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用Java和C#调用这个WebService。
一、Axis2的下载和安装
读者可以从如下的网址下载Axis2的最新版本:
在本文使用了目前Axis2的最新版本1.4.1。读者可以下载如下两个zip包:
axis2-1.4.1-bin.zip
axis2-1.4.1-war.zip
其中axis2-1.4.1-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.4.1-war.zip文件用于将WebService发布到Web容器中。
将axis2-1.4.1-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>/webapps目录中(本文使用的Tomcat的版本是6.x),并启动Tomcat。
在浏览器地址栏中输入如下的URL:
如果在浏览器中显示出如图1所示的页面,则表示Axis2安装成功。
图1
二、编写和发布WebService
对于用Java实现的服务程序给人的印象就是需要进行大量的配置,不过这一点在Axis2中将被终结。在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。
下面我们来实现一个简单的POJO,代码如下:
{
publicStringgetGreeting(Stringname)
{
return"你好"+name;
}
publicintgetPrice()
{
returnnewjava.util.Random().nextInt(1000);
}
}
在SimpleService类中有两个方法,由于这两个方法都是public方法,因此,它们都将作为WebService方法被发布。
编译SimpleService类后,将SimpleService.class文件放到<Tomcat安装目录>/webapps/axis2/WEB-INF/pojo目录中(如果没有pojo目录,则建立该目录)。现在我们已经成功将SimpleService类发布成了WebService。在浏览器地址栏中输入如下的URL:
http://localhost:8080/axis2/services/listServices
这时当前页面将显示所有在Axis2中发布的WebService,如图2所示。
图2
在浏览器地址栏中输入如下的两个URL来分别测试getGreeting和getPrice方法:
http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill
http://localhost:8080/axis2/services/SimpleService/getPrice
图3和图4分别显示了getGreeting和getPrice方法的测试结果。
图3 getGreeting方法的测试结果
图4 getPrice方法的测试结果
在编写、发布和测试0配置的WebService时应注意如下几点:
1.POJO类不能使用package关键字声明包。
2.Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。如果想取消Axis2的热发布功能,可以打开<Tomcat安装目录>/webapps/axis2/WEB-INF/conf/axis2.xml,找到如下的配置代码:
将true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新,也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。在axis2.xml文件中找到<parameter name="hotupdate">false</parameter>,将false改为true即可。
3.在浏览器中测试WebService时,如果WebService方法有参数,需要使用URL的请求参数来指定该WebService方法参数的值,请求参数名与方法参数名要一致,例如,要测试getGreeting方法,请求参数名应为name,如上面的URL所示。
4.发布WebService的pojo目录只是默认的,如果读者想在其他的目录发布WebService,可以打开axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:
上面的配置允许在<Tomcat安装目录>/webapps/axis2/WEB-INF/my目录中发布WebService。例如,将本例中的SimpleService.class复制到my目录中也可以成功发布(但要删除pojo目录中的SimpleService.class,否则WebService会重名)。
三、 用Java实现调用WebService的客户端程序
WebService是为程序服务的,只在浏览器中访问WebService是没有意义的。因此,在本节使用Java实现了一个控制台程序来调用上一节发布的WebService。调用WebService的客户端代码如下:
importjavax.xml.namespace.QName;
importorg.apache.axis2.addressing.EndpointReference;
importorg.apache.axis2.client.Options;
importorg.apache.axis2.rpc.client.RPCServiceClient;
publicclassRPCClient
{
publicstaticvoidmain(String[]args)throwsException
{
//使用RPC方式调用WebService
RPCServiceClientserviceClient=newRPCServiceClient();
Optionsoptions=serviceClient.getOptions();
//指定调用WebService的URL
EndpointReferencetargetEPR=newEndpointReference(
"http://localhost:8080/axis2/services/SimpleService");
options.setTo(targetEPR);
//指定getGreeting方法的参数值
Object[]opAddEntryArgs=newObject[]{"超人"};
//指定getGreeting方法返回值的数据类型的Class对象
Class[]classes=newClass[]{String.class};
//指定要调用的getGreeting方法及WSDL文件的命名空间
QNameopAddEntry=newQName("http://ws.apache.org/axis2","getGreeting");
//调用getGreeting方法并输出该方法的返回值
System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0]);
//下面是调用getPrice方法的代码,这些代码与调用getGreeting方法的代码类似
classes=newClass[]{int.class};
opAddEntry=newQName("http://ws.apache.org/axis2","getPrice");
System.out.println(serviceClient.invokeBlocking(opAddEntry,newObject[]{},classes)[0]);
}
}
运行上面的程序后,将在控制台输出如下的信息:
443
在编写客户端代码时应注意如下几点:
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属性值,下面是SimpleService类生成的WSDL文件的代码片段:
<wsdl:definitionsxmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:ns1="http://org.apache.axis2/xsd"
xmlns:ns="http://ws.apache.org/axis2"xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
targetNamespace="http://ws.apache.org/axis2">
<wsdl:types>
</wsdl:types>
</wsdl:definitions>
四、用wsdl2java简化客户端的编写
也许有很多读者会说“有没有搞错啊,只调用两个WebService方法用要写这么多代码,太麻烦了”。
不过幸好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/SimpleService?wsdl -p client -s -o stub
其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,读者就会发现在当前目录下多了个stub目录,在."stub"src"client目录可以找到一个SimpleServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类,代码如下:
importjavax.xml.namespace.QName;
importorg.apache.axis2.addressing.EndpointReference;
importorg.apache.axis2.client.Options;
importorg.apache.axis2.rpc.client.RPCServiceClient;
publicclassStubClient
{
publicstaticvoidmain(String[]args)throwsException
{
SimpleServiceStubstub=newSimpleServiceStub();
SimpleServiceStub.GetGreetinggg=newSimpleServiceStub.GetGreeting();
gg.setName("比尔");
System.out.println(stub.getGreeting(gg).get_return());
System.out.println(stub.getPrice().get_return());
}
}
上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名为方法名,例如,getGreeting方法的参数都封装在了GetGreeting类中,要想调用getGreeting方法,必须先创建GetGreeting类的对象实例。
五、使用C#调用WebService
从理论上说,WebService可以被任何支持SOAP协议的语言调用。在Visual Studio中使用C#调用WebService是在所有语言中最容易实现的(VB.net的调用方法类似,也同样很简单)。
新建一个Visual Studio工程,并在引用Web服务的对话框中输入如下的URL,并输入Web引用名为“WebService”:
http://localhost:8080/axis2/services/SimpleService?wsdl
然后引用Web服务的对话框就会显示该WebService中的所有的方法,如图5所示。
图5
在完成上面的工作后,只需要如下三行C#代码就可以调用getGreeting和getPrice方法,并显示这两个方法的返回值:
MessageBox.Show(simpleService.getGreeting("比尔"));
MessageBox.Show(simpleService.getPrice().@return.ToString());
在.net解析WSDL文件时直接将getGreeting方法的参数映射为String类型,因此,可以直接进行传值。
从上面的调用过程可以看出,添加Web引用的过程就相当于在Java中调用wsdl2java.bat自动生成stub类的过程。只是在调用stub类时与C#有一定的区别,但从总体上来说,都大大简化了调用WebService的过程。
发表评论
-
struts2 中获取 web资源的方式
2016-01-08 17:02 471在struts2中获取 web资源的方式大致可分为获取扩展 ... -
sql server、db2、oracle 存储过程动态sql语句示例
2015-01-31 19:00 1791Oracle CREATE OR REPLACE PRO ... -
ie9 中出现不明的异常(参数是必选项 (Argument not optional)、尚未实现)等
2015-01-27 23:57 1271<script type="text/jav ... -
SAXParseException: The content of element type "configuration" must match
2014-09-15 23:57 1925在mybatis的配置文件中新增加<databaseI ... -
java.lang.ClassNotFoundException: Cannot find class: DB_VENDOR
2014-09-15 23:45 1928在mybatis 中使用databaseIdProvide ... -
spring mvc3 + fastjson 转换 REST 参数以及输出
2014-03-27 00:16 4191spring 3可以支持Rest风格参数,其内置了jack ... -
eclipse中编辑log4j 的xml配置文件时,自动提示
2014-03-27 00:05 842方法1. 配置log4j.dtd文件: Windows - ... -
java json 转换之 Jackson 框架
2013-08-01 21:50 1109转自:http://www.cnblogs.com/hooj ... -
eclipse/myeclise 自定义注释中的变量名称
2013-07-01 23:18 938eclipse/myeclipse中自带了 ... -
Eclipse Class Decompiler——Java反编译插件
2012-11-08 22:41 1204Eclipse Class Decompiler,整 ... -
struts+spring+hibernate整合问题解决方法 陆续更新中....
2009-01-01 10:33 842在整合ssh过程中出现的问题和解决方法: 一、 严重: Ser ... -
DWR通过Annotation与spring整合
2009-01-21 22:05 635DWR 2.0 增加了一个很有趣的新特性,Annotat ... -
div嵌套页面 div加载页面 (其中获取目标页面的内容是用dwr框架连接java程序做的)
2009-03-15 16:58 627前段时间因为有需要,要在div中加载一个页面。但是以前没做过, ... -
tapestry autocomplete 更改样式及定位
2009-07-09 19:02 680版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ... -
Java中的main()方法详解
2009-07-12 16:23 608源文作者:leizhimin 源文链接:http:/ ... -
tapestry5 集成 spring 的事务管理
2009-07-22 15:43 557说明:使用的是tapestry5.1.0.5 和spring ... -
tapestry5 布局 参数的处理
2009-07-23 17:24 374<?xml version="1.0" ... -
tapestry不支持 等html特殊符号的解决方法
2009-07-23 17:34 479在使用tapestry时,偶然发现使用 &a ... -
WebService大讲堂之Axis2(2):复合类型数据的传递
2009-07-28 15:25 472转自:http://space.itpub.net/12921 ... -
WebService大讲堂之Axis2(3):使用services.xml文件发布WebService
2009-07-28 15:28 476转自:http://space.itpub.net/12921 ...
相关推荐
WebService大讲堂之Axis2(1):用POJO实现0配置的WebService ......................................................... 2 一、Axis2的下载和安装 ...............................................................
webservice1 pojo实现0配置
axis2建webservice文档 WebService大讲堂之Axis2(1):用POJO实现0配置的等
Axis2各种方式(pojo、axiom、adb、xmlbeans、jibx)实现WebService,包括客户端和服务器端
1):用POJO实现0配置的WebService 2):复合类型数据的传递 3):使用services.xml文件发布WebService 4):二进制文件传输 5):会话(Session)管理 6):跨服务会话(Session)管理 7):将Spring的装配JavaBean发布成 8...
用POJO实现0配置的WebService 2. 复合类型数据的传递 3. 使用services.xml文件发布WebService 4. 二进制文件传输 5. 会话(Session)管理 6. 跨服务会话(Session)管理 7. 将Spring的装配JavaBean发布成...
NULL 博文链接:https://jackyin5918.iteye.com/blog/1908210
文档1 pojo实现0配置 文档2 符合数据类型 文档3 使用services.xml发布webservice 文档4 二进制文件读取 文档5 会话管理 文档6 跨越session管理 文档7 spring的bean发布为webservice 文档8 异步调用webservice...
AXIS2中自带了一个通过POJO发布为WebService 的例子。这种方式发布的WebService并不需要我们生成WSDL,而直接从Bean生成WebService(自底向上模式)。典型的问题就是,如果我们直接用AXIS2中的源代码通过ant生成arr...
它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,这种处理方式不仅充分发挥了POJO的作用,简化了Java应用转化为Web服务的步骤和过程,也直接降低了SOA的实现难度,为企业转向...
1. 用POJO实现0配置的WebService 2. 复合类型数据的传递 3. 使用services.xml文件发布WebService 4. 二进制文件传输 5. 会话(Session)管理 6. 跨服务会话(Session)管理 7. 将Spring的装配JavaBean发布成...
WebService从零到项目开发使用2——技术研究 源代码
3.1.1. 0配置POJO的Webservice 10 3.1.2. 用axis2的辅助工具发布、调用WebService 12 3.1.3. WebService会话Session的管理 24 3.1.4. 用Spring创建的JavaBean发布成WebService 29 3.1.5. 异步调用WebService 32 4. ...
总结网上的接口技术开发 webservice Axis配(用pojo零配置)置以及详细文档
简单易懂的axis2示例,包含了文档、开发的ant脚本。结合这eclipse插件最好了
1 支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等; 2 使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现; 3 容易上手,可以方便快速地从pojo发布服务; 4 支持...