一、開發環境和軟體下載
開發環境是:Eclipse3.4 + JDK1.6 + Tomcat6.0 + Axis2 1.3。這些軟體都是各個軟體最新版本,下載方式由於軟體網站的更新,地址也會更新,這裡就不再貼出來了,就請讀者到相應網站下載。
軟體下載和安裝:
(1) JDK1.6環境變數配置:
JAVA_HOME: C:\Program Files\Java\jdk1.6.0_07,其中C:\Program Files\Java是我的JDK安裝目錄。
Path: %JAVA_HOME%\bin
Classpath: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
(2) tomcat6.0環境變數配置:
CATALINA_HOME:C:\Program Files\Apache Software Foundation\Tomcat 6.0, 其中C:\Program Files\Apache Software Foundation是我的Tomcat 6.0安裝目錄。
其實這裡tomcat6.0不需要配置環境變數,因為最新版本不需要配置。
(3) Axis2 1.3下載:從[url]http://apache.justdn.org/ws/axis2/1_4_1/[/url]網站上下載axis2-1.3-war.zip 。將其解壓,把其中的axis2.war檔案複製到tomcat的webapps目錄下即可完成Axis2的安裝。
安裝完成後,啟動tomcate,在地址欄內輸入[url]http://localhost:8080/axis2/[/url],開啟如介面,表明安裝正確:
(4) Eclipse3.4下載:到[url]www.eclipse.org[/url]官方網站下載,直接解壓後配置Windows/Preference中的JDK即可。
(5) 下載Eclipse Axis2外掛程式:axis2-eclipse-codegen-wizard-1.4.zip和axis2-eclipse-codegen-wizard-1.4.zip。是:[url]http://apache.justdn.org/ws/axis2/tools/1_4_1/ [/url] 這兩個外掛程式解壓到Eclipse安裝目錄下plugins中即可。開啟Eclipse,選擇File/New/Other功能表項目,看到如下介面表明安裝成功:
安裝這兩個外掛程式的目的是:方便產生Axis2服務和產生Axis2用戶端,這裡我使用了無Stub方式的用戶端調用服務,因此就不示範產生Axis2用戶端的功能了。
二、構建服務
在開發環境及 Axis2 環境搭建好後,我們便可著手 Web Services 服務的開發:1.建立要發布的Web Service
(1)在 Eclispse 中添加一個使用者庫命名為 axis2 ,將 axis2\lib 下的包均添加進來。這一步操作的目的是為了以後工程添加 axis2 所需的 jar 檔案方便。
(2) 建立一個 JavaProject 命名為 ws ,將 axis2 使用者庫加入到 build
path 中。
(3) 現在開始編寫要發布的 WebSevice ,在 src 中建包 briup ,建立 Hello 類如下:
package briup;public class Hello { public String sayHello(String user) { return "Hello, " + user; }}
2.發布Web Service
打包要發布的 Service , Eclipse 中 New
--> File --> Other --> Axis2 wizards --> Axis2 Services Archiver ,按照嚮導選擇剛建立的類編譯後的 class 檔案。
(1)選擇 class 檔案目錄,注意,不是 java 源檔案,而是 classes 目錄,這裡需要注意由於你的類是帶包briup的,因此不要選到包這個目錄。
(2)連按兩次 “Next>” ,選中 “Generate the service xml automatically”(3)按下一步,輸入 service 名稱和類名,我這裡輸入的服務名是:ws;類名是我們剛剛寫的類名:briup.Hello,這裡需要注意加入完整的包名。(4) 按下一步,輸入 service 檔案的儲存路徑和檔案名稱,完成。選擇組建目錄為:C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\axis2\WEB-INF\services,也可以選擇其他目錄,然後copy到這一目錄下。3.測試Web Service開啟[url]http://localhost:8080/axis2/services/listServices[/url]頁面,可以看到ws服務,點擊進到ws的wsdl頁面:[url]http://localhost:8080/axis2/services/ws?wsdl[/url],表明服務部署正確。
三、編寫用戶端代碼調用服務我的這個例子與其他例子最大的不同就在這裡,其他例子一般需要根據剛才的服務wsdl產生用戶端stub,然後通過stub來調用服務,這種方式顯得比較單一,用戶端必須需要stub存根才能夠訪問服務,很不方面。本例子的用戶端不採用stub方式,而是一種實現通用的調用方式,不需要任何用戶端存根即可訪問服務。只需要指定對於的web servce地址、操作名、參數和函數傳回型別即可。代碼如下:
package briup;import javax.xml.namespace.QName;import org.apache.axis2.AxisFault;import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;import org.apache.axis2.rpc.client.RPCServiceClient;public class WsClient { private RPCServiceClient serviceClient; private Options options; private EndpointReference targetEPR; public WsClient(String endpoint) throws AxisFault { serviceClient = new RPCServiceClient(); options = serviceClient.getOptions(); targetEPR = new EndpointReference(endpoint); options.setTo(targetEPR); } public Object[] invokeOp(String targetNamespace, String opName, Object[] opArgs, Class<?>[] opReturnType) throws AxisFault, ClassNotFoundException { // 設定操作的名稱 QName opQName = new QName(targetNamespace, opName); // 設定傳回值 //Class<?>[] opReturn = new Class[] { opReturnType }; // 操作需要傳入的參數已經在參數中給定,這裡直接傳入方法中調用 return serviceClient.invokeBlocking(opQName, opArgs, opReturnType); } /** * @param args * @throws AxisFault * @throws ClassNotFoundException */ public static void main(String[] args) throws AxisFault, ClassNotFoundException { // TODO Auto-generated method stub final String endPointReference = "http://localhost:8080/axis2/services/ws"; final String targetNamespace = "http://briup"; WsClient client = new WsClient(endPointReference); String opName = "sayHello"; Object[] opArgs = new Object[]{"Repace中心"}; Class<?>[] opReturnType = new Class[]{String[].class}; Object[] response = client.invokeOp(targetNamespace, opName, opArgs, opReturnType); System.out.println(((String[])response[0])[0]); }}
運行該程式,點擊Run As->Java application,可以看到控制台連接埠的輸出是:Hello, Repace中心 表明用戶端調用成功。該例子最大的不同和優勢表現在用戶端的調用方式,或者說是發起服務調用的方式,雖然比起用戶端stub存根的方式,代碼稍多,但是這種方式統一,不需要生產stub存根代碼,解決了用戶端有很多類的問題。如果讀者對這些代碼進一步封裝,我想調用方式很簡單,只需要傳遞相關參數,這更好地說明了服務調用的優勢。而且這種方式更加簡單明了,一看便知具體含義。而不需要弄得stub類的一些機制。
備忘:本文轉載自:http://panpan.blog.51cto.com/489034/119204/