我的java天地

          axis1 和 axis2 的簡單使用

          晚上順便學習了下axis1 和 axis2,發現兩者的API相差很大,不知道現在更流行的是哪個,就晚上簡單的入門后覺得,axis2還是比axis1開發起來容易上手的多,axis1就單單對服務器發布.wsdd文件就相當麻煩。下面分別就axis1和axis2說下如何集成到自己的項目里:
          ??? 一、集成axis1
          ????? 1、從官網下載項目http://ws.apache.org/axis/,最新的是1.4
          ????? 2、解壓下載的axis壓縮包,假設AXIS_HOME為解壓后的根目錄,demo為自己項目的名稱
          ????? 3、將AXIS_HOME/lib目錄下的所有jar包都復制到自己項目的WEB-INF/lib下
          ????? 4、將AXIS_HOME/webapps/axis/WEB-INF/web.xml中與axis相關的配置都復制粘貼到自己項目的web.xml中去。
          ????? 5、編寫需要發布SOAP服務的java類,注意要發布的方法需是public的。以下以Foo.java為例:
          Java代碼
          public?class?Foo?{
          ?????
          public?String?sayHello(String?name)?
          {
          ?????????
          return??"hello:?"?+
          ?name;
          ?????}

          }


          ????? 6、接下來就是發布soap服務了,在axis1中有兩種發布方式,即時發布和定制發布,下面分別介紹兩種發布方式:
          ????? 6.1 即時發布:這樣方式非常簡單,將Foo.java的后綴名改成jws,即java.jws,然后把該文件放在項目里可以在客戶端直接訪問到的目錄下(如WEB-INF就不可以),比如直接放在項目demo的根目錄下,通過http://主機名/demo/Foo.jws訪問,如果看到Click to see the WSDL就說明發布成功了,點擊進去就能看WSDL的描述文件了。接下來就可以寫客戶端測試代碼了:
          Java代碼
          ????String?path?=?"http://localhost:8080/demo/Foo.jws";;
          ????Service?service?
          =?new
          ?Service();
          ????Call?call?
          =
          ?(Call)?service.createCall();
          ????call.setTargetEndpointAddress(
          new
          ?URL(path));
          ????call.setOperationName(
          new?QName(path?,"sayHello"
          ));
          ????Object?obj?
          =?call.invoke(new?Object[]{"lady?gaga"}
          );
          ????System.out.println(obj.toString());

          測試代碼就不說明了,相信大家能看明白。即時發布方式非常簡單、快速,但前提是必須有需要發布soap服務的JAVA類的源文件,如果只有.class或者jar包,那顯然就不適用了。
          ????? 6.2 定制發布:定制發布相對于即時發布要發雜一些,需要手寫wsdd文件來描述web service,但是在犧牲了簡單、快速之后,帶來的卻是靈活性和適用性的大大提高。
          ?????? 首先在WEB-INF/目錄下創建deploy.wsdd文件,文件內容如下:
          Xml代碼?
          <deployment?name="test"?xmlns="http://xml.apache.org/axis/wsdd/"?
          ????xmlns:java
          ="http://xml.apache.org/axis/wsdd/providers/java">

          ????
          <service?name="foo"?provider="java:RPC">
          ????????
          <parameter??name="className"?value="Foo"/>
          ????????
          <parameter??name="allowedMethods"?value="sayHello"?/>
          ????
          </service>
          </deployment>

          ??? <deployment>是wsdd文件的根元素。<service>代表一個soap服務,name屬性唯一標識這個soap服務,provider表示提供服務的語言和方式,這里是用java語言和RPC方式。
          ??? <paramter>提供<service>更多參數信息,當name值為className時,value值為提供soap服務的JAVA類,當name值為allowedMethods時,value值為允許調用的方法。allowedMethods value等于*,表示MyService的所有方法都可以被調用?
          ????? 創建完了deploy.wsdd文件后,我們需要想服務器發布這個soap服務,這需要用到axis提供的一個工具類,打開cmd,進入到WEB-INF/下,執行如下命令:
          • set AXIS_HOME=D:\axis
          • set AXIS_LIB=%AXIS_HOME%\lib
          • set AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; ? %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;
            ? %AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar
          • java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient ???? -lhttp://localhost:8080/demo/services/AdminService deploy.wsdd

          ??? 以上的三個set命令,設置變量值AXISCLASSPATH為axis相關jar包路徑集,java命令就是通過axis提供的工具類AdminClient來發布deploy.wsdd所描述的工具類,執行上面的命令之后(保持服務器是啟動狀態),會在同一目錄下生成server-config.wsdd文件,說明發布成功。可以用6.1即時發布中的客戶端測試代碼來測試剛發布的soap服務,修改下path的值即可。
          Java代碼
          String?path=?"http://localhost:8080/demo/Foo";

          ??? 二、集成axis2
          ??? 之前的準備工作和集成axis1相同,就是axis2所帶的jar包非常之多,挑選必須的jar就可以了。
          ??? 仍然以Foo類為例,在項目的WEB-INF/目錄下建立名為pojo的目錄,然后將Foo.class文件放入pojo目錄中,這樣就發布完成了,可以通過在瀏覽器輸入http://主機名/demo/services/listServices來查看剛才發布的服務。簡單吧,這就是axis2帶來的無需任何配置,同樣適合.class文件的發布方式。下面就是在客戶端進行測試:
          Java代碼?
          //調用web?service?的?url
          ????????String?path?=?"http://localhost:8080/demo/services/Foo";
          ????????
          //使用RPC的方式調用web?service

          ????????RPCServiceClient?serviceClient?=?new?RPCServiceClient();
          ????????Options?options?
          =
          ?serviceClient.getOption();
          ????????EndpointReference?target?
          =?new
          ?EndpointReference(path);
          ????????options.setTo(target);
          ????????Object[]?params?
          =?new?Object[]{"lady?gaga"}
          ;
          ????????Class[]?classes?
          =?new?Class[]{String.class}
          ;
          ????????QName?q?
          =?new?QName(path,"sayHello"
          );
          ????????Object?obj?
          =?serverClient.invokeBlocking(q,params,classes)[0
          ];
          ????????System.out.println(obj.toString());

          ? 從上面可以看出來,axis2和axis1API相差還是很大的。

          posted on 2010-10-08 16:17 tobyxiong 閱讀(2216) 評論(0)  編輯  收藏 所屬分類: java

          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類(144)

          隨筆檔案(157)

          相冊

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 金沙县| 西城区| 建平县| 绥江县| 芜湖县| 乌兰县| 长阳| 丰都县| 会东县| 凤山市| 新绛县| 宁安市| 日照市| 隆昌县| 那坡县| 阆中市| 巴东县| 伊川县| 日照市| 宁海县| 常熟市| 五家渠市| 温宿县| 晋江市| 赞皇县| 琼海市| 徐汇区| 都匀市| 林口县| 犍为县| 昌黎县| 金溪县| 嘉黎县| 丰镇市| 通城县| 新源县| 麦盖提县| 辛集市| 健康| 迁西县| 五家渠市|