Myeclpse6.0+Axis2 返回對象數組(List)的webservice例子

【wayfoon】 

最近公司要求實現一個webservice調用,之前也接觸過,但只是看看,沒有動手試試,於是現在正式開始學習webservice。

之前參照網上的例子寫了一個簡單的say hello webservice例子。傳遞的對象是string,而且只有一個方法;但實際應用中,需要傳遞一些複製的對象,比如:數組,集合,對象數組。

由於webservice 是通過xml來交互數據的,而且是不分平臺的。因此,java 中的List等集合類的哦是通過數組來實現的。學習webservice最好不要從一種語言的角度(java、c#)來對待問題,如果非要看成一中語言,那看成是c語言吧。

 

簡單的hello world 例子見 http://www.blogjava.net/mlzry0612/articles/185209.html?opt=admin 裏面有詳細的axis+myeclipse5.5安裝部署,圖文並茂。不同myeclipse版本 有所不同,相關工具歷史版本下載鏈接

http://archive.apache.org/dist/ws/axis2/tools/1_4_1/

 

在演示例子前,你必須已經安裝好了Axis,並且已經知道怎樣使用axis,知道通過wsdl生成webservice代碼和生成aar發佈文件。不會的話,先學習前面的hello 例子。

下面演示一個比較複雜的例子。例子實現:輸入一個string 返回得到一個對象數組(輸入裏面所有的元素對象),注意是對象數組。每個對象對應一個bean實體。

使用axis的好處是可以根據wsdl自動生成大部分代碼。因此,採用axis開發webservice 的實現關鍵在於生成wsdl文件的編寫。

生成wsdl文件可以採用兩種方式:

第一種:直接新建wsdl再通過wsdl設計器來設計(也就是hello例子裏面將的)

如果你對wsdl不是很熟悉,而且,輸入或輸出的參數都非常複雜,不清楚輸入輸出的組成結構時,你可以採用第二種方法。這種方式,可以讓你使用你最熟悉的語言來表達你的意思。以java爲例,你可以將對個對象放到List裏面來表達你要輸出的值,這個在wsdl裏面是另外一種表達方式(沒有List)。

第二種:選中建立好的web service項目,
file - new - other - myeclipse - web services - web service,
選中要將webservice添加到哪個項目,
勾選create new java bean,
next,
填web service name, 比如hello
其他的會自動生成,
如果有包的話選一下包,finish.
然後會生成Ihello.java和helloImpl.java兩個文件,
前面的是接口,後面的是實現.

Ihello.java文件:

  1. package org.way;
  2. import java.util.List;
  3. // Generated by MyEclipse 
  4. public interface Ihello
  5. {
  6.     public String example(String message);
  7. }

helloImpl.java文件

  1. package org.way;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. // Generated by MyEclipse
  5. public class helloImpl implements Ihello
  6. {
  7.     public String example(String message)
  8.     {
  9.         return null;
  10.     }
  11. }

例子的目的是要返回一個對象數組,因此我可以將上面文件改成

新的Ihello.java文件:

  1. package org.way;
  2. import java.util.List;
  3. // Generated by MyEclipse
  4. public interface Ihello
  5. {
  6.     public List<HelloBean> example(String message);
  7. }

新的helloImpl.java文件

  1. package org.way;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. // Generated by MyEclipse
  5. public class helloImpl implements Ihello
  6. {
  7.     public List<HelloBean> example(String message)
  8.     {
  9.         List<HelloBean> list = new ArrayList<HelloBean>();
  10.         return list;
  11.     }
  12. }

新的兩個文件對學習java的來說,非常熟悉了。HelloBean 是一個實體bean,你可以寫多個字段 以及get/set方法,這裏不列出。

然後將這個項目部署到tomcat裏,
啓動tomcat,打開http://127.0.0.1:8080/項目名/services, (注意必須加services
會出現項目所提供的web service列表,
點進去就是wsdl, 另存爲網頁成*.wsdl文件。這樣就生成了需要的wsdl文件。

 

生成的wsdl 文件以及詳解 見:http://blog.csdn.net/wayfoon322/archive/2008/09/11/2914792.aspx

 

好了,關鍵的wsdl文件生成,現在可以利用這個wsdl生成webservice代碼。生成方法見hello例子

生成之後的項目結構是:

 

wayfoon:目錄結構

 

需要注意其他三個文件:HelloTest.java 是測試文件,HelloStub,java是給客戶端用的,HelloSkeleton.java:我們要實現的webservice業務代碼需要在這個文件中編寫,我們的業務是:輸入string 輸出對象數組,採用java語言描述則是 見代碼註釋

HelloSkeleton.java:

  1. /**
  2.  * HelloSkeleton.java
  3.  * 
  4.  * This file was auto-generated from WSDL by the Apache Axis2 version: 1.4 Built on : Apr 26, 2008
  5.  * (06:24:30 EDT)
  6.  */
  7. package org.way;
  8. /**
  9.  * HelloSkeleton java skeleton for the axisService
  10.  */
  11. public class HelloSkeleton implements HelloSkeletonInterface
  12. {
  13.     /**
  14.      * Auto generated method signature
  15.      * 
  16.      * @param examplein00
  17.      */
  18.     public org.way.Exampleout example(org.way.Examplein0 examplein00)
  19.     {
  20.         //輸出的對象
  21.         Exampleout out=new Exampleout();
  22.         HelloBean hb=null;
  23.         //包含一個數組 的對象
  24.         ArrayOfHelloBean param=new ArrayOfHelloBean();
  25.         for (int i = 0; i <10; i++)
  26.         {
  27.             hb=new HelloBean();
  28.             hb.setCid("Cid="+i);
  29.             hb.setName(examplein00.getExamplein0());
  30.             hb.setSex("sex");
  31.             //將單個實體加入到對象數組裏面
  32.             param.addHelloBean(hb);
  33.         }
  34.         out.setExampleout(param);
  35.         
  36.         return out;
  37.     }
  38. }

 

打包生成*.arr 文件。名稱任意。放到 axis2/WEB-INF/services 下面

啓動tomcat

最後junit測試,HelloTest.java 文件

  1. package org.way;
  2. import org.way.HelloStub.HelloBean;
  3. /*
  4.  * HelloTest Junit test case
  5.  */
  6. public class HelloTest extends junit.framework.TestCase
  7. {
  8.     /**
  9.      * Auto generated test method
  10.      */
  11.     public void testexample() throws java.lang.Exception
  12.     {
  13.         String url="http://192.168.0.70:8080/axis2/services/hello";
  14.         org.way.HelloStub stub = new org.way.HelloStub(url);// the default implementation should
  15.         // point to the right endpoint
  16.         org.way.HelloStub.Examplein0 request = (org.way.HelloStub.Examplein0) getTestObject(org.way.HelloStub.Examplein0.class);
  17.         request.setExamplein0("wayfoon");
  18.         
  19.         //System.out.println(stub.example(request).getExampleout());
  20.         HelloStub.ArrayOfHelloBean arrayOfHelloBean=(HelloStub.ArrayOfHelloBean)stub.example(request).getExampleout();
  21.         HelloStub.HelloBean[] localHelloBean=(HelloStub.HelloBean[])arrayOfHelloBean.getHelloBean();
  22.         System.out.println("length:"+localHelloBean.length);
  23.         for (int i = 0; i < localHelloBean.length; i++)
  24.         {
  25.             HelloStub.HelloBean hb=(HelloStub.HelloBean)localHelloBean[i];
  26.             System.out.println("{Cid:"+hb.getCid()+" Name:"+hb.getName()+"},");
  27.             
  28.         }
  29.         
  30.         assertNotNull(stub.example(request));
  31.     }
  32.     // Create an ADBBean and provide it as the test object
  33.     public org.apache.axis2.databinding.ADBBean getTestObject(
  34.             java.lang.Class type) throws java.lang.Exception
  35.     {
  36.         return (org.apache.axis2.databinding.ADBBean) type.newInstance();
  37.     }
  38. }

 

輸入:wayfoon

輸出

最終結果:

{Cid:Cid=0 Name:wayfoon },
{Cid:Cid=1 Name:wayfoon },
{Cid:Cid=2 Name:wayfoon },
{Cid:Cid=3 Name:wayfoon },
{Cid:Cid=4 Name:wayfoon },
{Cid:Cid=5 Name:wayfoon },
{Cid:Cid=6 Name:wayfoon },
{Cid:Cid=7 Name:wayfoon },
{Cid:Cid=8 Name:wayfoon },
{Cid:Cid=9 Name:wayfoon },

 

 

注意:使用axis,jdk最好使用1.6。新建webservice 項目 最好選擇JAVA EE 5.0,


作者:南極光  
時間:2008-9-5

歡迎大家同我聯繫,[email protected]
歡迎轉載,轉載請保留申明信息。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章