说来奇怪,昨夜调了很久没成功,今天上来第一次就成功了。

这次的实验是为了获得WS提供的一个person复杂对象其中的某一属性。

服务端提供getPerson,getPersons接口。getPerson根据PersonId提供一个Person对象。而Person包含三个属性,personid,firstname,lastname所以说这个实验的主要目的就是去实验一下非纯字符或数字操作的WS服务的客户端怎么做。

具体是这么来做的:

1、在ECLIPSE里新建一个JAVA PROJECT

 

2、在项目名称上点右键,加入add xfire nature将xfire所需要的库导入进来。关于XFIRE的ECLIPSE插件可以参看这篇文章http://xfire.codehaus.org/Eclipse+Plugin

 

3、点击新建->其他,选择xfire的eclipse插件提供的代码生成工具

 

4、填入WSDL的URL以及选择要将代码输出的项目名称

 

5、确定后就能够看到生成的代码了,生成了很多文件,这些都是根据WSDL生成的,因为服务端提供的person是个复杂对象,不是简单的一个加减操作,所以需要对复杂对象进行生成。

这里最关键的是两个文件,PersonWebServiceClient以及PersonWebServicePortType(interface)。

PersonWebServiceImpl是PersonWebServicePortType的实现。

 

6、下面这部当然就是我们自己开始写客户端了,我们写个junit的测试

先将junit库导入到项目中,右键项目名称,选择properties-->java build path-->libraries-->add library-->JUNIT导入JUNIT库,然后就能看到:

准备工作还没有完成,但是先不做了,等一会再回来做。

现在开始写case吧。

我建立了一个命叫motion.test的package,在里面加入文件WebServiceTest.java

package motion.test;

import junit.framework.TestCase;

public class WebServiceTest extends TestCase {

}

现在我们加入test:

 public void testShow(){
  
  PersonWebServiceClient service = new PersonWebServiceClient();
  PersonWebServicePortType client = service.getPersonWebServiceHttpPort();
  
  System.out.print(client.getPerson("1").getFirstName());
  
 }

这个test的目的是想打印出personid为1的那个person的firstname。

现在运行一下,如果不出意外肯定有错误

看下错误怎么说吧:

原来是有些包没导进来。

然后我们再右键点击项目,选xfire那项。

将Commons Codec 和Commons HttpClient前面的勾打上,确定返回,run WebServiceTest.java as junit test

在Console里我们就能看到这么一行:javax.xml.bind.JAXBElement@198cb3d

惊喜了一会突然发现这不是我们要的结果啊,我们是要显示那个personid为1的那个人的firstname,难道他的firstname是这种奇怪的东西吗?

其实这只是xml元素的JAXB的表示形式。如果我们需要得到具体的值,要用getValue()方法,修改刚才的显示语句如下:

System.out.print(client.getPerson("1").getFirstName().getValue());

再次run WebServiceTest.java as junit test

Console里出现:yang

这是便正确的结果。

 

这个实验其实是非常简单的,但是通过这个实验能够看出很多细节是需要去考虑的。

对于选了web service课程或者想了解这方面的内容的人来说,我希望通过这个能够帮助你掌握一些客户端的制作技术。

在工具盛行的今天,做个服务端已经是一项再简单不过的事情了,而客户端要相对麻烦一些。

这篇就是一个入门级的复杂对象客户端的制作过程。我也是刚刚开始学习这方面的知识,所以如果我有什么错误欢迎您来指出,我也很乐意与你讨论这些问题,希望大家都能一点一点的进步。