本文的讀者應(yīng)有JAVA web 應(yīng)用開發(fā)基礎(chǔ)。應(yīng)該具有看過WSDL,SOAP,XML等的基本規(guī)范。熟悉Eclipse+MyEclipse開發(fā)環(huán)境。
本文可以隨意轉(zhuǎn)載使用,但是要保留作者的署名。
一、環(huán)境準備
使用Axis來開發(fā)Web services 需要準備 web 服務(wù)器,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:可以到官方網(wǎng)站下載(本文為3.2+5.0GA)
1.2安裝
A.首先搭建開發(fā)環(huán)境,需要將下載到的Eclipse解壓縮到一個目錄。
B.將下載到的Axis 的兩個plug-in解壓縮到Eclipse安裝目錄下的plug-in子目錄。
C.安裝MyEclipse5.0GA。然后啟動MyEclipse,并選擇“File->New->Other”可以找到下面的這些Wizards,這些將是本文中用到的很重要的工具。
D.下面開始搭建Web Services的部署環(huán)境。將下載的
tomcat報解壓縮到一個目錄。完成web container
的安裝。
E.將axis2.war包拷貝到tomcat安裝目錄下的webapps
目錄中。
F.啟動Tomcat(windows 下為TOMCA_HOME/bin中的startup.bat;Linux,unix環(huán)境為startup.sh文件),打開瀏覽器輸入并訪問:http://ip:port/axis2來查看。(如果沒有進行陪孩子文件的修改此地址應(yīng)該為http://localhost:8080/axis2),如果能看到下面的頁面則說明已經(jīng)安裝完成。
二、Quick Start
環(huán)境準備好后,先從一個簡單的例子開始。以便對使用Axis來開發(fā)Web services的大致流程有個了解。這個例子就是SayHello,請求端輸入一個名字字符串,返回的將是一個問候語。
例如:輸入了Tom,那么返回的事Hi,Tom.How are you?
2.1編寫WSDL
A.啟動MyEclipse,新建立一個WebApps(File->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”進入下一步。
D.將目標命名空間設(shè)置為“http://ws.tonyzhangcn.org/SayHello/”.在生成代碼的時候一般以這個命名空間為package的名字,例如:org.tonyzhangcn.ws.sayhello。這些值可以按需要設(shè)置。
E.點擊“Finish”按鈕就可以看到MyEclipse提供的WSDL 設(shè)計器的界面了。可以看到設(shè)計器為WSDL默認的添加了一個現(xiàn)操作。
即圖中的“NewOperation”。現(xiàn)在將其改名為SayHello,如下圖:
之后點擊設(shè)計界面中的“Source”Tab來查看其代碼。如下:可以看到我們定義了一個SayHello的Web Services,她提供了一個SayHello的方法,她能夠接受一個String(事實上是tns:SayHelloRequest對象,她對String進行了封裝)類型的輸入?yún)?shù)SayHelloRequest并返回一個String(事實上是tns:SayHelloResponse對象,她對String進行了封裝)類型的SayHelloResponse結(jié)果。更多關(guān)于WSDL的信息,請參考W3C的規(guī)范文檔。
<?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的編寫已經(jīng)完成。
2.2從WSDL生成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”進入下一步。設(shè)置如下:
C.點擊“next”進入下一個頁面,設(shè)置“Output path”為本Project的src目錄。點擊“finish”后代在SayHello項目上按F5刷新就可以看到有代碼生成好了。但是能看到一堆紅“x”,這是由于沒有將Axis2的jar包放入class path 中以及源代碼的package不為org.tonyzhangcn.ws.sayhello引起的。
下面解決這個問題,首先選擇“SayHello”項目,并右擊選擇“Build path->Add External Archives..”,選擇上面部署在tomcat中的axis2 web應(yīng)用WEB-INF/lib目錄中的所有jar包。之后右擊“src.org.tonyzhangcn.ws.sayhello”項目,選擇“Refactor->rename”,做如下修改,并選擇OK完成。
這個時候發(fā)現(xiàn)test.org.tonyzhangcn.ws.sayhello下面的SayHelloTest.java仍然存在問題。點擊此文件中package 關(guān)鍵子前面的紅“x”,會提示有兩個選項,我們選擇下面的那個。
選擇public class SayHelloTest前的紅“x”,選擇第一項。
進行完這幾個改動之后,生成的代碼就沒有問題了。其中
SayHelloRequest,SayHelloResponse是輸入輸出參數(shù)對象。
SayHelloSkeleton是服務(wù)端對象,用來編寫業(yè)務(wù)邏輯調(diào)用。
SayHelloStub是客戶端用來定位endpoint(就是發(fā)布的Web Services的地址)的類,客戶端根據(jù)其提供的方法定位Web服務(wù)并發(fā)起調(diào)用
SayHelloMessageReceiverInOut是一個實現(xiàn)同步調(diào)用的web服務(wù)信息轉(zhuǎn)換處理類。
Resources目錄下的services.xml文件是webservices的描述文件。
SayHelloTest是一個客戶端的TestCase示例,用戶可以根據(jù)這個示例來編寫自己的客戶端調(diào)用類。
2.3編寫業(yè)務(wù)代碼
打開SayHelloSKeleton.java文件將其中的實現(xiàn)方法
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文件所在目錄(本項目應(yīng)該是WebRoot下面WEB-INF/classes),“Next”進入下一步。
C.選擇WSDL文件所在目錄,此處為src目錄下的SayHello.wsdl文件。“Next”,再“Next”。選擇services.xm文件,本文應(yīng)該是生成再src/resources下面的services.xml文件。之后選取“Generate the services.xml automatically”,然后再點擊一下使其變?yōu)榉沁x中狀態(tài),之后點擊“Back”按鈕,再點擊一次“Next”。(注意:這里本應(yīng)該不是這么來回折騰的,但是我的機器上只有這樣操作finish按鈕才能生效。懷疑這是一個bug,如果讀到此文的用戶沒有這種情況,忽略此提示)
D.點擊“Next”,將記入最后一個頁面,此處有兩個選項,一個是輸出目錄一個是處處文件名稱。我這里的輸出文件名稱給的是SayHello。點擊“Finish”完成。
2.5部署
A.將打包好的文件SayHello.jar(或者可以改名為SayHello.aar),拷貝到Tomcat中已經(jīng)部署的Axis2應(yīng)用的WEB-INF/services目錄下面。
B.啟動Tomcat(即點擊Tomcat安裝目錄下的startup.bat,linux或unix下執(zhí)行startup.sh)。
C.打開瀏覽器,輸入http://ipaddress:port/axis2(一般為http://localhost:8080/axis2),并點擊其中的“services”鏈接
可以看到SayHello已經(jīng)被部署。點擊SayHello提供的連接可以看到與之對應(yīng)的WSDL。
2.6調(diào)用測試
A.修改SayHelloTest.java文件中的方法testSayHello的內(nèi)容為:
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”。
可以看到web 服務(wù)已經(jīng)正確的返回了結(jié)果。那么,不用TestCase類可以調(diào)用WebServices嗎?答案是肯定的,我們可以隨便些一個帶有main方法的類,并仿照SayHelloTest.java中的testSayHello()方法就可以達到調(diào)用Web Services的目的了。
在我實際操作工程中,還遇到了兩個問題:
一個是缺少xalan包中的jar文件,
解決辦法:從官網(wǎng)(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目錄中就好了
一個是在自動產(chǎn)生的JUnit Test類中有兩個方法,都要實現(xiàn),
解決辦法:可以去掉一個方法。