MyEclipse下開發Web Service(Axis)

  文章轉載自:http://www.blogjava.net/zhip/archive/2007/05/17/118182.html

本文主要描述如何使用Apache開源項目Axis提供的API來實現Web Services。本文中的提到的例子只爲了方便本文的描述而提出,有不妥之處請見諒。

    本文的讀者應有JAVA web 應用開發基礎。應該具有看過WSDLSOAPXML等的基本規範。熟悉Eclipse+MyEclipse開發環境。

    本文可以隨意轉載使用,但是要保留作者的署名。

一、環境準備

使用Axis來開發Web services 需要準備 web 服務器,Axis API。本文使用的Web container Tomcat5.5, Axis API 採用版本2

1.1軟件下載準備

Tomcat下載地址:http://tomcat.apache.org/download-55.cgi#5.5.20

Axis標準包:

http://ftp.wayne.edu/apache/ws/axis2/1_0/axis2-std-1.0-bin.zip

Axis War包:

http://ftp.wayne.edu/apache/ws/axis2/1_0/axis2.war

Axis Eclipse plug-in(代碼生成工具和打包工具):

http://apache.justdn.org/ws/axis2/tools/1_0/Axis2_Code_Generator.zip

http://apache.justdn.org/ws/axis2/tools/1_0/Axis2_Service_Archiver.zip

