[转载]使用 Axis2 和 JiBX 将 Java 类转换成 Web 服务,第 2 部分: 把 XML 转换成功能全面的 Web 服务...

使用 Axis2 和 JiBX 将 Java 类转换成 Web 服务,第 2 部分: 把 XML 转换成功能全面的 Web 服务

[@more@]

2007 年 5 月 10 日

XML 功能强大,使用它能够定义任何事物。更重要的是,它是使大多数应用程序具有外部可读格式的基础,对于本系列文章所使用的 Axis2 和 JiBX 尤为显著。随着 Web 服务的日益普及,使用 Axis2 和 JiBX 将原来的 Java® 项目转换成功能全面的 Web服务也显得格外紧迫。以往,Web 服务都是根据一个服务和一个单一的类自动生成的,而现在开发人员可以通过已有项目中的各种 Java 类生成一个或多个服务。本文(本系列文章的第 2 部分)使用 Axis2 和 JiBX 将 XML 转换成已有 Java 类提供的功能全面的 Web 服务。

简介

Apache Axis2 提供了好几种 XML 解决方案,可以轻松的开发功能强大的 Web 服务。Axis2 是实现 Web 服务的一个非常不错的选择。由于 Apache Axis2 和 Apache Geronimo duo 是免费而且开放源码的,因此可以考虑使用这两者。

c.gif
本系列的其它部分

在本系列的前一部分中,我向您介绍了在本系列两篇文章中使用到的 Java 类(参见 参考资料)。 我们通过 WSDL 将这些类作为 Web 服务公开,然后创建了一个 JiBX 定义描述,该定义描述将在文本中与 JiBX 数据绑定通信,来测试 Web 服务。在测试过程中,我们通过编译 JiBX 绑定类来创建包装类,使数据绑定类成为整个 Web 服务中的一个功能部分。

在 继续深入开发之前,先要确保 /lib 中的所有的 JAR 文件(包括您在本系列文章第一部分中拷贝的 JiBX 文件)都在您的类路径下,并且在本文整个过程中要一直存在。同时,还需确保您的系统中已安装 Ant。Ant 可以从 Apache 下载获得(参见 参考资料)。

让我们开始生成服务吧。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


生成服务

首先,需要使用 Axis2 生成服务,这样您就可以使用稍后创建的客户机来对它进行测试。在上篇文章开始之前,您应该已下载好必要的工具,并且设置好 AXIS2_HOME 环境变量。要开始创建服务,键入清单 1 中的命令。


清单 1. 创建服务
                
java org.apache.axis2.wsdl.WSDL2Java
-uri C:appswebappsIBM-JiBXSimpleService.wsdl
-p com.ibm.devWorks.xml.simpleService -d jibx -s -ss -sd -ssi
-Ebindingfile ../binding.xml

这将为您创建最基本的服务!下列部分显示了各命令开关的注解:

  • -uri 开关告诉 Axis2 在哪能找到用于生成服务的 WSDL 文件。
  • -p 开关告诉 Axis2 服务要使用的 Java 包类。
  • -d jibx 选项指定 JiBX 数据绑定。
  • -s 开关指定只有同步(块)方法可用。
  • -ss 开关告诉 Axis2 要构建服务器端代码。
  • -sd 开关告诉 Axis2 要构建一个服务描述符(services.xml 文件)。
  • -ssi 开关是可选的,用于为服务实现 ( SimpleServiceSkeleton.java ) 创建一个 Java 接口。
  • -Ebinding 开关告诉 Axis2 在哪能找到 JiBX 定义说明文件。

现在已经有了一个 Web 服务,但是还没有任何定义。下一部分 将对服务进行定义。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


定义服务主干

只 要成功调用了 Web 服务的一项操作,便会调用服务主干中的方法。Web 服务操作的实现代码包含在一个叫做 SimpleServiceSkeleton.java 的文件中(在本例中)。该文件位于 src/com/ibm/devWorks/xml/simpleService 目录,并且是空文件。对它进行定义,如清单 2 所示。


清单 2. 定义服务主干
                
package com.ibm.devWorks.xml.simpleService;

public class SimpleServiceSkeleton implements SimpleServiceSkeletonInterface{

public void OneWay
(
com.ibm.devWorks.xml.simpleService.OneWayRequest OneWayRequest
)
{
System.err.println("Request data: " +
OneWayRequest.getRequestData());
}

public com.ibm.devWorks.xml.simpleService.TwoWayResponse TwoWay
(
com.ibm.devWorks.xml.simpleService.TwoWayRequest TwoWayRequest
)
{
System.err.println("Echo String : " +
TwoWayRequest.getEchoString());
System.err.println("Booolean : " +
TwoWayRequest.getBooolean());

TwoWayResponse res = new TwoWayResponse();

res.setEchoString(TwoWayRequest.getEchoString());
res.setInvertedBoolean(!TwoWayRequest.getBooolean());

return res;
}
}

清单 2 中的代码含有两个方法,分别对应于本系列第一篇文章中讨论的两个操作(请参见 参考资料)。第一个方法,OneWay,是单向(或者只输入)操作,它使用 OneWayRequest Java 对象作为输入参数,并且没有返回值。其实现仅仅是在屏幕上显示从客户机发送过来的内容。

第二个方法, TwoWay,使用 TwoWayRequest Java 对象作为输入,并且返回 TwoWayResponse 响应。这个方法首先显示传入请求对象的 echoStringbooolean 字段,把响应中的 echoString 设置为请求中的 echoString 字段值,并把响应对象中的 invertedBoolean 值设置为请求对象中的 booolean 值的相反值(真则设为假,假则设为真)。然后把响应对象返回给客户机。

