好一陣子沒寫文章了,最近的焦點又回到webservice上面, 這次我們來討論一個webservice開發上面蠻紅的規格:AXIS. AXIS可以在http://www.apache.org的xml區找到。為什麼AXIS 會紅呢?我們知道,webservice底層的協定是以soap為基礎,而 soap又是建立在xml上面,在處理xml文件的時候,有兩種主流方法: DOM和SAX,這兩種方法各有好壞,其中,DOM會先將整個文件 讀入,並且轉換成tree的型態,如果說在xml文件中的節點會被重複 讀取的話,這個方法當然有好處,因為所有的資料已經被存在記憶體 裡面了。但是,在第一次讀取的時候速度就會比較慢,因為需要花時間 來轉換成tree的格式。SAX則剛好相反,處理原則是使用event model, 每抓到一個有定義的標籤,就引發對應的event來進行處理,這樣做當然 是比較適合那些只被讀取一次的文件,而SAX並未儲存資料於記憶體中, 所以第二次讀取的時候仍然要從頭處理一次。比較起來,SAX在第一次 讀取的速度比較快,而DOM在之後的讀取比較快。 AXIS採用SAX的方式來處理XML的文件,這是非常合理的,因為 soap這種協定本來就是只需要被讀取一次的,也因此AXIS的處理速度 頗快,這應該是AXIS受歡迎的一大原因。接著,我們來看看怎麼在AXIS 上面開發webservice: (其實根據AXIS的文件有多種開發方式,這裡只介紹其中一種) 首先,我們撰寫server端的程式,透過AXIS的處理能力,我們在server端 的程式完全不必特別處理,就是一般的程式就可以了: package webservice.test; public class SimpleEchoService { public String echo(String arg) { return arg; } } Client端的程式就要稍微處理一下,不過也頗為簡單: package webservice.test; import java.net.*; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.axis.utils.Options; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; public class SimpleEchoServiceClient { public static void main(String args[]) throws Exception { String endpoint="http://127.0.0.1:8080/axis/services/SimpleEchoService"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("SimpleEchoService", "echo")); //call.addParameter( "arg1", XMLType.XSD_STRING, ParameterMode.IN); //call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING ); String ret = (String) call.invoke( new Object[] { "Hello!" } ); System.out.println(ret); } } 其實最主要的是endpoint的設定,這部分在AXIS的範例程式中似乎有點筆誤, 應該是host:port/axis/services/WebServiceName 另外在Call的部分對於參數型態的設定最好是加上,但是對於primitive type和String type 來說就沒有關係。 接著要寫安裝和反安裝的指令檔: [deploy.wsdd] [undeploy.wsdd] 最後,請把編譯出來的server端package copy到webapps\axis\classes底下,並且執行 java org.apache.axis.client.AdminClient deploy.wsdd 就可以了,要反安裝就執行 java org.apache.axis.client.AdminClient undeploy.wsdd即可。