Eclipse+MyEclipse可以到官方網站下載(本文爲3.25.0GA

1.2安裝

A.首先搭建開發環境,需要將下載到的Eclipse解壓縮到一個目錄。

B.將下載到的Axis 的兩個plug-in解壓縮到Eclipse安裝目錄下的plug-in子目錄。

C.安裝MyEclipse5.0GA。然後啓動MyEclipse,並選擇“File->New->Other”可以找到下面的這些Wizards,這些將是本文中用到的很重要的工具。

 

eclipse安裝Axis插件後的情況

                             D.下面開始搭建Web Services的部署環境。將下載的

          tomcat報解壓縮到一個目錄。完成web container

          的安裝。

        E.axis2.war包拷貝到tomcat安裝目錄下的webapps

          目錄中。

 F.啓動Tomcat(windows 下爲TOMCA_HOME/bin中的startup.batLinuxunix環境爲startup.sh文件),打開瀏覽器輸入並訪問:http://ip:port/axis2來查看。(如果沒有進行陪孩子文件的修改此地址應該爲http://localhost:8080/axis2,如果能看到下面的頁面則說明已經安裝完成。

 

 

 

驗證Axis2 web應用部署

二、Quick Start

環境準備好後,先從一個簡單的例子開始。以便對使用Axis來開發Web services的大致流程有個瞭解。這個例子就是SayHello,請求端輸入一個名字字符串,返回的將是一個問候語。

例如:輸入了Tom,那麼返回的事HiTom.How are you

2.1編寫WSDL

A.啓動MyEclipse,新建立一個WebAppsFile->New->Project->Web Project,Project Name SayHello,其他保持不改變。

B.選擇File->New-Other菜單,進入後找到MyEclipse->Web Services並選擇WSDL.

C. 選擇“src”目錄作爲“Enter or select the parent folder”的值,“File name”值給定爲SayHello.wsdl。點擊“Next”進入下一步。

新建wsdl 

 

D.將目標命名空間設置爲“http://ws.tonyzhangcn.org/SayHello/”.在生成代碼的時候一般以這個命名空間爲package的名字,例如:org.tonyzhangcn.ws.sayhello。這些值可以按需要設置。

設置wsdl屬性

 

E.點擊“Finish”按鈕就可以看到MyEclipse提供的WSDL 設計器的界面了。可以看到設計器爲WSDL默認的添加了一個現操作。

  設計器-1

即圖中的“NewOperation”。現在將其改名爲SayHello,如下圖:

 設計器-2

         之後點擊設計界面中的“Source”Tab來查看其代碼。如下:可以看到我們定義了一個SayHelloWeb Services,她提供了一個SayHello的方法,她能夠接受一個String(事實上是tns:SayHelloRequest對象,她對String進行了封裝)類型的輸入參數SayHelloRequest並返回一個String(事實上是tns:SayHelloResponse對象,她對String進行了封裝)類型的SayHelloResponse結果。更多關於WSDL的信息,請參考W3C的規範文檔。

 

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.tonyzhangcn.org/SayHello/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SayHello" targetNamespace="http://ws.tonyzhangcn.org/SayHello/">

<wsdl:types>

<xsd:schema targetNamespace="http://ws.tonyzhangcn.org/SayHello/">

<xsd:element name="SayHelloResponse" type="xsd:string" />

<xsd:element name="SayHelloRequest" type="xsd:string" />

</xsd:schema>

</wsdl:types>

<wsdl:message name="SayHelloResponse">

<wsdl:part element="tns:SayHelloResponse" name="SayHelloResponse" />

</wsdl:message>

<wsdl:message name="SayHelloRequest">

<wsdl:part element="tns:SayHelloRequest" name="SayHelloRequest" />

</wsdl:message>

<wsdl:portType name="SayHello">

<wsdl:operation name="SayHello">

<wsdl:input message="tns:SayHelloRequest" />

<wsdl:output message="tns:SayHelloResponse" />

</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="SayHelloSOAP" type="tns:SayHello">

<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />

<wsdl:operation name="SayHello">

<soap:operation soapAction="http://ws.tonyzhangcn.org/SayHello/NewOperation" />

<wsdl:input>

<soap:body use="literal" />

</wsdl:input>

<wsdl:output>

<soap:body use="literal" />

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

<wsdl:service name="SayHello">

<wsdl:port binding="tns:SayHelloSOAP" name="SayHelloSOAP">

<soap:address location="http://www.example.org/" />

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

至此WSDL的編寫已經完成。

2.2WSDL生成Java代碼

A.選擇菜單“File->New->Other”,從對話框中選取“Axis2 Wizards”下面的“Axis2 Code Generator”.點擊“Next”進入下一個頁面,保持“Generate java source code from WSDL file”被選中,點擊“Next”進入下一步。

B.點擊“Browse”來選取存放在src目錄下的SayHello.wsdl文件,“Next”進入下一步。設置如下:

Axis2 code generator

 C.點擊“next”進入下一個頁面,設置“Output path”爲本Projectsrc目錄。點擊“finish”後代在SayHello項目上按F5刷新就可以看到有代碼生成好了。但是能看到一堆紅“x”,這是由於沒有將Axis2jar包放入class path 中以及源代碼的package不爲org.tonyzhangcn.ws.sayhello引起的。

代碼1

 

下面解決這個問題,首先選擇“SayHello”項目,並右擊選擇“Build path->Add External Archives..”,選擇上面部署在tomcat中的axis2 web應用WEB-INF/lib目錄中的所有jar包。之後右擊“src.org.tonyzhangcn.ws.sayhello”項目,選擇“Refactor->rename”,做如下修改,並選擇OK完成。

代碼2

 

這個時候發現test.org.tonyzhangcn.ws.sayhello下面的SayHelloTest.java仍然存在問題。點擊此文件中package 關鍵子前面的紅“x”,會提示有兩個選項,我們選擇下面的那個。

code4

 

選擇public class SayHelloTest前的紅“x”,選擇第一項。

code5

 

進行完這幾個改動之後,生成的代碼就沒有問題了。其中

SayHelloRequestSayHelloResponse是輸入輸出參數對象。

SayHelloSkeleton是服務端對象,用來編寫業務邏輯調用。

SayHelloStub是客戶端用來定位endpoint(就是發佈的Web Services的地址)的類,客戶端根據其提供的方法定位Web服務併發起調用

SayHelloMessageReceiverInOut是一個實現同步調用的web服務信息轉換處理類。

Resources目錄下的services.xml文件是webservices的描述文件。

SayHelloTest是一個客戶端的TestCase示例,用戶可以根據這個示例來編寫自己的客戶端調用類。

2.3編寫業務代碼

打開SayHelloSKeleton.java文件將其中的實現方法

 

public org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest param0)