服务已经定义好了。接下来,我们将构建服务并创建 JiBX 数据绑定包装类。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


完成 JiBX 数据绑定

在编译和创建 JiBX 数据绑定包装类之前,我们必须首先编译各类。要编译项目,键入:ant

此时切换到 build/classes 目录创建包装类,键入:java -jar libjibx-bind.jar ......inding.xml

您会发现四个新的 JiBX_* 类文件。包装类已经创建完成。现在重新打包 Axis2 服务存档文件,键入(与之前相同的目录):ant

请注意,您不必构建代码两次。此处通过 Ant 可以知道代码已构建好,但是看到还有新文件,因此需要重新打包 Axis2 存档文件。

服务已经就绪,下节将在 Geronimo 上部署服务。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


在 Geronimo 上部署

现在我们将部署刚刚创建和编译好的服务。如果 Geronimo 还未运行,应启动它,键入: java -jar /bin/server.jar

现 在将服务存档文件 build/lib/SimpleService.aar 拷贝到 /repository/default/axis2/1166439304031/axis2-1166439304031.war/WEB-INF/services 目录(需注意,准确的目录将有所不同)。

服务将很快自动部署好,现在一切已就绪,下节将创建一个客户机对其进行测试。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


生成客户机

客户机允许您测试 Web 服务的功能和部署的正确性。同样,我们将使用 JiBX 数据绑定创建一个客户机,用于测试已部署好的 Web 服务。

键入清单 3 中的命令,生成 Web 服务。


清单 3. 生成 Web 服务
                
java org.apache.axis2.wsdl.WSDL2Java
-uri C:appswebappsIBM-JiBXSimpleService.wsdl
-p com.ibm.devWorks.xml.simpleService
-d jibx -Ebindingfile ../binding.xml -s

上面的命令简单地创建了客户桩(client stub)代码。有关使用到的开关的解释,请参见 生成服务。接下来,我们将定义真正的客户机代码,其代码将用于测试 Web 服务。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


编写测试代码

现 在我们将编写用于测试 Web 服务已成功部署的代码,这会使用到我们刚刚使用 JiBX 数据绑定创建的客户桩。创建一个 src/com/ibm/devWorks/xml/simpleService/Client.java 文件,并对它进行定义,如清单 4 所示。


清单 4. 测试客户桩和部署的 Web 服务
                
package com.ibm.devWorks.xml.simpleService;

public class Client{
public static void main(java.lang.String args[]){
try{
SimpleServiceStub stub =
new SimpleServiceStub
("http://localhost:8080/axis2/services/SimpleService");

oneWay(stub);
twoWay(stub);
} catch(Exception e){
e.printStackTrace();
System.out.println(" ");
}
}

public static void oneWay(SimpleServiceStub stub){
try{
OneWayRequest req = new OneWayRequest();

req.setRequestData("Here is your requested data!");

stub.OneWay(req);
} catch(Exception e){
e.printStackTrace();
System.out.println(" ");
}
}

public static void twoWay(SimpleServiceStub stub){
try{
TwoWayRequest req = new TwoWayRequest();

req.setEchoString("echo!... echo!");
req.setBooolean(false);

TwoWayResponse res = stub.TwoWay(req);

System.out.println("Echo String : " +
res.getEchoString());
System.out.println("Inv Boolean : " +
res.getInvertedBoolean());
} catch(Exception e){
e.printStackTrace();
System.out.println(" ");
}
}
}

粗体显示了值得注意的代码。这个客户机首先初始化客户桩对象,然后将其传递给两个可用方法。第一个方法,oneWay,创建一个 OneWayRequest 对象,并将 requestData 字段的值初始化为 Here is your requested data!,然后数据将传送到服务器,由于是单向操作,因此没有返回。

第二个方法,twoWay,创建一个 TwoWayRequest 对象并初始化 echoStringbooolean 字段。然后把请求对象发送给服务,并返回一个 TwoWayResponse 对象。根据 清单 1 中定义的逻辑,响应对象中的 echoString 值应该匹配请求对象中 echoString 的值,并且响应对象中的invertedBoolean 应该与请求对象中的 booolean 的字段值相反,或者为真(在本例中)。

我们已经完成了客户机定义。现在我们只需编译 JiBX 绑定包装类,与前面构建服务中的编译一样。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


完成 JiBX 数据绑定

在为客户机编译和创建 JiBX 数据绑定包装类之前,我们首先需要编译各类。要编译项目,键入:ant

现在切换到 build/classes 目录创建包装类,键入:java -jar libjibx-bind.jar ......inding.xml

我们应该注意到四个新创建的 JiBX_* 类文件,这与我们之前构建服务时一样。要重新打包包含客户机代码的 JAR 文件,键入(与之前相同的目录):ant

这就全部完成了!最后剩下要做的就是完成测试。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


测试

现在,运行我们刚刚定义的客户机代码,我们应该在屏幕上看到正确的输出。在运行客户机之前,必须确保含有客户机代码(build/lib/SimpleService-test-client.jar)的 JAR 文件在您的类路径下。

要运行客户机,键入如下内容: java com.ibm.devWorks.xml.simpleService.Client

我们应该能看到服务的输出,如图 1 所示。


图 1. 显示服务输出的标准输出结果
显示服务输出的标准输出结果

请注意,正确的值已发送给服务。现在我们将检验发回客户机的值是否同样正确,这可以通过查看客户机的输出来完成,如图 2 所示。


图 2. 显示客户机输出
显示客户机输出

一切都工作良好,您现在就可以施展 Jibx 魔法了!


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


结束语

c.gif
分享这篇文章……

c.gif
digg 将本文提交到 Digg
c.gif
del.icio.us 发布到 del.icio.us
c.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值