【原創】webservice xfire框架例項筆記

kekele647發表於2009-12-20

Myeclipse 部署webservice文件—xfire

1         環境

Jdk1.5

Tamcat5.5

Myeclipse

以上工具的配置文件省略。

2         Tamcat部署方式

建議使用tamcatmyeclipse不做整合。

2.1      建立工程

myeclipse中建立webservice工程,file->new->other->web service project

 

為我們的第一個web service projuect 起個名字webservicetest

其實所謂的webservice也不可能單獨通訊,soap協議是一個更上層的通訊協議,他是凌駕在http協議上的,所以我們web開發熟悉的servlet必不可少,預設就可以啦。

選擇以下工具jar包,

呵呵,工程建立完畢,看看效果。包結構基本上遵守web的工程模式,仔細看多了一個目錄WebServices,下邊的services.xml作用就是我們的應用下提供了幾個webservices服務,另外就是web.xml會發生變化,自己看看吧。

下一步工作我們分三種情況舉例,分別是通訊傳輸基本資料型別,xml資料型別,物件型別。 這三種情況應該可以涵蓋了平時所有的應用。

 

2.2      基本資料型別通訊

建立一個service服務程式。File->new->other->myeclipse->web service

 

仍然需要起一個服務類的名字,FirstService myeclipse會為我們生成兩個類服務介面類(IFirstService)和服務實現類(FirstServiceImpl)

看看你的service.xml發生了什麼變化。

 

看一下我們的實現類,很簡單,就是返回一個基本資料型別字串

任務完成一半了,我們先部署一下,看看效果。

部署完成後我們生成wsdl,如下

 

Myeclipse有個訪問wsdl的工具,如下:

點選到wsdl方式,並錄入wsdlurl路徑。

測試一下功能,結果如下

相當於客戶端發一個字串給服務端,服務端處理後返回一個字串響應,功能敘述完畢

下來我們開發一個正式的客戶端。

File->new->other->web service client 填寫wsdl訪問路徑。生成的類以及關鍵測試程式碼如下:

 

 

2.3      物件型別通訊

簡單基礎型別通訊不能滿足我們日常的系統開發工作,我們還需要支援遠端物件傳輸,保證大資料量的傳輸,不過這就需要考慮效率問題 。壓力測試時要注意webservice的效率測試

在生成service端和client端時最好使用兩個工程,把service部署後建立另外一個xfire工程 ,並生成client,在傳輸物件的過程中client端也需要一個User物件,這個物件的作用就是對映伺服器端的自定義物件。

 

首先我們需要建立服務類,返回引數是自定義物件User

 

建立User物件 ,注意這個是伺服器端的。

為了在WSDL中對映引數的型別,我們需要建立一個配置檔案,並和服務類放在一個包下。IFirstService.aegis.xml

伺服器端都準備好了,部署!看看我們wsdl

注意其中對引數的定義。

下來就是client端的開發了,順便介紹一下xfire客戶端的三種模式:

1.     Client開發者擁有Web服務端的class

即:能拿到服務端的介面ClassEntity類及aegis 配置檔案

//傳統POJO模式

Service srvcModel = new ObjectServiceFactory().create(Hello.class);

               

XFireProxyFactory factory = new XFireProxyFactory(

 XFireFactory.newInstance().getXFire());

String helloWorldURL = " http://localhost:8080/webservice/services/Hello ";

  

Hello srvc = ( Hello) factory.create(srvcModel,

                                  helloWorldURL);

   System.out.println(srvc.sayHello("Robin"));

// JSR181模式,注意這裡Server端開發組需要向Client提供實現類,而不止於//介面,有點危險

Service  srvcModel = new AnnotationServiceFactory()

.create(HelloImpl.class);

XFireProxyFactory factory = new XFireProxyFactory(XFireFactory

                       .newInstance().getXFire());

      

String helloWorldURL = "http://localhost:8080/webservice/services/Hello";

          

 Hello hello = (Hello) factory.create(srvcModel,helloWorldURL);

System.out.println(hello.sayHello("caohuili:"));

2 動態模式

    動態模式不需要服務端的class,不過效能和複雜物件對映等估計做得不會太好。

Client client = new Client(new URL(

             "http://localhost:8080/webservice/services/Hello?wsdl"));

      Object[] results = client

             .invoke("sayHello", new Object[] { "Cao," });

      System.out.println((String) results[0]);

3 根據WSDL生成Client Stub

 //簡單引數的

HelloClient client=new HelloClient();

      HelloPortType port =client.getHelloHttpPort();

      System.out.println(port.sayHello("hi!"));

//引數複雜的

            MemberServiceClient client = new MemberServiceClient();

      MemberService memberService = client.getMemberServiceHttpPort();

     

     

      User user = new User();

      /*JAXBElement name = new JAXBElement(new QName(

             "http://memberService", "username"), String.class, "smallnest");

      JAXBElement password = new JAXBElement(new QName(

             "http://memberService", "password"), String.class, "123456");*/

     

       ObjectFactory bjFac=new ObjectFactory();

      JAXBElement name = objFac.createUserUsername("smallnest");

      JAXBElement password = objFac.createUserPassword("123456");

      user.setUsername(name);

      user.setPassword(password);

     

      Member neMember = new Member();

      JAXBElement memeberName = new JAXBElement(new QName(

             "http://memberService", "name"), String.class, "邁克");

      JAXBElement email = new JAXBElement(new QName(

             "http://memberService", "email"), String.class,

             "micro@micro.com");

      oneMember.setName(memeberName);

      oneMember.setEmail(email);

      oneMember.setRank(6);

      // 呼叫方法

      memberService.addMember(oneMember, user);

那我們就完成自己的客戶端 ,很簡單,還是用eclipse新建立一個工程,並根據wsdl生成一個client

 

 

執行結果 

 

2.4      陣列型別通訊

對於基本型別的陣列,不用在aegis.xml檔案中對映配置,生成客戶端時,會生成ArrayOfString的對映型別接收資料。如果是自己定義的複雜物件,就需要在aegis.xml檔案中配置物件對映,這時client會根據wsdl生成對應的ArroyOfxxx物件

首先生成服務類

 

 

生成的wsdl檔案。

 

客戶端程式

 

執行結果

 

 

 

 

3         Weblogic部署方式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7389553/viewspace-623089/,如需轉載,請註明出處,否則將追究法律責任。

相關文章