基于CXF的WebService(1、纯java代码调用实现)
admin 发布于:2011-12-29 00:36:00
阅读:loading
关于CXF的资料就不多说了,在http://cxf.apache.org/有得看,简单的看下,或者网上搜索下这个东西的介绍,总之一句话:它是一个webservice的框架,要进行webservice开发首先要配置好开发环境。
服务端(WebServiceService)
第一步:从http://cxf.apache.org/download.html下载整个apache-cxf-2.5.1.zip最新版包,下载后解压到F:盘根目录,可以看看里面的文件夹结构,详细看下图。
第二步:新见两个工程,为什么两个呢,一个是客户端一个是服务端,你觉得是几个呢,将F:\apache-cxf-2.5.1\lib目录下面的jar包拷贝到工程的WEB-INF/lib目录下面,其实学习阶段暂且将全部的jar包都拷贝进去吧,至于哪些可以不要,可以留到后面自己动手去一个一个的手动测试。
如此,项目开发环境则部署好了。
2、业务代码实现
第一步:定义业务接口,先从无参的sayHello()函数开始,该接口只有一个sayHello的函数,详细截图如下:
注意:在该interface上有一个注释,@WebService,表示该接口为远程WebService接口,除此和其他的interface无其他区别。
第二步:接口实现,实现该接口的sayHello()函数,实现的很简单,就直接一个打印输出,详细截图如下:
注意:该实现类上面添加的有@WebService注释,其中
endpointInterface:指定服务抽象WebService协议的服务端点接口的完整名称,
name:WebService的名称,
portName:WebService的端口名称,
serviceName:WebService的服务名称,
targetNamespace:如果@WebService.targetNamespace注释是关于某一个服务断点接口的,则targetNamespace用于wsdl:portType(以及关联的XML元素)的名称空间,
wsdlLocation:描述服务的预定义WSDL的位置。
3、启动服务,发布外部WebService地址(重要),此处并不须要将改工程发布到tomcat或者其他服务器中,仔细观察刚才的cxf的jar包,发现里面有好多关于jetty的jar包,这个名词也是另外一个web容器的名字和tomcat一样,如此说明cxf是内置集成了jetty的,我们只须要调用某些相关的类,创建一个虚拟模拟的服务请求来,同时生成wsdl文件,代码很简单,详细截图为:
注意:Endpoint.publish是发布一个虚拟的地址,第二个参数是实现类的实例,Endpoint还能有连续多个的服务发布,其语法格式为:
Endpoint.publish("地址一","接口1").("地址二","接口2").publlish("地址三","接口3");
以上代码由于是main函数,所以可以直接运行,如果程序运行正确,则看到如下图:
既然提示服务启动成功,那么我们是不是可以访问以下地址,看看该地址请求输出的是什么东西呢?
OK,直接复制地址,浏览器以运行结果如下:
一眼看上去,提示的信息很想出错了,确实是出错误了,但是至少证明这个地址是有效的,尽管输入的xml有错误,原因是我们在输入的地址后面加上?wsdl这么一个字符串,就能够访问成功,输出正确的信息,详细截图如下:
至此,服务端的代码已经完成,接下来我们开始写客户端代码。
先来了解客户端须要做哪些工作,1、调用webservice接口,直接一点,是要调用到接口的实现类的sayHello函数中的代码 。
1、根据上面的wsdl文件,生成客户端调用的java代码
第一步:先配置JAVA_HOME和CXF_HOME,这两项必须有,为什么呢?因为F:\apache-cxf-2.5.1\bin\wsdl2java.bat文件中,有如下的代码:
if not defined CXF_HOME goto set_cxf_home
:cont
if not defined JAVA_HOME goto no_java_home
对于本地是否有CXF_HOME和JAVA_HOME环境变量的检查,CXF_HOME毫无疑问当然是指向F:\apache-cxf-2.5.1,再添加Path项,添加
%CXF_HOME%\bin; 这部分,环境变量设置完以后,在cmd命令窗口执行 set 命令可以查看到很多的环境变量。
第二步:调用批处理生成客户端代码,上述所有的wsdl2java.bat文件,就是我们要执行的命令,生成代码的命令可以参考为:
wsdl2java -p com.webservice.hello -d f:\ws_src /hello?wsdl ,简单解释下命令:-p表示文件创建成功后,的java文件中类所在的包路径,指package,d是文件存放的路径,指drectory目录,最后就是webservice的wsdl文件的访问路径,当然也可以是 \\..\\hello.wsdl,这里还有很多参数,就省略了,自己也没搞清楚,在以后的过程中,慢慢实践。
@ 2014-01-14 添加生成的文件编码格式
说明: -p :包名
-d: 源码的生成路径
-encoding: 编码格式 我们大部分人使用的都是UTF-8的编码,这里最好设置一下,不然中文就会变乱码
-client:表示只生成webservice的客户端调用代码 (注:此参数尤为重要,一般生成的文件默认为GBK编码,而eclipse中使用UTF-8编码,导致生成出的文件编码方式为GBK,与eclipse里面的工程代码UTF-8冲突,导致文件编码类型不对应引起的中文注释乱码问题)
最后的就是wsdl文件的路径了
第三步:找到f:\ws_src文件夹,拷贝其中的com文件夹,往客户端工程中拷贝,会将整个文件拷贝至相应的包中,但是此时有一个java文件会有错误,原因大致上位3个构造方法重载那里有问题,不过没关系,我们可以把这个类删除,因为这个类是告诉我们调用的相关代码。
第四步:编写客户端调用代码,比较简单,就直接贴出代码:
客户端调用成功后控制台有相应的输出,之后该控制台会自动切换到服务端的控制台上,原因是你成功的调用了前台的webservice 的sayHello函数,所以服务端的控制台会获得焦点,截图为:
说明:控制台上得hello,world正是我们服务端的Hello接口的实现所输出的,至此服务端发布WebService接口,客户端已经成功的调用,以上的代码实现没有一行关于xml的配置,换句话说,这其实也可是 Java Project工程,而非Web Project工程。
附图:
WebServiceServer的eclipse工程截图
WebServiceClient 的eclipse工程截图
附加:
注:发现上面代码调用有问题,于是还是下面这种方式靠谱
JaxWsProxyFactoryBean b = new JaxWsProxyFactoryBean();
b.setAddress(path);
b.setServiceClass(SBFIBMSInquiryAvailableResourcesSrv.class);
b.create();
//调用函数
点赞