好一陣子沒寫文章了,最近的焦點又回到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即可。