版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、hoojo授之以鱼,不如授之以渔!希望能给广大IT朋友带来一些帮助IT达人 自由I T职业 _hoojo http:/ / 506637315 2011-3-1539CXF WebService 技术指南CXF WebService上次介绍了 Axis的WebService,现在我们来看看 CXF是怎么完成WebService的。Axisl WebService 在线博文:Axis2 WebService 在线博文:亠、准备工作1、CXF官方网址:/2、Jar包下载地址:/dyn/closer.cgi?path=/
2、cxf/2.3.3/apache-cxf-2.3.3.zip将下来的jar包解压后,目录大概就这样一/茁wmai rniii r亡Hlib-sampljlicansgs 中dul电占二| samples画 口CENSE画 HOTICI目 reLea5e_notas txtbin目录提供的是常用的dos控制台命令工具docs帮助文档lib jar包、依赖库lib-samples 也是 jar 包,有 jetty、 httpclients、junit 等 jar 包modules打包好的WebService模块samples 示例 demo3、 源码下载:
3、/dyn/closer.cgi?path=/cxf/2.3.3/apache-cxf-2.3.3-src.zip有时候你可以看看源码,对你了解和学习CXF WebService都会有作用。4、CXF的特性有代码生成工具:Java to WSDL ; WSDL to Java ; XSD to WSDL ; WSDL to XML ; WSDLto SOAP ; WSDL to Service ;支持 JAX-WS、JAX-WSA、JSR-181 和 SAAJ;支持 SOAP 1.1、1.2、WS-I BasicProfile、 WS-Security、WS-Addressing、WS-RM 和
4、 WS-Policy ;支持 WSDL 1.1、2.0 ;支持 MTOM ;、JavaScript、通过 Yoko 支持 CORBA;通过 Tuscany 支持 SCA;通过 ServiceMix 支持 JBI内置Jetty应用服务器CXF入门实例又一 HelloWorld示例,老套的 HelloWorld是入门经典。也是基础和必须掌握的,下面看看HelloWorldWebService,很简单。需要的jar包如下:cjtf-2. 3. 3. j aj-*sdl4j_l 6. 2. jarIirilSehtiEi-l. 4.7. jj et ty-nt 11-7.2.2. v9010120S.
5、jaj- jettj-5irv»r-7 E.£. v20101205. jar jettj-http-7 2 2 101205. j吐j et ty-i q7. 2.2. v50101 iOS. j arium jet tcoutiruati on-T. 2. Z. v£01D1205. jar1、HelloWorldService 服务器端代码package com.hoo.service;import javax.jws.WebParam;import javax.jws.WebService;import javax.jws.soap.SOAPBi ndi
6、ng;import javax.jws.soap.SOAPBi ndi ng.Style;/* <b> function:</b> CXF WebService服务器端 helloWorld 示例* author hoojo* createDate 2011- 3- 16 上午 08:29:07* file HelloWorld.java* package com.hoo.service* project CXFWebService* blog * email hoojo_* version 1.0*/WebServiceSOAPBi ndi ng (style = S
7、tyle.RPC)public class HelloWorldService publicString sayHello(WebParam (name ="name" ) String name) returnn ame +" say: Hello World "要说明的是,上面的服务器端代码运用了JDK5的新特性Annotation,这个非常好用。需要注意的是,如果不添加SOAPBinding (style = Style.RPC)注解,将会出现异常:com.su n.xml.i nter nal.ws.model.Ru ntimeModelerEx
8、ceptio n: run timemodeler error还有就是如果jdk版本在1.6下,也会出现上面的异常。 解决办法有:1先用apt命令将主程序进行编译,然后生成一些java文件2升级JDK到版本jdk1.6u17 或以后2、发布 HelloWorldService,代码如下:packagecom.hoo.service.deploy;importimportjavax.xml.ws.E ndpoi nt;com.hoo.service.HelloWorldService;* <b> function:</b> 发布 CXF WebService* autho
9、r hoojo* createDate 2011- 3- 17 上午 09:24:33* file DeployHelloWorldService.java* package com.hoo.deploy* project CXFWebService* blog * email hoojo_* version 1.0*/public class DeployHelloWorldService * <b> function:</b> 发布 WebService* author hoojo*/public static void deployService() System
10、. out .println("Server start ");HelloWorldService service =new HelloWorldService();Stri ng address ="http:/localhost:9000/helloWorld"En dpo int.publish (address, service);public static void main( Str in gargs) throwsIn terruptedExcepti on/ 发布 WebService deployService (); System.o
11、ut .println("server ready ");Thread. sleep (1000 * 60);System.out .println("server exiting");/休眠60秒后就退岀System. exit (0);运行上面的main函数后,如果没有发现异常。基本信息是这样的:Server start 2011-3-17 10:17:25org.apache.cxf.service.factory.Reflectio nServiceFactoryBea n buildServiceFromClass信息:Creating Ser
12、vice from class com.hoo.service.HelloWorldService2011-3-17 10:17:25 org.apache.cxf.e ndpoi nt.Serverlmplin itDest in ati on信息:Setting the server's publish address to behttp:/localhost:9000/helloWorld2011-03-17 10:17:25.375:INF0:jetty-7.2.2.v201012052011-03-17 10:17:25.468:INFO:StartedSelectCha n
13、n elCo nn ectorlocalhost:9000server ready 那么你在WebBrowser中请求: http:/localhost:9000/helloWorld?wsdl 就可以看到 xml 内容了。3、定制客户端调用 WebService的接口,这个接口中的方法签名和参数信息可以从wsdl中的内容看到,代码如下:package com.hoo.service;import javax.jws.WebParam;import javax.jws.WebService;/* <b> function:</b> 客户端调用WebService所需要的
14、接口* author hoojo* createDate 2011- 3- 17 上午 09:00:00* file IHelloWorldService.java* package com.hoo.service* project CXFWebService* blog * email hoojo_* version 1.0*/WebServicepublic in terface IHelloWorldService public String sayHello(WebParam (name ="name" ) String name);4、编写客户端调用 WebSer
15、vice代码packagecom.hoo.clie nt;import org.apache.cxf.jaxws.JaxWsProxyFactoryBea n;import com.hoo.service.lHelloWorldService;/* <b> function:</b> CXF WebService客户端调用代码* author hoojo* createDate 2011-3-16 上午 09:03:49* file HelloWorldServiceClie nt.java* package com.hoo.client* project CXFWeb
16、Service* blog * email hoojo_* version 1.0*/public class HelloWorldServiceClie nt public static void main( Stri ng args) / 调用 WebServiceJaxWsProxyFactoryBea n factory =new JaxWsProxyFactoryBea n();factory.setServiceClass(IHelloWorldService.class );factory.setAddress("http:/localhost:9000/helloWo
17、rld");IHelloWorldService service = (IHelloWorldService)factory.create();System. out .println("result"+ service.sayHello("hoojo" );运行上面的程序后,结果如下:2011-3-17 10:23:34org.apache.cxf.service.factory.Reflectio nServiceFactoryBea n buildServiceFromClass信息:Creating Service from class
18、 com.hoo.service.IHelloWorldServiceresulthoojo say: Hello WorldCXF对Interceptor拦截器的支持前面在 Axis中介绍过 Axis的Handler,这里 CXF的Interceptor就和Handler的功能类似。在 每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的提供代码的内聚Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性, 性。下面我们就看看 CXF的Interceptor是怎么样工作的。1、我们就用上面的 HelloWorldServi
19、ce,客户端的调用代码重新写一份,代码如下:packagecom.hoo.clie nt;importorg.apache.cxf.i nterceptor.Logg inglnln terceptor;importimportimportorg.apache.cxf.i nterceptor.Logg in gOut In terceptor; org.apache.cxf.jaxws.JaxWsProxyFactoryBea n; org.apache.cxf.phase.Phase;importimportcom.hoo.i nterceptor.Messagel nterceptor;
20、 com.hoo.service.lHelloWorldService;/*<b> function:</b> CXF WebService客户端调用代码author hoojocreateDate 2011- 3- 16 上午 09:03:49file HelloWorldServiceClie nt.javapackage com.hoo.clientproject CXFWebServiceblog email hoojo_version 1.0*/public class ServiceMessage In terceperClie nt public stat
21、ic void main( Stri ng args) / 调用 WebServiceJaxWsProxyFactoryBea n factory = factory.setServiceClass(IHelloWorldService.new JaxWsProxyFactoryBea n();class);factory.setAddress("http:/localhost:9000/helloWorld"factory.getl nln terceptors().add(Loggi nglnln terceptor();factory.getOutl ntercept
22、ors().add(newnew);Loggi ngOutl nterceptor();IHelloWorldService service = (IHelloWorldService)factory.create();System. out .println(上面的CXF的拦截器是添加在客户端,同样在服务器端也是可以添加拦截器 的。运行后结果如下:"result"+ service.sayHello("hoojo");In terceptor欢迎转载请保留原文作者信息不得未经作者允许用于商业用途2011-3-18 7:34:00org.apache.c
23、xf.service.factory.Reflectio nServiceFactoryBea nbuildServiceFromClass信息:Creating Service from class com.hoo.service.lHelloWorldService2011-3-18 7:34:00org.apache.cxf.i nterceptor.AbstractLogg ingln terceptor log 信息:Outbound MessageID: 1Address: http:/localhost:9000/helloWorldEn cod ing: UTF-8Conten
24、 t-Type: text/xmlHeaders: SOAPActio n="", Accept=*/*Payload: <soap:E nvelopexml ns:soap="/soap/e nvelope/"><soap:Body> <n s1:sayHelloxmlns:n s1=" <n ame>hoojo</name></ns1:sayHel lo></soap:Bodyx/soap:E nvelope2011-3
25、-18 7:34:01org.apache.cxf.i nterceptor.AbstractLogg ingln terceptor log 信息:Inbound MessageID: 1Response-Code: 200En cod ing: UTF-8Conten t-Type: text/xml;charset=UTF-8Headers: con te nt-type=text/xml;charset=UTF-8,Conten t-Le ngth=230, Server=Jetty(7.2.2.v20101205)Payload: <soap:E nvelopexml ns:s
26、oap="/soap/e nvelope/"><soap:Body> <n s1:sayHelloResp onsexml ns: ns1="http: n>hoojo say: Hello World</retur n>v/n s1:sayHelloResp on se></soap:Body></soap:E nveloperesulthoojo say: Hello World上面的部分信息是 Logginglnterceptor输出的日志信息
27、,分别在请求和响应的时候输出日 志信息,还有输出请求的时候参数的信息以及响应的时候返回值的信息。2、刚才是客户端添加Interceptor,现在我们自己编写一个Interceptor,这个Interceptor需要继承 AbstractPhaseInterceptor,实现 handleMessage和一个带参数的构造函数。然后 在服务器端添加这个Interceptor。Interceptor代码如下:package com.hoo.i nterceptor;importorg.apache.cxf.i nterceptor.Fault;import org.apache.cxf.messag
28、e.Message;import org.apache.cxf.phase.AbstractPhase In terceptor;/* <b> function:</b>自定义消息拦截器* author hoojo* createDate Mar 17, 2011 8:10:49 PM* file Message In terceptor.java* package erceptor* project CXFWebService* blog * email hoojo_* version 1.0*/public class Message In t
29、erceptorexte ndsAbstractPhasel nterceptor<Message> /至少要一个带参的构造函数public Message In terceptor(Str ing phase) super (phase);public void han dleMessage(Message message)throws Fault System. out .println("#handleMessage#");System. out .println(message);if (message.getDesti nati on() !=n ul
30、l ) System. out .println(message.getld() +"#" +message.getDesti natio n( ).getMessageObserver();if (message.getExcha nge() !=n ull ) System. out .println(message.getExchange().getlnMessage()+ "#" + message.getExcha nge().getl nF aultMessage();System. out .println(message.getExcha
31、nge().getOutMessage()+ "#" +message.getExcha nge().getOutFaultMessage();下面看看发布服务和添加自定义拦截器的代码:package com.hoo.service.deploy;importorg.apache.cxf.jaxws.JaxWsServerFactoryBea n;import org.apache.cxf.phase.Phase;import com.hoo.i nterceptor.Messagel nterceptor;import com.hoo.service.HelloWorld
32、Service;/*<b> function:</b>在服务器发布自定义的Interceptorauthor hoojocreateDate 2011-3-18 上午 07:38:28file Deplo yin terceptorService.javapackage com.hoo.service.deployproject CXFWebServiceblog email hoojo_version 1.0*/public classDeplo yin terceptorService public static voidmain( Stri ngargs) thr
33、owsIn terruptedExcepti on/ 发布 WebServiceJaxWsServerFactoryBea n factory =JaxWsServerFactoryBea n();/ 设置 Service Classfactory.setServiceClass(HelloWorldService.newclass );factory.setAddress("http:/localhost:9000/helloWorld"/ 设置 ServiceBean 对象factory.setServiceBea n(new HelloWorldService();/
34、添加请求和响应的拦截器,Out有效factory.getI nIn terceptors().add(MessageInterceptor(Phase.RECEIVE );factory.getOutI nterceptors().add();Phase.RECEIVE 只对 In 有效,Phase.SEND 只对newnewMessage In terceptor(Phase.SEND);factory.create();System.out .println("Server startII);Thread.System.System.sleep (1000 * 60); exit
35、 (0);out .println("Server exit ");值得说的是,以前发布 WebService是用Endpoint的push方法。这里用的是 JaxWsServerFactoryBean 和客户端调用的代码JaxWsProxyFactoryBean 有点不同。客户端调用代码:packagecom.hoo.clie nt;importimportorg.apache.cxf.jaxws.JaxWsProxyFactoryBea n;com.hoo.service.lHelloWorldService;* <b> function:</b>
36、; CXF WebService客户端调用代码* author hoojo* createDate 2011-3-16 上午 09:03:49* file HelloWorldServiceClie nt.java* package com.hoo.client* project CXFWebService* blog * email hoojo_* version 1.0*/public classHelloWorldServiceClie nt public static void main( Stri ng args) / 调用 WebServiceJaxWsProxyFactoryBe
37、a n factory =new JaxWsProxyFactoryBea n();factory.setServiceClass(IHelloWorldService.class );factory.setAddress("http:/localhost:9000/helloWorld");IHelloWorldService service = (IHelloWorldService)factory.create();System. out .println("result"+ service.sayHello("hoojo" )
38、;四、传递复杂类型对象前面介绍的都是传递简单的字符串,现在开始介绍传递复杂类型的对象。如JavaBean Array、List、Map 等。1、首先看看服务器端的代码所需要的JavaBean对象packagecom.hoo.e ntity;importjava.io.Serializable;/*<b> function:</b> User Entity* author hoojo* createDate Dec 16, 2010 10:20:02 PM* file User.java* package com.hoo.entity* project AxisWebSe
39、rvice* blog * email hoojo_* version 1.0*/publicclassUserimpleme ntsSerializable privatestaticfinallongserialVersio nUIDprivateint idIprivateStri ngname ;privateStri ngemail ;privateStri ngaddress ;=677484458789332877L;/getter 、 setterOverridepublicStri ng toStri ng() return this . id +"#"
40、+ this . name +"#" + this . email +"#" +this . addressF面的是集合传递 Users, CXF直接传递集合对象会出现异常,用一个对象包装下就Ok了,不知道是什么原因。异常信息如下:DefaultValidatio nEven tHa ndler: ERROR: un expected eleme nt (uri:"", local:"item") org.apache.cxf.i nterceptor.Fault:Unm arshalli ngError: un
41、expectedeleme nt(uri:"",local:"item")package com.hoo.e ntity;import java.util.HashMap;import java.util.List;/* <b> function:</b> Users Entity* author hoojo* createDate 2011- 3- 18 上午 09:27:31* file Users.java* package com.hoo.entity* project CXFWebService* blog * emai
42、l hoojo_* version 1.0*/publicclassUsers privateList<User>users ;privateUseruserArr ;privateHashMapvStri ng, User>maps/getter、setter 方法2、下面看看复杂对象传递的服务器端代码packagecom.hoo.service;import import import import import import import import import importjava.util.ArrayList; java.util.Date;java.util.
43、HashMap;java.util.List; javax.jws.WebParam; javax.jws.WebService; javax.jws.soap.SOAPBi ndi ng; javax.jws.soap.SOAPBi ndi ng.Style; com.hoo.e ntity.User;com.hoo.e ntity.Users;* <b> function:</b> WebService传递复杂对象,如 JavaBean 、Array、List 、Map等* author hoojo* createDate 2011-3-18 上午 08:22:55
44、* file ComplexUserService.java* package com.hoo.service* project CXFWebService* blog * email hoojo_* version 1.0 */ WebServiceSOAPBi ndi ng (style = Style.RPC)SuppressWarnings( "deprecation")public class ComplexUserService public User getUserByName(WebParam(name ="name" ) String
45、name)User user = new User();user.setld( new Date().getSuser.setName (n ame);user.setAddress("ch ina");user.setEmail( name +"");retur nuser;public void setUser(User user) "#Server"setUser:" + user);System. out .println( setUser#");System. out .println( public U
46、sers getUsers(List<User> users =int i) new ArrayList<User>();for (int j = 0; j <= i; j+) user.setAddress("chi na");User user =new User();user.setId(new Date().getSec on ds();user.setName("jack#" + j);user.setEmail("jack" + j + "");users.add(user
47、);Users u = new Users();u.setUsers(users);return u;public void setUsers(Users users) System. out .println("#ServersetUsers#");for (User u : users.getUsers() System. out .println("setUsers:" + u);public Users getUserArray(int i) User users =new Useri;for (int j = 0; j < i; j+)
48、User user = new User();user.setId( new Date().getSec on ds();- user.setName("jack#"+ j);user.setAddress("chi na");user.setEmail( "jack"+ j +"" );usersj = user;Users u = new Users();u.setUserArr(users);return u;public void setUserArray(Users users) System. out
49、.println( "#Server setUserArray#");(User u : users.getUserArr() System. out .println( "setUserArray:"for+ u);publicvoid setUserMap(Users maps) System. out .println( setUserMap#");System. out .println("setUserMap:"“#Server+ maps.getMaps();public Users getUserMap() H
50、ashMapvStri ng, User> users =new HashMapvStri ng, User>();User user =user.setld( user.setName(new User();new Date().getSec on ds();"jack#" );user.setAddress( user.setEmail( users.put( "A""chi na#");"jack" );,user);user = new User(); user.setld( user.setN
51、ame(new Date().getSec on ds();"tom");user.setAddress( user.setEmail( users.put( "B""ch in a$");"tom" );,user);Users u = new Users();u.setMaps(users);return u;3、发布 WebService的代码package com.hoo.service.deploy;import com.hoo.service.ComplexUserService;/* email ho
52、ojo* <b> function:</b> 发布 ComplexUserService 服务* author hoojo* createDate 2011-3-18 上午 08:28:57* file DeployComplexUserService.java* package com.hoo.service.deploy* project CXFWebService* blog * email hoojo_* version 1.0*/public class DeployComplexUserService public static void main( Str
53、 in gargs) throwsIn terruptedExcepti onStri ng address ="http:/localhost:9000/complexUser"DeployUtils. deployService (address, newComplexUserService。);Thread. sleep (1000 <b> function:</b>定制客户端请求WebService所需要的接口* author hoojo* createDate 2011- 3- 18 上午 08:22:55* file ComplexUserService.java* package com.hoo.service* pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业教育信息化教学实践
- 河南省2025专利协作河南中心招聘第二批笔试笔试历年参考题库典型考点附带答案详解
- 宿迁市2025江苏宿迁市市场监督管理局局属事业单位招聘3人笔试历年参考题库典型考点附带答案详解
- 国家事业单位招聘2025中国钱币博物馆招聘拟聘用人员笔试历年参考题库典型考点附带答案详解
- 北海市2025广西北海市涠洲岛旅游区行政审批服务中心招聘1人(截止5月24日)笔试历年参考题库典型考点附带答案详解
- 纳米材料在氯化钠电化学性能中的作用
- 临海市2025年浙江临海市医疗卫生单位招聘130人笔试历年参考题库典型考点附带答案详解
- 森林康养基地生态恢复技术方案
- 给排水管网施工现场管理方案
- 给排水管网施工环境保护措施
- DB63∕T 1723-2018 石棉尾矿污染控制技术规范
- 两年(22-23)高考数学真题专题分类汇编专题十二 概率统计(教师版)
- 《公输》文言文知识ppt
- 师德师风建设实施细则
- 年产5万吨乙酸乙酯生产工艺的设计
- 信号与系统教学 第八章 通信系统
- 中国甲状腺疾病诊治指南
- GB/T 5195.11-2021萤石锰含量的测定高碘酸盐分光光度法和火焰原子吸收光谱法
- GA/T 946.2-2011道路交通管理信息采集规范第2部分:机动车登记信息采集和签注
- FZ/T 90107.4-1999圆柱形筒管变形丝用筒管的尺寸、偏差和标记
- 2023年湖南化工职业技术学院教师招聘考试笔试题库及答案解析
评论
0/150
提交评论