{

// Todo fill this with the necessary business logic

throw new java.lang.UnsupportedOperationException();

}

 

改爲

public org.tonyzhangcn.ws.sayhello.SayHelloResponse SayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequest request)

{

// Todo fill this with the necessary business logic

try

{

SayHelloResponse response = new SayHelloResponse();

response.setSayHelloResponse("Hi,"+request.getSayHelloRequest()+".How are you?");

return response;

}catch(UnsupportedOperationException e)

{

throw e;

}

}

2.4打包

A.選擇菜單“File->New->Other”,從對話框中選取“Axis2 Wizards”下面的“Axis2 Services Archive”.點擊“Next”進入下一個頁面

B.選擇編譯好的class文件所在目錄(本項目應該是WebRoot下面WEB-INF/classes),“Next”進入下一步。

C.選擇WSDL文件所在目錄,此處爲src目錄下的SayHello.wsdl文件。“Next”,再“Next”。選擇services.xm文件,本文應該是生成再src/resources下面的services.xml文件。之後選取“Generate the services.xml automatically”,然後再點擊一下使其變爲非選中狀態,之後點擊“Back”按鈕,再點擊一次“Next”。(注意:這裏本應該不是這麼來回折騰的,但是我的機器上只有這樣操作finish按鈕才能生效。懷疑這是一個bug,如果讀到此文的用戶沒有這種情況,忽略此提示

D.點擊“Next”,將記入最後一個頁面,此處有兩個選項,一個是輸出目錄一個是處處文件名稱。我這裏的輸出文件名稱給的是SayHello。點擊“Finish”完成。

 2.5部署

A.將打包好的文件SayHello.jar(或者可以改名爲SayHello.aar),拷貝到Tomcat中已經部署的Axis2應用的WEB-INF/services目錄下面。

B.啓動Tomcat(即點擊Tomcat安裝目錄下的startup.batlinuxunix下執行startup.sh)。

C.打開瀏覽器,輸入http://ipaddress:port/axis2(一般爲http://localhost:8080/axis2,並點擊其中的“services”鏈接

testservices

   可以看到SayHello已經被部署。點擊SayHello提供的連接可以看到與之對應的WSDL

2.6調用測試

A.修改SayHelloTest.java文件中的方法testSayHello的內容爲:

public void testSayHello() throws java.lang.Exception

{

String url="http://localhost:8080/axis2/services/SayHello";

org.tonyzhangcn.ws.sayhello.SayHelloStub stub = new org.tonyzhangcn.ws.sayhello.SayHelloStub(url); // the

org.tonyzhangcn.ws.sayhello.SayHelloRequest request = (org.tonyzhangcn.ws.sayhello.SayHelloRequest) getTestObject(org.tonyzhangcn.ws.sayhello.SayHelloRequest.class);

request.setSayHelloRequest("tonyzhangcn");

System.out.println(stub.SayHello(request).getSayHelloResponse());

// todo Fill in the param14 here

assertNotNull(stub.SayHello(request));

}

B.從菜單中選擇“Run>Run as->JUnit Test”

testcase

     可以看到web 服務已經正確的返回了結果。那麼,不用TestCase類可以調用WebServices嗎?答案是肯定的,我們可以隨便些一個帶有main方法的類,並仿照SayHelloTest.java中的testSayHello()方法就可以達到調用Web Services的目的了。

 

在我實際操作工程中,還遇到了兩個問題:

一個是缺少xalan包中的jar文件,

解決辦法:從官網(http://apache.mirror.phpchina.com/xml/xalan-j/binaries/)下載xalan-j_2_7_0-bin.zip,將xalan-j_2_7_0-bin.zip/xalan-j_2_7_0 目錄下的Jar包全都添加進Tomcat的webapps/axis2/WEB-INF/lib目錄中就好了

一個是在自動產生的JUnit Test類中有兩個方法,都要實現,

解決辦法:可以去掉一個方法。

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