说来奇怪,昨夜调了很久没成功,今天上来第一次就成功了。
这次的实验是为了获得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课程或者想了解这方面的内容的人来说,我希望通过这个能够帮助你掌握一些客户端的制作技术。
在工具盛行的今天,做个服务端已经是一项再简单不过的事情了,而客户端要相对麻烦一些。
这篇就是一个入门级的复杂对象客户端的制作过程。我也是刚刚开始学习这方面的知识,所以如果我有什么错误欢迎您来指出,我也很乐意与你讨论这些问题,希望大家都能一点一点的进步。