利用AXIS開發Webservice

因爲工作關係需要從事Webservice的開發工作,公司的webserivce是由Apache的AXIS來實現的,以前對這個瞭解不算多,不過經過幾天的研究,特奉上小小的心得一篇。

        先介紹下本人開發環境吧。 JDK 1.4.2 Myeclipse 6.0(實在經不起誘惑,嚐嚐鮮) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在http://ws.apache.org/axis/ 找到。 假設所有的環境你已經搭好,並且AXIS包也已經下好了。OK, Here we go~

         解壓axis-bin-1_4.zip這個包可以看到webapps目錄,雙擊進入把裏面的AXIS文件夾拷到 %TOMCAT_HOME%\webapps目錄下,之後拷貝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%\webapps\axis\WEB-INF\lib目錄下。啓動tomcat,訪問http://localhost:8080/axis/happyaxis.jsp  如果訪問成功,恭喜你!基本的配置你已經做完了。

PS:此處的%TOMCAT_HOME%指的是Tomcat的安裝目錄,至於那另外的三個jar包,J2EE 1.4庫裏就能找的到。

        現在來說一下最關鍵的Webservice的發佈。AXIS提供了兩種發佈方式,一種是即時發佈(Instant Deployment),另外一種是定製發佈(Custom Deployment)。即時發佈提供了一種非常簡單的webservice的發佈方式,但是其中限制太多,因此在實際的開發中定製發佈纔是首選。這裏也將會以定製發佈爲重點來介紹。

     1.即時發佈 JWS (Java Web Service) Files - Instant Deployment     

    即時發佈提供了一種非常簡單發佈方式,發佈者只要有Java源代碼(也就是.java文件),然後把其後綴名改成jws(也就是 java web service的縮寫)拷貝到%TOMCAT_HOME%\webapps\axis目錄下即完成了所有的發佈工作。AXIS的編譯引擎會處理接下來的所有事情。下面是一段示例代碼:

