轉自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代碼

- public interface IReaderService {
- public Reader getReader(String name,String password);
- public List<Reader> getReaders();
- }
有接口,當然也要有實現類,不然接口就沒什么意義了。
Java代碼

- public class ReaderService implements IReaderService{
- public Reader getReader(String name,String password) {
- return new Reader(name,password);
- }
-
- public List<Reader> getReaders(){
- List<Reader> readerList = new ArrayList<Reader>();
- readerList.add(new Reader("shun1","123"));
- readerList.add(new Reader("shun2","123"));
- return readerList;
- }
- }
也看一下JAVABEAN,Reader類:
Java代碼

- public class Reader{
- private static final long serialVersionUID = 1L;
- private String name;
- private String password;
-
- public Reader(){}
- public Reader(String name,String password) {
- this.name = name;
- this.password = password;
- }
- //Get/Set方法省略
- public String toString(){
- return "Name:"+name+",Password:"+password;
- }
-
- }
注意,我們這里的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代碼

- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://xfire.codehaus.org/config/1.0">
- <service>
- <!-- webserviceq名稱,調用時需要指定這個 -->
- <name>readerService</name>
- <!-- 這個一般是自己公司的網址,意義不大 -->
- <namespace>http://test/HelloService</namespace>
- <!-- 接口類 -->
- <serviceClass>com.xfire.servlet.IReaderService</serviceClass>
- <!-- 實現類 -->
- <implementationClass>com.xfire.servlet.ReaderService</implementationClass>
- </service>
- </beans>
看著注釋一般都沒問題的。
4)很多人以為這樣就行了,不,還沒行,你指定了這個,那別人怎么訪問呢。怎么把相應的請求轉發到xfire那里,讓它進行處理呢。這里又需要修改web.xml了。
修改后如下:
Xml代碼

- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
- id="WebApp_ID" version="3.0">
- <servlet>
- <servlet-name>XFireServlet</servlet-name>
- <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>XFireServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- </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代碼

- public class ReaderClient {
- public static void main(String[] args) {
- //這里是創建一個service,需要傳入一個接口類,因為我們后面必須調用相應的接口方法
- Service srcModel = new ObjectServiceFactory().create(IReaderService.class);
- //代理工廠,這里是為了后面創建相應的接口類
- XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
- //webservice地址,不需要加wsdl
- String readerServiceUrl = "http://localhost:8080/xfireWebService/services/readerService";
-
- try {
- //利用工廠返回相應的接口類
- IReaderService readerService = (IReaderService)factory.create(srcModel,readerServiceUrl);
-
- Reader reader = readerService.getReader("shun","123");
- System.out.println(reader);
- } catch (MalformedURLException e) {
- e.printStackTrace();
- }
- }
- }
這樣,我們看到輸出結果為:

很簡單的調用,當我們取得接口后,一切就跟本地一樣了。xfire發布和調用webservice相對其他框架來說是簡單很多的。接下來幾天,我們會繼續學習另外的幾個框架,CXF,axis2和jersey,axis2我們放到最后再講,因為相對其他來說,它的靈活性比較差,而且比較麻煩。
另外問個小問題,有沒有朋友知道怎么修改博客字體大小,我修改完成后保存,它只會在代碼段那里加上<span>標簽,但字體沒有改變,其他的也是一樣,有知道的朋友麻煩跟我說下。