版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、hoojo授之以魚,不如授之以漁!希望能給廣大IT朋友帶來一些幫助IT達人 自由I T職業(yè) _hoojo http:/ / 506637315 2011-3-1539CXF WebService 技術(shù)指南CXF WebService上次介紹了 Axis的WebService,現(xiàn)在我們來看看 CXF是怎么完成WebService的。Axisl WebService 在線博文:Axis2 WebService 在線博文:亠、準備工作1、CXF官方網(wǎng)址:/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內(nèi)置Jetty應用服務器CXF入門實例又一 HelloWorld示例,老套的 HelloWorld是入門經(jīng)典。也是基礎(chǔ)和必須掌握的,下面看看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)注解,將會出現(xiàn)異常:com.su n.xml.i nter nal.ws.model.Ru ntimeModelerEx
8、ceptio n: run timemodeler error還有就是如果jdk版本在1.6下,也會出現(xiàn)上面的異常。 解決辦法有:1先用apt命令將主程序進行編譯,然后生成一些java文件2升級JDK到版本jdk1.6u17 或以后2、發(fā)布 HelloWorldService,代碼如下:packagecom.hoo.service.deploy;importimportjavax.xml.ws.E ndpoi nt;com.hoo.service.HelloWorldService;* <b> function:</b> 發(fā)布 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> 發(fā)布 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/ 發(fā)布 WebService deployService (); System.o
11、ut .println("server ready ");Thread. sleep (1000 * 60);System.out .println("server exiting");/休眠60秒后就退岀System. exit (0);運行上面的main函數(shù)后,如果沒有發(fā)現(xiàn)異常?;拘畔⑹沁@樣的: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 內(nèi)容了。3、定制客戶端調(diào)用 WebService的接口,這個接口中的方法簽名和參數(shù)信息可以從wsdl中的內(nèi)容看到,代碼如下:package com.hoo.service;import javax.jws.WebParam;import javax.jws.WebService;/* <b> function:</b> 客戶端調(diào)用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、編寫客戶端調(diào)用 WebSer
15、vice代碼packagecom.hoo.clie nt;import org.apache.cxf.jaxws.JaxWsProxyFactoryBea n;import com.hoo.service.lHelloWorldService;/* <b> function:</b> CXF WebService客戶端調(diào)用代碼* 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) / 調(diào)用 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" );運行上面的程序后,結(jié)果如下: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的提供代碼的內(nèi)聚Interceptor很類似,提供它的主要作用就是為了很好的降低代碼的耦合性, 性。下面我們就看看 CXF的Interceptor是怎么樣工作的。1、我們就用上面的 HelloWorldServi
19、ce,客戶端的調(diào)用代碼重新寫一份,代碼如下: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客戶端調(diào)用代碼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) / 調(diào)用 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的攔截器是添加在客戶端,同樣在服務器端也是可以添加攔截器 的。運行后結(jié)果如下:"result"+ service.sayHello("hoojo");In terceptor歡迎轉(zhuǎn)載請保留原文作者信息不得未經(jīng)作者允許用于商業(yè)用途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、,分別在請求和響應的時候輸出日 志信息,還有輸出請求的時候參數(shù)的信息以及響應的時候返回值的信息。2、剛才是客戶端添加Interceptor,現(xiàn)在我們自己編寫一個Interceptor,這個Interceptor需要繼承 AbstractPhaseInterceptor,實現(xiàn) handleMessage和一個帶參數(shù)的構(gòu)造函數(shù)。然后 在服務器端添加這個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> /至少要一個帶參的構(gòu)造函數(shù)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();下面看看發(fā)布服務和添加自定義攔截器的代碼: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>在服務器發(fā)布自定義的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/ 發(fā)布 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 ");值得說的是,以前發(fā)布 WebService是用Endpoint的push方法。這里用的是 JaxWsServerFactoryBean 和客戶端調(diào)用的代碼JaxWsProxyFactoryBean 有點不同??蛻舳苏{(diào)用代碼:packagecom.hoo.clie nt;importimportorg.apache.cxf.jaxws.JaxWsProxyFactoryBea n;com.hoo.service.lHelloWorldService;* <b> function:</b>
36、; CXF WebService客戶端調(diào)用代碼* 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) / 調(diào)用 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、;四、傳遞復雜類型對象前面介紹的都是傳遞簡單的字符串,現(xiàn)在開始介紹傳遞復雜類型的對象。如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直接傳遞集合對象會出現(xiàn)異常,用一個對象包裝下就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、發(fā)布 WebService的代碼package com.hoo.service.deploy;import com.hoo.service.ComplexUserService;/* email ho
52、ojo* <b> function:</b> 發(fā)布 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《基因突變和基因重組》教學設計1
- 課題申報參考:競合供應鏈企業(yè)社會責任審計、運營與融資策略研究
- 課題申報參考:檢察公益訴訟立法研究
- 2025年上半年水產(chǎn)漁業(yè)生產(chǎn)情況總結(jié)及下半年工作安排(三篇)
- 二零二五版房地產(chǎn)土地使用權(quán)交易爭議解決協(xié)議3篇
- 影視劇臨時演員聘用協(xié)議2025版2篇
- 2025年度個人與派遣公司教育培訓派遣合同范本4篇
- 二零二五年鍋爐維修安全風險評估與處理協(xié)議3篇
- 二零二五版新材料產(chǎn)業(yè)臨時用工聘用管理協(xié)議3篇
- 2025年香港公司股權(quán)轉(zhuǎn)讓手續(xù)糾紛解決合同3篇
- 慈溪高一期末數(shù)學試卷
- 天津市武清區(qū)2024-2025學年八年級(上)期末物理試卷(含解析)
- 《徐霞客傳正版》課件
- 江西硅博化工有限公司年產(chǎn)5000噸硅樹脂項目環(huán)境影響評價
- 高端民用航空復材智能制造交付中心項目環(huán)評資料環(huán)境影響
- 量子醫(yī)學成像學行業(yè)研究報告
- DB22T 3268-2021 糧食收儲企業(yè)安全生產(chǎn)標準化評定規(guī)范
- 辦事居間協(xié)議合同范例
- 正念減壓療法詳解課件
- 學校校本課程《英文電影鑒賞》文本
- 華為HCSA-Presales-IT售前認證備考試題及答案
評論
0/150
提交評論