首先我們來(lái)談一下為什么需要學(xué)習(xí)webService這樣的一個(gè)技術(shù)吧.... 問(wèn)題一如果我們的網(wǎng)站需要提供一個(gè)天氣預(yù)報(bào)這樣一個(gè)需求的話,那我們?cè)撛趺醋??????/p> 天氣預(yù)報(bào)這么一個(gè)功能并不是簡(jiǎn)單的JS組件就能夠?qū)崿F(xiàn)的,它的數(shù)據(jù)是依賴(lài)數(shù)據(jù)庫(kù)分析出來(lái)的,甚至需要衛(wèi)星探測(cè)..我們個(gè)人建站是不可能搞這么一個(gè)數(shù)據(jù)庫(kù)的吧。 那么既然我們自己干不了,我們可以去找別人嗎???我們從搜索引擎搜索,可以發(fā)現(xiàn)很多提供天氣預(yù)報(bào)的網(wǎng)站,但是它返回的是一個(gè)網(wǎng)頁(yè),而我們僅僅需要的是對(duì)應(yīng)的數(shù)據(jù)! 我們可能就在想,我們能不能僅僅只要它返回的數(shù)據(jù),而并不是經(jīng)過(guò)加工處理后返回的網(wǎng)頁(yè)呢?? 于是乎,webService就誕生了,webservice就是一個(gè)部署在Web服務(wù)器上的,它向外界暴露出一個(gè)能夠通過(guò)Web進(jìn)行調(diào)用的API。也就是說(shuō):當(dāng)我們想要獲取天氣預(yù)報(bào)的信息,我們可以調(diào)用別人寫(xiě)好的service服務(wù),我們調(diào)用就能夠得到結(jié)果了! 問(wèn)題二可是我們寫(xiě)網(wǎng)站主流的就有好幾個(gè)平臺(tái):Java、.net、PHP等等,那么部署在Web服務(wù)器上的服務(wù)器也就是webserice怎么能夠就讓我們不同的平臺(tái)都能夠調(diào)用呢?? 我們知道java、.net這樣的平臺(tái)他們語(yǔ)言的基本數(shù)據(jù)類(lèi)型、復(fù)雜數(shù)據(jù)類(lèi)型就可能不一樣,那么怎么能夠?qū)崿F(xiàn)調(diào)用的呢??? 來(lái)引用一段話
無(wú)論是Java、.net、PHP等等的平臺(tái),只要是網(wǎng)頁(yè)開(kāi)發(fā)都是可以通過(guò)http協(xié)議來(lái)進(jìn)行通信的,并且返回的數(shù)據(jù)要是通用的話,那么我們?cè)缇蛯W(xué)過(guò)這樣的一種技術(shù)【XML】 所以webservice實(shí)際上就是http XML 對(duì)webservice的理解WebService,顧名思義就是基于Web的服務(wù)。它使用Web(HTTP)方式,接收和響應(yīng)外部系統(tǒng)的某種請(qǐng)求。從而實(shí)現(xiàn)遠(yuǎn)程調(diào)用. 我們可以調(diào)用互聯(lián)網(wǎng)上查詢(xún)天氣信息Web服務(wù),然后將它嵌入到我們的程序(C/S或B/S程序)當(dāng)中來(lái),當(dāng)用戶(hù)從我們的網(wǎng)點(diǎn)看到天氣信息時(shí),他會(huì)認(rèn)為我們?yōu)樗峁┝撕芏嗟男畔⒎?wù),但其實(shí)我們什么也沒(méi)有做,只是簡(jiǎn)單調(diào)用了一下服務(wù)器上的一段代碼而已。 學(xué)習(xí)WebService可以將你的服務(wù)(一段代碼)發(fā)布到互聯(lián)網(wǎng)上讓別人去調(diào)用,也可以調(diào)用別人機(jī)器上發(fā)布的WebService,就像使用自己的代碼一樣.。 回顧Socket我們?cè)趯W(xué)習(xí)Java基礎(chǔ)網(wǎng)絡(luò)編程章節(jié)已經(jīng)知道了Scoket這么一個(gè)連接了。 Socket服務(wù)端public class SocketSer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(6666); boolean flag = true; while (flag) { //接收客戶(hù)端的請(qǐng)求 System.out.println('監(jiān)聽(tīng)客戶(hù)端的數(shù)據(jù):'); Socket sc = ss.accept(); InputStream is = sc.getInputStream(); byte[] buffer = new byte[1024]; int len = -1; len = is.read(buffer); String getData = new String(buffer, 0, len); System.out.println('從客戶(hù)端獲取的數(shù)據(jù):' getData); //業(yè)務(wù)處理 大小寫(xiě)轉(zhuǎn)化 String outPutData = getData.toUpperCase(); //向客戶(hù)端寫(xiě)數(shù)據(jù) OutputStream os = sc.getOutputStream(); os.write(outPutData.getBytes('UTF-8')); //釋放資源 os.close(); is.close(); sc.close(); } ss.close(); }} Socket客服端public class SocketClient { public static void main(String[] args) throws Exception { //獲取用戶(hù)輸入的數(shù)據(jù) Scanner input = new Scanner(System.in); System.out.println('請(qǐng)輸入數(shù)據(jù):'); String inputData = input.nextLine(); //開(kāi)啟一個(gè)Socket端口 Socket sc = new Socket('127.0.0.1', 6666); OutputStream os = sc.getOutputStream(); os.write(inputData.getBytes()); //獲取服務(wù)端回傳的數(shù)據(jù) InputStream is = sc.getInputStream(); byte[] buffer = new byte[1024]; int len = -1; len = is.read(buffer); String getData = new String(buffer, 0, len); System.out.println('從服務(wù)端獲取的數(shù)據(jù):' getData); //是否流 is.close(); os.close(); sc.close(); }} 當(dāng)我們從客戶(hù)端輸入數(shù)據(jù)以后,那么服務(wù)端就會(huì)把數(shù)據(jù)轉(zhuǎn)成是大寫(xiě) 其實(shí)HTTP協(xié)議就是基于Socket對(duì)其進(jìn)行封裝,我們也可以在IE瀏覽器中對(duì)其進(jìn)行訪問(wèn).我們一樣能夠獲取得到數(shù)據(jù)! Scoket與HTTP簡(jiǎn)述ISO的七層模型 : 物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、表示層、會(huì)話層、應(yīng)用層
問(wèn)題:
webService相關(guān)術(shù)語(yǔ)
快速入門(mén)首先,我們來(lái)嘗試一下調(diào)用別人寫(xiě)好的webService,來(lái)體驗(yàn)一把:我們?cè)L問(wèn) 進(jìn)入到里邊 當(dāng)我們輸入一個(gè)號(hào)碼,它就能夠查詢(xún)出我們的手機(jī)位置信息: 我們現(xiàn)在要做的就是將這個(gè)服務(wù)讓我們自己寫(xiě)的應(yīng)用程序中也可以調(diào)用,那怎么做呢??? http-get方式訪問(wèn)webservicepublic void get(String mobileCode ,String userID ) throws Exception{ URL url=new URL('http://ws./WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=' mobileCode '&userID=' userID); HttpURLConnection conn=(HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod('GET'); if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ //結(jié)果碼=200 InputStream is=conn.getInputStream(); //內(nèi)存流 , ByteArrayOutputStream boas=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int len=-1; while((len=is.read(buffer))!=-1){ boas.write(buffer, 0, len); } System.out.println('GET請(qǐng)求獲取的數(shù)據(jù):' boas.toString()); boas.close(); is.close(); } } Http-Client 框架POST請(qǐng)求為什么要使用HttpClient工具:
HttpClient使用步驟如下:
//2.Post請(qǐng)求 :通過(guò)Http-Client 框架來(lái)模擬實(shí)現(xiàn) Http請(qǐng)求 public void post(String mobileCode ,String userID) throws Exception{/**HttpClient訪問(wèn)網(wǎng)絡(luò)的實(shí)現(xiàn)步驟: * 1. 準(zhǔn)備一個(gè)請(qǐng)求客戶(hù)端:瀏覽器 * 2. 準(zhǔn)備請(qǐng)求方式: GET 、POST * 3. 設(shè)置要傳遞的參數(shù) * 4.執(zhí)行請(qǐng)求 * 5. 獲取結(jié)果 */ HttpClient client=new HttpClient(); PostMethod postMethod=new PostMethod('http://ws./WebServices/MobileCodeWS.asmx/getMobileCodeInfo'); //3.設(shè)置請(qǐng)求參數(shù) postMethod.setParameter('mobileCode', mobileCode); postMethod.setParameter('userID', userID); //4.執(zhí)行請(qǐng)求 ,結(jié)果碼 int code=client.executeMethod(postMethod); //5. 獲取結(jié)果 String result=postMethod.getResponseBodyAsString(); System.out.println('Post請(qǐng)求的結(jié)果:' result); } //2.Post請(qǐng)求 :通過(guò)Http-Client 框架來(lái)模擬實(shí)現(xiàn) Http請(qǐng)求 public void soap() throws Exception{ HttpClient client=new HttpClient(); PostMethod postMethod=new PostMethod('http://ws./WebServices/MobileCodeWS.asmx'); //3.設(shè)置請(qǐng)求參數(shù) postMethod.setRequestBody(new FileInputStream('c:/soap.xml')); //修改請(qǐng)求的頭部 postMethod.setRequestHeader('Content-Type', 'text/xml; charset=utf-8'); //4.執(zhí)行請(qǐng)求 ,結(jié)果碼 int code=client.executeMethod(postMethod); System.out.println('結(jié)果碼:' code); //5. 獲取結(jié)果 String result=postMethod.getResponseBodyAsString(); System.out.println('Post請(qǐng)求的結(jié)果:' result); } wsimport上面我們使用的是GET方式或者使用Http-Client框架來(lái)調(diào)用webservice的服務(wù),其實(shí)這兩種方式也有弊端
如果我們可以把整個(gè)對(duì)象傳遞進(jìn)去,返回的結(jié)果更加友好的話,就好像我們平常調(diào)用Java類(lèi)一樣使用webservice就好咯! Java也提供了類(lèi)似的方法,把webservice服務(wù)搞成是Java類(lèi)讓我們自己調(diào)用,既然是Java類(lèi)的話,那么我們使用起來(lái)就非常方便了! 把webservice服務(wù)搞成是Java類(lèi)讓我們自己調(diào)用其實(shí)就是Java幫我們生成本地代理,再通過(guò)本地代理來(lái)訪問(wèn)webservice 快速入門(mén)wsimport是Java自帶的一個(gè)命令,我們想要使用該命令,就必須配置環(huán)境變量,并且jdk的版本最好是1.7或以上 值得注意的是:ide帶的JDK版本要和wsimport生成本地的版本一致,不然就用不了!??!
wsimport命令后面跟著的是WSDL的url路徑 語(yǔ)法 wsimport [opations] <wsdl_uri> - wsdl_uri:wsdl 的統(tǒng)一資源標(biāo)識(shí)符- d :指定要輸出的文件的位置- s :表示要解析java的源碼 ,默認(rèn)解析出的是class字節(jié)碼 - p : 指定輸出的包名 首先我們先把cmd的路徑退到桌面上: 然后對(duì)WSDL文件生成本地代理 該本地代理其實(shí)就是一堆的字節(jié)碼文件 將得到的字節(jié)碼文件打包成jar,那么我們只要在項(xiàng)目中導(dǎo)入jar包,就可以調(diào)用了! 語(yǔ)法 jar cvf test.jar【jar包的名稱(chēng)】 打包目錄 本來(lái)我是想將本地代理的class文件生成jar包,然后導(dǎo)入到idea環(huán)境下,那么直接調(diào)用就行了。可是idea老是報(bào)出找不到對(duì)應(yīng)的類(lèi),找了半天也找不到,很煩呀?。。。∥铱紤]了以下的幾種情況
最后我還是沒(méi)有找到辦法,如果知道是什么原因的,麻煩在評(píng)論中告訴我吧....因此這次的測(cè)試import,我就不僅僅生成class字節(jié)碼文件,還生成了.java文件。我就直接使用java文件來(lái)測(cè)試了。 在zhongfucheng目錄下生成本地代理,把java源碼也帶上 于是我就把java源碼復(fù)制到我的項(xiàng)目中,用java源碼來(lái)進(jìn)行測(cè)試 解析WSDL有的同學(xué)可能會(huì)疑問(wèn),為啥wsimport能那么厲害,將 值得注意的是,本地代理僅僅是有其方法,類(lèi),并不能解析出具體的實(shí)現(xiàn)的。具體的操作其實(shí)還是webservice去完成的。代理這么一個(gè)概念就更加清晰了。 自定義webservice服務(wù)我們?cè)谏弦徽鹿?jié)中已經(jīng)使用wsimport生成本地代理來(lái)調(diào)用webservice的服務(wù)了,其實(shí)我們自己寫(xiě)的web應(yīng)用程序也是可以發(fā)布webservice的 我們發(fā)布了webservice的話,那么其他人也是可以調(diào)用我們自己寫(xiě)的webservice! 那么我們?cè)趺醋远xwebservice然后發(fā)布出去呢??? 在jdk 1.6 版本以后 ,通過(guò)jax-ws 包提供對(duì)webservice的支持
快速入門(mén)寫(xiě)一個(gè)實(shí)體: public class Phone { private String name;//操作系統(tǒng)名 private String owner;//擁有者 private int total;//市場(chǎng)占有率 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; }} 發(fā)布service,通過(guò)注解來(lái)讓W(xué)SDL文件更加可讀... package cn.it.ws.d;import cn.it.ws.model.Phone;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.xml.ws.Endpoint;/**手機(jī)的業(yè)務(wù)類(lèi),該業(yè)務(wù)類(lèi)通過(guò)webservice 對(duì)外提供服務(wù) * 1. 聲明: @webservice * 2. 發(fā)布 EndPoint */@WebService (serviceName='PhoneManager',//修改服務(wù)名 targetNamespace='http://dd.ws.') //修改命名空間 ,默認(rèn)包名,取反//聲明該業(yè)務(wù)類(lèi) 對(duì)外提供webservice服務(wù) ,默認(rèn)只是對(duì)public 修飾的方法對(duì)外以webservice形式發(fā)布public class PhoneService {/**@WebMethod(operationName='getMObileInfo'): 修改方法名 * @WebResult(name='phone'):修改返回參數(shù)名 * @WebParam(name='osName'):修改輸入?yún)?shù)名 */ @WebMethod(operationName='getMObileInfo') public @WebResult(name='phone') Phone getPhoneInfo(@WebParam(name='osName')String osName){ Phone phone=new Phone(); if(osName.endsWith('android')){ phone.setName('android');phone.setOwner('google');phone.setTotal(80); }else if(osName.endsWith('ios')){ phone.setName('ios');phone.setOwner('apple');phone.setTotal(15); }else{ phone.setName('windows phone');phone.setOwner('microsoft');phone.setTotal(5); } return phone; } @WebMethod(exclude=true)//把該方法排除在外 public void sayHello(String city){ System.out.println('你好:' city); } private void sayLuck(String city){ System.out.println('好友:' city); } void sayGoodBye(String city){ System.out.println('拜拜:' city); } protected void saySayalala(String city){ System.out.println('再見(jiàn)!' city); } public static void main(String[] args) { String address1='http://127.0.0.1:8888/ws/phoneService';// String address2='http://127.0.0.1:8888/ws/phoneManager';/** * 發(fā)布webservice服務(wù) * 1.address:服務(wù)的地址 * 2:implementor 服務(wù)的實(shí)現(xiàn)對(duì)象 */ Endpoint.publish(address1, new PhoneService());// Endpoint.publish(address2, new PhoneService()); System.out.println('wsdl地址 :' address1 '?WSDL'); }}
protected、private、final、static方法不能對(duì)外公開(kāi) @WebService // 添加了此注解,代表是一個(gè)WebServicepublic class HelloWorld { // 非 static final private 方法默認(rèn)會(huì)發(fā)布 public String sayHi(String name) { return 'hello' name; } @WebMethod(exclude=true) public void exclude(){ // 被注解排除的方法 } protected void protected1(){ //受保護(hù)的方法默認(rèn)不發(fā)布 } private void private1(){ // 私有方法默認(rèn)不發(fā)布 } public static void static1(){ // static 方法默認(rèn)不發(fā)布 } public final void final1(){ // final 方法默認(rèn)不發(fā)布 }} 生成的webservice能夠在瀏覽器訪問(wèn) SOAP協(xié)議目前WebService的協(xié)議主要有SOAP1.1和1.2。
主要看命名空間。
SOA、UDDI概念SOASoa(Service-Oriented Architecture) :面向服務(wù)的架構(gòu),它是一種思想,IBM大力倡導(dǎo)是即插即用的,IBM大力提倡,希望以組裝電腦的方式來(lái)開(kāi)發(fā)應(yīng)用 組成:
uddiuddi (Universal Description, Discovery and Integration)統(tǒng)一描述、發(fā)現(xiàn)、集成
實(shí)現(xiàn)接口的webservice服務(wù)端import javax.jws.WebService;/**面向接口的webservice發(fā)布方式 * * */@WebServicepublic interface JobService { public String getJob();} import javax.jws.WebService;@WebService(endpointInterface='cn.it.ws.e.JobService')//設(shè)置服務(wù)端點(diǎn)接口 ,指定對(duì)外提供服務(wù)的接口public class JobServiceImpl implements JobService { @Override public String getJob() { return 'JEE研發(fā)工程師|Android研發(fā)工程師|數(shù)據(jù)庫(kù)工程師|前端工程師|測(cè)試工程師|運(yùn)維工程師'; } public void say(){ System.out.println('早上好!'); }} 客戶(hù)端import javax.xml.ws.Endpoint;public class Test { public static void main(String[] args) { JobService jobService=new JobServiceImpl(); String address='http://192.168.114.10:9999/ws/jobservice'; Endpoint.publish(address, jobService); System.out.println('wsdl地址:' address '?WSDL'); }} CXF框架
CXF介紹 :soa的框架
CXF特點(diǎn)
CXF開(kāi)發(fā)要想使用CXF框架,那么就先導(dǎo)入jar包
接口 import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService;@WebService(serviceName='languageManager')public interface LanguageService { public @WebResult(name='language')String getLanguage(@WebParam(name='position')int position);} 實(shí)現(xiàn): package cn.it.ws.cxf.a;import org.apache.cxf.frontend.ServerFactoryBean;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;/**開(kāi)發(fā)語(yǔ)言排行描述服務(wù) * * * @author 李俊 2015年5月17日 */public class LanguageServiceImpl implements LanguageService { /* (non-Javadoc) * @see cn.it.ws.cxf.a.LanguageService#getLanguage(int) */ @Override public String getLanguage(int position){ String language=null; switch (position) { case 1: language='java'; break; case 2: language='C'; break; case 3: language='Objective-C'; break; case 4: language='C#'; break; default: break; } return language; } /**通過(guò)cxf框架發(fā)布webservice * 1. ServerFactoryBean * - 不設(shè)置注解也可以發(fā)布webservice服務(wù), 不支持注解 * - 不支持?jǐn)r截器的添加 * 2. JaxWsServerFactoryBean * - 支持注解 * - 可以添加攔截器 * 3. webservice 訪問(wèn)流程: * 1. 檢測(cè)本地代理描述的wsdl是否與服務(wù)端的wsdl一致 ,俗稱(chēng)為握手 * 2. 通過(guò)soap協(xié)議實(shí)現(xiàn)通信 ,采用的是post請(qǐng)求 , 數(shù)據(jù)封裝在滿(mǎn)足soap規(guī)約的xml中 * 3. 返回?cái)?shù)據(jù) 同樣采用的是soap通信, 數(shù)據(jù)封裝在滿(mǎn)足soap規(guī)約的xml中 * @param args public static void main(String[] args) { LanguageService languageService=new LanguageServiceImpl(); ServerFactoryBean bean=new ServerFactoryBean(); //Endpoint :地址 , 實(shí)現(xiàn)對(duì)象 bean.setAddress('http://192.168.114.10:9999/ws/cxf/languangeService'); bean.setServiceClass(LanguageService.class);//對(duì)外提供webservcie的業(yè)務(wù)類(lèi)或者接口 bean.setServiceBean(languageService);//服務(wù)的實(shí)現(xiàn)bean bean.create();//創(chuàng)建,發(fā)布webservice System.out.println('wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL'); } */ public static void main(String[] args) { LanguageService languageService=new LanguageServiceImpl(); JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean(); //Endpoint :地址 , 實(shí)現(xiàn)對(duì)象 bean.setAddress('http://192.168.114.10:9999/ws/cxf/languangeService'); bean.setServiceClass(LanguageService.class);//對(duì)外提供webservcie的業(yè)務(wù)類(lèi)或者接口 bean.setServiceBean(languageService);//服務(wù)的實(shí)現(xiàn)bean //添加輸入攔截器 :輸入顯示日志信息的攔截器 bean.getInInterceptors().add(new LoggingInInterceptor()); //添加輸出攔截器 :輸出顯示日志信息的攔截器 bean.getOutInterceptors().add(new LoggingOutInterceptor()); bean.create();//創(chuàng)建,發(fā)布webservice System.out.println('wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL'); }} CXF與Spring集成
web.xml配置文件: <?xml version='1.0' encoding='UTF-8'?><web-app xmlns:xsi='http://www./2001/XMLSchema-instance' xmlns='http://java./xml/ns/javaee' xsi:schemaLocation='http://java./xml/ns/javaee http://java./xml/ns/javaee/web-app_3_0.xsd' version='3.0'> <display-name>CXF_Server</display-name> <!-- 添加 CXF 的Servlet ,處理 webservice的請(qǐng)求 --> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> <!-- Spring 監(jiān)聽(tīng)添加 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param></web-app> 實(shí)體: public class Employee { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }} 接口: package cn.it.ws.cxf.b;import java.util.List;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import cn.it.ws.cxf.bean.Employee;@WebService(serviceName='EmployeeService')public interface EmployeeManager { void add(@WebParam(name='employee')Employee employee); @WebResult(name='employees')List<Employee> query();} 接口實(shí)現(xiàn): package cn.it.ws.cxf.b;import java.util.ArrayList;import java.util.List;import cn.it.ws.cxf.bean.Employee;/**員工管理的業(yè)務(wù)實(shí)現(xiàn)類(lèi) * @author 李俊 2015年5月17日 */public class EmployeeManagerImpl implements EmployeeManager { private List<Employee> employees=new ArrayList<>(); @Override public void add(Employee employee){ //添加到集合中 employees.add(employee); } @Override public List<Employee> query(){ return employees; }} Spring配置信息: <?xml version='1.0' encoding='UTF-8'?><beans xmlns='http://www./schema/beans' xmlns:xsi='http://www./2001/XMLSchema-instance' xmlns:p='http://www./schema/p' xmlns:jaxws='http://cxf./jaxws' xsi:schemaLocation='http://www./schema/beans http://www./schema/beans/spring-beans-3.1.xsd http://cxf./jaxws http://cxf./schemas/jaxws.xsd'> <bean id='employeeManagerImpl' class='cn.it.ws.cxf.b.EmployeeManagerImpl'></bean> <!-- 配置cxf 地址: http://192.168.114.10:8080/CXF_Server/ws/employeeManager 組成 : http://192.168.114.10:8080 CXF_Server( 項(xiàng)目名) ws(過(guò)濾的路徑) /employeeManager(自定義部分) 服務(wù)類(lèi) : 服務(wù)的實(shí)現(xiàn)類(lèi): 攔截器 --> <jaxws:server address='/employeeManager' serviceClass='cn.it.ws.cxf.b.EmployeeManager'> <jaxws:serviceBean> <ref bean='employeeManagerImpl'/> </jaxws:serviceBean> <!-- 配置輸入顯示日志信息的攔截器 --> <jaxws:inInterceptors> <bean class='org.apache.cxf.interceptor.LoggingInInterceptor'></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class='org.apache.cxf.interceptor.LoggingOutInterceptor'></bean> </jaxws:outInterceptors> </jaxws:server></beans> IDEA下使用webservice我們的Intellij idea是一個(gè)非常好用的java ide,當(dāng)然了,它也支持webservice開(kāi)發(fā)。非常好用...由于在網(wǎng)上見(jiàn)到的教程非常多,我就貼幾個(gè)我認(rèn)為比較好的教程: http://www./article/986.html http://blog.csdn.net/u010323023/article/details/52926051 http://blog.csdn.net/dreamfly88/article/details/52350370 獲取天氣預(yù)報(bào)我們現(xiàn)在webservice就基本入門(mén)了,現(xiàn)在我想要做的就是自己寫(xiě)的網(wǎng)站能夠拿到天氣預(yù)報(bào)的信息,于是我去 這個(gè)是天氣預(yù)報(bào)的WSDL地址: 如果不想得到所有的信息,那么我們可以在服務(wù)上找到我們想要對(duì)應(yīng)的數(shù)據(jù),也就是說(shuō): 總結(jié)
轉(zhuǎn)自: |
|
來(lái)自: Fengsq501u81r4 > 《計(jì)算機(jī)》