夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

          轉自http://cxshun.iteye.com/blog/1273147


          最近公司最近需要將以前提供出去的接口統一用一個標準來實現,考慮到webservice這個是標 準,因此我花時間大概學習了一下webservice,也對JAVA的幾個webservice框架進行了一些小例子的學習。

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

          今天我們就先一起來看一下xfire的實現,接下來的幾天我們會慢慢一起來學習另外的框架。

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

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

          建一個新項目,比較我的是xfireWebservice,這里當然是建web項目啦。



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

          2)我們首先來了解一下xfire與其他webservice框架的不同,它最大的不同之處在于它需要一個接口,而且如果需要用xfire來調用相應的webservice必須知道接口的定義,感覺這里有點限制了。但除了這點,xfire調用webservice,那是相當的方便,就跟調用本地方法一樣。我們直接來看例子:

          首先是最重要的接口:

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

          有接口,當然也要有實現類,不然接口就沒什么意義了。

          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類實現了Serializable接口,為什么呢?這里,首先我們需要了解webservice的原理,對于JAVA來講,如果我們需要在互聯網上傳對象,很多人當然會想到序列化,對了,這里就是序列化,因為我們需要把reader作為參數來傳遞。這在以前的版本中是需要強制實現,否則會報錯,但現在的最新的版本(其實最新的也是07年的,因為xfire已經停止開發,被apache合并為CXF項目,這個我們之后再講)已經不需要了,至于是用什么方式實現的,我們這里暫時不深究,因為它已經被合并到CXF中,我們如果要深入學習,應該學習CXF較好。

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

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

          問題是怎么部署,這個其實也簡單。我們在src目錄下新建一個文件夾META-INF,再建它的一個字文件夾xfire,里面建立文件services.xml。之后的結構如下:


          有人會問為什么要建到src目錄下,其實不是規定建到這里的,但因為我們需要讓開發工具幫我們自己部署這幾個文件,所以我們放到這里,eclipse就可以幫我們自己部署到tomcat或者其他的容器中。注意,這個文件所在文件夾層次是固定的,不可以修改。

          我們直接看一下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名稱,調用時需要指定這個 -->  
          5.         <name>readerService</name>  
          6.         <!-- 這個一般是自己公司的網址,意義不大 -->  
          7.         <namespace>http://test/HelloService</namespace>  
          8.         <!-- 接口類 -->  
          9.         <serviceClass>com.xfire.servlet.IReaderService</serviceClass>  
          10.         <!-- 實現類 -->  
          11.         <implementationClass>com.xfire.servlet.ReaderService</implementationClass>  
          12.     </service>  
          13. </beans>  



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

          4)很多人以為這樣就行了,不,還沒行,你指定了這個,那別人怎么訪問呢。怎么把相應的請求轉發到xfire那里,讓它進行處理呢。這里又需要修改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>  

          其實也就是添加了一個servlet和對應的mapping。接下來,我們在瀏覽器上直接輸入:
          http://localhost:8080/xfireWebService/services/readerService?wsdl

          我們可以看到:




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

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

          Java代碼  收藏代碼
          1. public class ReaderClient {  
          2.     public static void main(String[] args) {  
          3.         //這里是創建一個service,需要傳入一個接口類,因為我們后面必須調用相應的接口方法  
          4.         Service srcModel = new ObjectServiceFactory().create(IReaderService.class);  
          5.         //代理工廠,這里是為了后面創建相應的接口類  
          6.         XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());  
          7.         //webservice地址,不需要加wsdl  
          8.         String readerServiceUrl = "http://localhost:8080/xfireWebService/services/readerService";  
          9.           
          10.         try {  
          11.             //利用工廠返回相應的接口類  
          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. }  

          這樣,我們看到輸出結果為:


          很簡單的調用,當我們取得接口后,一切就跟本地一樣了。xfire發布和調用webservice相對其他框架來說是簡單很多的。接下來幾天,我們會繼續學習另外的幾個框架,CXF,axis2和jersey,axis2我們放到最后再講,因為相對其他來說,它的靈活性比較差,而且比較麻煩。


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

          posted on 2014-07-06 14:33 HUIKK 閱讀(258) 評論(0)  編輯  收藏 所屬分類: webservice
          主站蜘蛛池模板: 津市市| 郓城县| 乌兰察布市| 阳高县| 三亚市| 平顶山市| 汤阴县| 海原县| 平和县| 阿拉善盟| 胶州市| 阳春市| 墨玉县| 西和县| 宁陕县| 资中县| 上蔡县| 沭阳县| 土默特右旗| 延津县| 东乌珠穆沁旗| 诸暨市| 香港 | 翁源县| 铜山县| 图们市| 葵青区| 荥经县| 调兵山市| 石渠县| 吉林市| 开江县| 保德县| 汶川县| 车致| 邵东县| 澄城县| 龙胜| 新竹县| 玉龙| 张北县|