夢(mèng)幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評(píng)論 :: 0 Trackbacks
          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          公告

          本博客中未注原創(chuàng)的文章均為轉(zhuǎn)載,對(duì)轉(zhuǎn)載內(nèi)容可能做了些修改和增加圖片注釋,如果侵犯了您的版權(quán),或沒有注明原作者,請(qǐng)諒解

          常用鏈接

          留言簿(21)

          隨筆分類(644)

          隨筆檔案(669)

          文章檔案(6)

          最新隨筆

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          轉(zhuǎn)自http://cxshun.iteye.com/blog/1273147


          最近公司最近需要將以前提供出去的接口統(tǒng)一用一個(gè)標(biāo)準(zhǔn)來實(shí)現(xiàn),考慮到webservice這個(gè)是標(biāo) 準(zhǔn),因此我花時(shí)間大概學(xué)習(xí)了一下webservice,也對(duì)JAVA的幾個(gè)webservice框架進(jìn)行了一些小例子的學(xué)習(xí)。

          JAVA調(diào)用webservice,當(dāng)你剛開始接觸的時(shí)候你會(huì)覺得它是一個(gè)惡夢(mèng),特別是沒有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)實(shí)現(xiàn),比起.net的那些幾步就可以完成的webservice實(shí)現(xiàn),我們看著JAVA的實(shí)現(xiàn)真是傷心啊。但就算是傷心,我們也還是要完成的。JAVA也不乏比較好的實(shí)現(xiàn),如xfire,jersey,CXF。有人會(huì)說axis2,那個(gè)東西,看著就傷心,它不包括在比較好里面,比較差里面反倒有它的一席之位。怎么差,這里先不說,我們慢慢地來看看這幾個(gè)框架的實(shí)現(xiàn)。

          今天我們就先一起來看一下xfire的實(shí)現(xiàn),接下來的幾天我們會(huì)慢慢一起來學(xué)習(xí)另外的框架。

          1)首先,當(dāng)然是要下包啦,這個(gè)普通人都知道。http://xfire.codehaus.org/Download可以到這里去下,可以下all也可以下distribution。但建議還是下all的,免得一堆奇怪的問題搞得你一點(diǎn)信心都沒了。

          包弄下來了那么怎么辦呢?放進(jìn)項(xiàng)目里啊。貌似廢話,但很多人就是不知道下下來要干什么用。

          建一個(gè)新項(xiàng)目,比較我的是xfireWebservice,這里當(dāng)然是建web項(xiàng)目啦。



          我這里是把它所有的包都放到這里面了,畢竟我們寫例子,就沒必要挑三揀四了,隨便點(diǎn)吧,如果想看看異常信息的朋友可以不把全部放進(jìn)去,慢慢地加入,以后遇到錯(cuò)誤也好排除,但我們這里就不那么做了,畢竟一般缺少什么類那些的異常沒什么難看的,大家可以自己排除。

          2)我們首先來了解一下xfire與其他webservice框架的不同,它最大的不同之處在于它需要一個(gè)接口,而且如果需要用xfire來調(diào)用相應(yīng)的webservice必須知道接口的定義,感覺這里有點(diǎn)限制了。但除了這點(diǎn),xfire調(diào)用webservice,那是相當(dāng)?shù)姆奖悖透{(diào)用本地方法一樣。我們直接來看例子:

          首先是最重要的接口:

          Java代碼  收藏代碼
          1. public interface IReaderService {  
          2.     public Reader getReader(String name,String password);  
          3.     public List<Reader> getReaders();  
          4. }  

          有接口,當(dāng)然也要有實(shí)現(xiàn)類,不然接口就沒什么意義了。

          Java代碼  收藏代碼
          1. public class ReaderService implements IReaderService{  
          2.     public Reader getReader(String name,String password) {  
          3.         return new Reader(name,password);  
          4.     }  
          5.       
          6.     public List<Reader> getReaders(){  
          7.         List<Reader> readerList = new ArrayList<Reader>();  
          8.         readerList.add(new Reader("shun1","123"));  
          9.         readerList.add(new Reader("shun2","123"));  
          10.         return readerList;  
          11.     }  
          12. }  

          也看一下JAVABEAN,Reader類:

          Java代碼  收藏代碼
          1. public class Reader{  
          2.     private static final long serialVersionUID = 1L;  
          3.     private String name;  
          4.     private String password;  
          5.       
          6.     public Reader(){}  
          7.     public Reader(String name,String password) {  
          8.         this.name = name;  
          9.         this.password = password;  
          10.     }  
          11.         //Get/Set方法省略  
          12.     public String toString(){  
          13.         return "Name:"+name+",Password:"+password;  
          14.     }  
          15.       
          16. }  

          注意,我們這里的Reader類實(shí)現(xiàn)了Serializable接口,為什么呢?這里,首先我們需要了解webservice的原理,對(duì)于JAVA來講,如果我們需要在互聯(lián)網(wǎng)上傳對(duì)象,很多人當(dāng)然會(huì)想到序列化,對(duì)了,這里就是序列化,因?yàn)槲覀冃枰裷eader作為參數(shù)來傳遞。這在以前的版本中是需要強(qiáng)制實(shí)現(xiàn),否則會(huì)報(bào)錯(cuò),但現(xiàn)在的最新的版本(其實(shí)最新的也是07年的,因?yàn)閤fire已經(jīng)停止開發(fā),被apache合并為CXF項(xiàng)目,這個(gè)我們之后再講)已經(jīng)不需要了,至于是用什么方式實(shí)現(xiàn)的,我們這里暫時(shí)不深究,因?yàn)樗呀?jīng)被合并到CXF中,我們?nèi)绻钊雽W(xué)習(xí),應(yīng)該學(xué)習(xí)CXF較好。

          3)當(dāng)我們完成上面的接口和JAVABEAN的編寫后,很多人會(huì)問,我看很多webservice都會(huì)有WSDL文件,那你這個(gè)怎么來的?在講這個(gè)之前,我們來討論一下什么是WSDL。也許很多公司提供的接口都還是只是一個(gè)HTTP地址,返回XML這樣的格式,我們的也是。這有一個(gè)好處,也有一個(gè)壞處。好處是我們開發(fā)的難度小了,而壞處是我們需要提供給用戶一堆說明文件,每個(gè)返回的XML標(biāo)簽是什么意思,這倒也沒啥,但就是比較煩而已。而webservice呢,壞處就是我們開發(fā)的東西稍微多了點(diǎn),而好處是我們不用再寫那么多說明文件,因?yàn)橛幸粋€(gè)統(tǒng)一的說明,叫WSDL,這個(gè)是webservice的說明文檔,是統(tǒng)一的,無論什么語言都一樣,所以不存在誰看不懂的問題。

          而這里,當(dāng)我們部署完成xfire后,它就可以幫我們生成WSDL文件。

          問題是怎么部署,這個(gè)其實(shí)也簡(jiǎn)單。我們?cè)趕rc目錄下新建一個(gè)文件夾META-INF,再建它的一個(gè)字文件夾xfire,里面建立文件services.xml。之后的結(jié)構(gòu)如下:


          有人會(huì)問為什么要建到src目錄下,其實(shí)不是規(guī)定建到這里的,但因?yàn)槲覀冃枰岄_發(fā)工具幫我們自己部署這幾個(gè)文件,所以我們放到這里,eclipse就可以幫我們自己部署到tomcat或者其他的容器中。注意,這個(gè)文件所在文件夾層次是固定的,不可以修改。

          我們直接看一下servics.xml:

          Xml代碼  收藏代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
          3.     <service>  
          4.         <!-- webserviceq名稱,調(diào)用時(shí)需要指定這個(gè) -->  
          5.         <name>readerService</name>  
          6.         <!-- 這個(gè)一般是自己公司的網(wǎng)址,意義不大 -->  
          7.         <namespace>http://test/HelloService</namespace>  
          8.         <!-- 接口類 -->  
          9.         <serviceClass>com.xfire.servlet.IReaderService</serviceClass>  
          10.         <!-- 實(shí)現(xiàn)類 -->  
          11.         <implementationClass>com.xfire.servlet.ReaderService</implementationClass>  
          12.     </service>  
          13. </beans>  



          看著注釋一般都沒問題的。

          4)很多人以為這樣就行了,不,還沒行,你指定了這個(gè),那別人怎么訪問呢。怎么把相應(yīng)的請(qǐng)求轉(zhuǎn)發(fā)到xfire那里,讓它進(jìn)行處理呢。這里又需要修改web.xml了。
          修改后如下:

          Xml代碼  收藏代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          3.     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
          4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
          5.     id="WebApp_ID" version="3.0">  
          6.     <servlet>  
          7.         <servlet-name>XFireServlet</servlet-name>  
          8.         <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>  
          9.     </servlet>  
          10.   
          11.     <servlet-mapping>  
          12.         <servlet-name>XFireServlet</servlet-name>  
          13.         <url-pattern>/services/*</url-pattern>  
          14.     </servlet-mapping>  
          15. </web-app>  

          其實(shí)也就是添加了一個(gè)servlet和對(duì)應(yīng)的mapping。接下來,我們?cè)跒g覽器上直接輸入:
          http://localhost:8080/xfireWebService/services/readerService?wsdl

          我們可以看到:




          這里顯示的就是wsdl,它會(huì)顯示我們定義的方法,返回的類型,這個(gè)文件我們這里就不分析了,http://webservices.group.iteye.com/group/topic/11467這位朋友在這里寫得很清楚,想了解的朋友可以到這里看看。

          5)上面四步完成后,我們就完成了webservice的部署了。別人就可以調(diào)用相應(yīng)的webservice來訪問我們的方法了。下面我們就用xfire提供的client來訪問一下我們剛才發(fā)布的webservice:

          Java代碼  收藏代碼
          1. public class ReaderClient {  
          2.     public static void main(String[] args) {  
          3.         //這里是創(chuàng)建一個(gè)service,需要傳入一個(gè)接口類,因?yàn)槲覀兒竺姹仨氄{(diào)用相應(yīng)的接口方法  
          4.         Service srcModel = new ObjectServiceFactory().create(IReaderService.class);  
          5.         //代理工廠,這里是為了后面創(chuàng)建相應(yīng)的接口類  
          6.         XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());  
          7.         //webservice地址,不需要加wsdl  
          8.         String readerServiceUrl = "http://localhost:8080/xfireWebService/services/readerService";  
          9.           
          10.         try {  
          11.             //利用工廠返回相應(yīng)的接口類  
          12.             IReaderService readerService = (IReaderService)factory.create(srcModel,readerServiceUrl);  
          13.   
          14.             Reader reader = readerService.getReader("shun","123");  
          15.             System.out.println(reader);  
          16.         } catch (MalformedURLException e) {  
          17.             e.printStackTrace();  
          18.         }  
          19.     }  
          20. }  

          這樣,我們看到輸出結(jié)果為:


          很簡(jiǎn)單的調(diào)用,當(dāng)我們?nèi)〉媒涌诤螅磺芯透镜匾粯恿恕fire發(fā)布和調(diào)用webservice相對(duì)其他框架來說是簡(jiǎn)單很多的。接下來幾天,我們會(huì)繼續(xù)學(xué)習(xí)另外的幾個(gè)框架,CXF,axis2和jersey,axis2我們放到最后再講,因?yàn)橄鄬?duì)其他來說,它的靈活性比較差,而且比較麻煩。


          另外問個(gè)小問題,有沒有朋友知道怎么修改博客字體大小,我修改完成后保存,它只會(huì)在代碼段那里加上<span>標(biāo)簽,但字體沒有改變,其他的也是一樣,有知道的朋友麻煩跟我說下。

          posted on 2014-07-06 14:33 HUIKK 閱讀(258) 評(píng)論(0)  編輯  收藏 所屬分類: webservice
          主站蜘蛛池模板: 正宁县| 临沭县| 长春市| 新蔡县| 康乐县| 连平县| 杭州市| 乌什县| 讷河市| 鹤岗市| 潞城市| 三穗县| 眉山市| 拜泉县| 昌江| 甘孜| 白银市| 治县。| 嘉荫县| 毕节市| 遵义县| 塔河县| 邢台市| 沾益县| 福州市| 屯留县| 蓝山县| 凉山| 阜南县| 恭城| 新野县| 花莲市| 太湖县| 诸城市| 东乡族自治县| 潮州市| 仲巴县| 洛隆县| 盐源县| 迁西县| 浮山县|