java 代碼
  1. public   class  HelloAXIS {   
  2.        
  3.      public  String Hello(String name){   
  4.          return   "AXIS say hello to "  name;   
  5.     }   
  6.  

        把 HelloAXIS.java 文件改成 HelloAXIS.jws 然後拷貝到%TOMCAT_HOME%\webapps\axis目錄下,啓動Tomcat之後訪問 http://localhost:8080/axis/HelloAXIS.jws  如果能看到 Click to see the WSDL這個超鏈接就說明已經發布成功了,點擊進去就可以看到這個Webservice的WSDL描述文件。server端的發佈已經完成了,接下來就是編寫Client端測試代碼了。

java 代碼
  1. package  com.chnic.test;   
  2.   
  3. import  java.net.URL;   
  4.   
  5. import  javax.xml.namespace.QName;   
  6.   
  7. import  org.apache.axis.client.Call;   
  8. import  org.apache.axis.client.Service;   
  9.   
  10. public   class  Test {   
  11.        
  12.      public   static   void  main(String[] args)  throws  Exception{   
  13.         String targetEendPoint  "http://localhost:8080/axis/HelloAXIS.jws"   
  14.         Service service  new  Service();   
  15.         Call call (Call) service.createCall();               
  16.         call.setOperationName( new  QName(targetEendPoint,  "Hello" ));   
  17.         call.setTargetEndpointAddress( new  URL(targetEendPoint));   
  18.         String result (String) call.invoke( new  Object[]{ "Robert" });   
  19.         System.out.println(result);   
  20.     }   
  21. }   

       測試代碼很簡單,如果熟悉java反射機制的朋友不用兩分鐘就能看明白。運行後客戶端控制檯出現 AXIS say hello Robert。測試成功。果然很簡單吧。不過在這簡單背後卻是以犧牲靈活性爲代價的。假如你現在手裏只有.class 或者一個jar包,jws就不再能滿足你的需求了,最要命的就是即時發佈不支持帶包的類,這點AXIS的用戶手冊上寫的也很明白。

 Important: JWS web services are intended for simple web services. You cannot use packages in the pages, and as the code is compiled at run time you can not find out about errors until after deployment. Production quality web services should use Java classes with custom deployment.

 

      2.定製發佈 Custom Deployment - Introducing WSDD

      比起即時發佈定製發佈更加煩瑣也更復雜,但是換來的卻是更大的靈活性,因此在實際項目中定製發佈還是不二的選擇。定製發佈需要你自己編寫一個WSDD(Web Service Deployment Descriptor)文件,這個東東類似與XML稍後會做出介紹。廢話不多說,我們來看代碼:

 

java 代碼
  1. package  com.chnic.webservice;   
  2.   
  3. public   class  HelloWorld {   
  4.        
  5.      public  HelloWorld(){   
  6.            
  7.     }   
  8.        
  9.      public  String hello(String str){   
  10.          return   "Hello "  str;   
  11.     }   
  12.        
  13.      public   int  add( int  a,  int  b){   
  14.          return  b;   
  15.     }   
  16.        
  17. }   

        一個帶包的很簡單的類,在eclipse下編譯後按照包名拷到 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes 目錄下。以這個類爲例,拷貝完之後這個HelloWorld.class的路徑就是 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PS:如果嫌這樣太麻煩,可以另外建一個Java Web工程用myeclipse的發佈工具發佈到Tomcat之後,整體一次性拷貝到websericve的工程中。

       接下來就需要編寫發佈文件deploy.wsdd。到%TOMCAT_HOME%\webapps\axis\WEB-INF 目錄下建立這個文件並在其中添加如下內容:

xml 代碼
  1. < deployment   xmlns = http://xml.apache.org/axis/wsdd/  
  2.             xmlns:java = "http://xml.apache.org/axis/wsdd/providers/java" >   
  3.        
  4.      < service   name = "HelloWorld"   provider = "java:RPC" >   
  5.          < parameter   name = "className"   value = "com.chnic.webservice.HelloWorld" />   
  6.          < parameter   name = "allowedMethods"   value = "*" />        
  7.     </ service >   
  8. </ deployment >   

       簡單的介紹下各個節點的含義,"HelloWorld"當然是這個webservice的名字,後面緊跟的java:RPC指的是服務類型。這裏一共有有4種類型,分別是:RPC, Document, Wrapped 和 Message。有興趣可以看下 org.apache.axis.providers這個包和子包下面的類的API文檔。之後的parameter節點第一個當然是指出具體的類,第二個從字面上也很好理解:允許調用的方法。這裏的配置告訴引擎可以調用所有的public方法,當然你也可以自己指定。

     編寫完配置發佈文件之後,cmd打開windows的控制檯,進入%TOMCAT_HOME%\webapps\axis\WEB-INF目錄下鍵入如下命令  

  1. java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd  

       之後控制檯返回Processing file deploy.wsdd 和 Done processing 這兩段話即說明發布成功。(此時會在同級目錄生成一個server-config.wsdd文 )在這裏的AdminClient是AXIS提供的一個客戶端管理工具。至於java.ext.dirs的含義可以去了解一下classloader和JVM類裝載機制方面的知識,在這裏就不多解釋。 還有一點要注意的是在發佈的時候Tomcat服務必須處於啓動狀態,否則就會拋出一堆無法連接的異常信息。發佈成功之後你可以通過訪問 http://localhost:8080/axis/servlet/AxisServlet 來查看你所有的定製發佈的服務。

客戶端測試代碼
  1. String targetEendPoint  "http://localhost:8080/axis/services/HelloWorld" ;   
  2. Service service  new  Service();   
  3. Call call (Call) service.createCall();   
  4. call.setTargetEndpointAddress( new  URL(targetEendPoint));   
  5.   
  6. call.setOperationName( new  QName(targetEendPoint,  "hello" ));        
  7. String result (String) call.invoke( new  Object[]{ "Robert" });   
  8. System.out.println(result);   
  9.   
  10. call.setOperationName( new  QName(targetEendPoint,  "add" ));   
  11. Integer res (Integer) call.invoke( new  Object[]{ new  Integer( 1 ),  new  Integer( 2 )});   
  12. System.out.println( "The result is: "  res);  

       運行測試代碼,控制檯顯示 Hello Robert 和 The result is: 3 這兩句話,說明發布成功。仔細觀察下發現其實除了那個targetEndpoint 之外,即時發佈和定製發佈的客戶端調用代碼基本上都是一樣的。定製發佈的URL可以在WSDL文件裏找到。

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