axis2開發實例
主要參考《axis2之webservice新手超詳細教程http://wenku.baidu.com/view/6eae036d011ca300a6c390a4.html》 myeclipse的axis2插件:《Axis2_Codegen_Wizard_1.3.0 和Axis2_Service_Archiver_1.3.0》 |
第一部分 環境搭建
1. 環境搭建(jdk,tomcat,myeclipse已安裝前提下)
(1) 下載Axis2服務包:axis2-1.6.2-bin.zip,axis2-1.6.2-war.zip,分別解壓到D:\webservice_axis2,將axis2-1.6.2-war.zip解壓后的axis2.war放到tomcat的D:\tomcat-6.0.18\tomcat-6.0.18\webapps下,重啟tomcat,
訪問http://localhost:8080/axis2/,能看到頁面內容,如果不能訪問,查看tomcat端口是否8080
(2) 下載myeclipse的axis2插件Axis2_Codegen_Wizard_1.3.0 和Axis2_Service_Archiver_1.3.0,一個是幫助我們生成aar文件的,另一個是幫我們用wsdl文件生成stub代碼的。解壓后將axis2插件包下的Axis2_Codegen_Wizard_1.3.0和Axis2_Service_Archiver_1.3.0文件夾拷貝至Myeclipse8.5\dropins 目錄下,重啟myeclipse生效
2.代碼開發:本實例練習基本參數、bean,數組bean
作為入參和回參的情況,能滿足大部分項目需求
(1) 新建web工程Axis2Service,創建入參回參bean(注意紅色部分)
Student.java
package com.my.bean; import java.io.Serializable; /** * 注意:Student類一定要實現序列化接口,否則無法正常傳輸至客戶端 * * @author zyix * */ public class Student implements Serializable { private static final long serialVersionUID = 677484458789332877L;
private int id; private int number; private String name; private String tel; private String address; //生成setter,getter省略 } |
(3) 創建service,用於發布
MyService.java
package com.my.service; import java.util.Arrays; import com.my.bean.Student; /* * WebService測試類 */ public class MyService {
// 測試歡迎方法,基本參數 public String getGreeting(String name) { return "你好" + name; }
// 入參為bean public String AddStudent(Student student) { if (null != student) { return "你好" + student.getName(); } return "student is null"; }
// 回參為bean public Student queryStudent() { Student st = new Student(); st.setId(1000000120); st.setNumber(20130678); st.setName("Mr Wang"); st.setTel("1385465656"); st.setAddress("bejing"); return st; }
// 入參為數組 public String AddStudents(Student[] students) { if (null != students) { return "你好" + Arrays.toString(students); } return "students is null"; }
// 回參為數組 public Student[] queryStudents() { Student[] sts = new Student[2]; Student st = new Student(); st.setId(1000000120); st.setNumber(20130678); st.setName("Mr Wang"); st.setTel("1385465656"); st.setAddress("bejing");
Student st2 = new Student(); st2.setId(1000000122); st2.setNumber(201306782); st2.setName("Mr Wang2"); st2.setTel("1385465652"); st2.setAddress("bejing2");
sts[0] = st; sts[1] = st2; return sts; } } |
3.發布service
(1)右鍵工程名Axis2Service--NewàOther,選擇Axis2 Service Archiver,
(2)打包編譯文件,指向編譯好的service文件位置,一般都是XXX\WebRoot\WEB-INF\classes,選擇E:\workspaces_8.5\Axis2Service\WebRoot\WEB-INF\classes目錄,記得紅色標記處的勾選取消掉
Ps:這里指定位置都是WEB-INF\classes目錄,因為第(4)步填寫的service包路徑就是相對於此目錄的
(3)下一步略過wsdl文件選擇,下一步選擇依賴的的jar文件,沒有可不用選擇,下一步自動設置service.xml配置文件,
(4)下一步,填寫需要發布的webservice名稱以及對外開放的服務類名稱(自定義),服務類名稱前面要帶包名,(需要手動填寫service路徑,點擊Load)
勾選Search declared method only,可以在下面的列表框中看見我們對外發布的方法名
(5)下一步,指定發布service到tomcat的axis2項目容器中,這里選擇D:\tomcat-6.0.18\tomcat-6.0.18\webapps\axis2\WEB-INF\services;
Ps:本質就是將自動打成的my_service.aar放到上述路徑;其實可以先指定其他路徑,生成后,再手動放置需要的容器中。
(6)啟動tomcat,訪問http://localhost:8080/axis2/services/listServices,即可看到新發布的service:MyService,點擊MyService鏈接,得到wsdl文件。
至此發布完成。
第二部分 使用客戶端測試webservice
(1) 新建web工程Axis2Client,引入axis2的lib包,如D:\webservice_axis2\axis2-1.6.2-bin\axis2-1.6.2\lib
(2) 根據wsdl生成客戶端,有兩種方式
方式一:使用myeclipse的axis2插件Axis2 Code Generator生成客戶端
方式二:使用基本的命令行方式
Ps:本人使用方式一生成的代碼不能夠編譯,提示student類有問題;因此采用方式二:
(3)方式二:制作《根據wsdl生成java代碼.bat》
1.在D:\webservice_axis2中,已有axis2-1.6.2-bin,目標wsdl文件如Axis2Wsdl.wsdl
新建根據wsdl生成java代碼.bat,內容如下:
set JAVA_HOME=D:\Program Files\Java\jdk1.6.0_10 set AXIS2_HOME=D:\webservice_axis2\axis2-1.6.2-bin\axis2-1.6.2
set Output_Path=Testclient
set Package=com.webservice.client
set Wsdl_File=D:\webservice_axis2\Axis2Wsdl.wsdl
%AXIS2_HOME%\bin\wsdl2java -uri %Wsdl_File% -p %Package% -s -o %Output_Path% ::一定要設置JAVA_HOME ::其中-url參數指定了wsdl文件的路徑,可以是本地路徑,也可以是網絡路徑。如 http://localhost:8080/axis2/services/SimpleService?wsdl ::-p參數指定了生成的Java類的包名 ::-o參數指定了生成的一系列文件保存的根目錄 @echo -------------OK-----------------
@echo ---The code has been created in the folder: Testclient---
@pause |
綠色部分都是根據實際設置,執行批處理腳本生成的客戶端代碼會在Testclient中;
(3) 將Testclient中的src下的文件覆蓋到項目Axis2Client的src下;新建測試代碼
Test.java
package com.client.test;
import com.webservice.client.MyServiceStub; import com.webservice.client.MyServiceStub.AddStudent; import com.webservice.client.MyServiceStub.AddStudentResponse; import com.webservice.client.MyServiceStub.AddStudents; import com.webservice.client.MyServiceStub.AddStudentsResponse; import com.webservice.client.MyServiceStub.GetGreeting; import com.webservice.client.MyServiceStub.GetGreetingResponse; import com.webservice.client.MyServiceStub.QueryStudent; import com.webservice.client.MyServiceStub.QueryStudentResponse; import com.webservice.client.MyServiceStub.QueryStudents; import com.webservice.client.MyServiceStub.QueryStudentsResponse; import com.webservice.client.MyServiceStub.Student;
public class Test { public static void main(String[] ss) { // 設置遠程服務調用地址 String target = "http://127.0.0.1:8080/axis2/services/MyService";
try { // 根據地址構造用戶存根 MyServiceStub stub = new MyServiceStub(target);
// 1. 調用getGreeting方法,設置入參對象及屬性,入參,回參為基本類型String GetGreeting getGreeting = new GetGreeting(); getGreeting.setName("hello"); GetGreetingResponse ggr = stub.getGreeting(getGreeting); // 接收方法返回值 String getResult = ggr.get_return(); System.out.println(getResult);
// 2. 調用AddStudent方法,設置入參對象及屬性,入參為bean AddStudent addStudent = new AddStudent(); Student student = new Student(); student.setAddress("shanghai"); student.setId(123456); student.setName("servyou"); student.setNumber(12321312); student.setTel("13678956529"); addStudent.setStudent(student); AddStudentResponse asr = stub.addStudent(addStudent); // 接收方法返回值 String addResult = asr.get_return(); System.out.println(addResult);
// 3. 調用queryStudent方法,設置入參對象及屬性,回參為bean QueryStudent queryStudent = new QueryStudent(); QueryStudentResponse qsr = stub.queryStudent(queryStudent); // 接收方法返回值 Student qsResult = qsr.get_return(); System.out.println("地址:" + qsResult.getAddress() + ", ID:" + qsResult.getId() + ", 姓名:" + qsResult.getName() + ", 號碼:" + qsResult.getNumber() + ", 電話:" + qsResult.getTel());
// 4. 調用queryStudents方法,設置入參對象及屬性,返回bean數組 QueryStudents queryStudents = new QueryStudents(); QueryStudentsResponse qssr = stub.queryStudents(queryStudents); // 接收方法返回值 Student[] qssResult = qssr.get_return(); for (int i = 0; i < qssResult.length; i++) { System.out.println("地址:" + qssResult[i].getAddress() + ", ID:" + qssResult[i].getId() + ", 姓名:" + qssResult[i].getName() + ", 號碼:" + qssResult[i].getNumber() + ", 電話:" + qssResult[i].getTel()); }
// 5. 調用AddStudents方法,設置入參對象及屬性,入參為bean數組 AddStudents addStudents = new AddStudents();
Student st = new Student(); st.setAddress("shanghai"); st.setId(123456); st.setName("servyou"); st.setNumber(12321312); st.setTel("13678956529");
Student st2 = new Student(); st2.setAddress("shanghai"); st2.setId(123456); st2.setName("servyou"); st2.setNumber(12321312); st2.setTel("13678956529");
addStudents.addStudents(st); addStudents.addStudents(st2);
AddStudentsResponse assr = stub.addStudents(addStudents); // 接收方法返回值 String addstsResult = assr.get_return(); System.out.println(addstsResult);
} catch (Exception e) { e.printStackTrace(); } }
} |
第三部分 備注信息
備注:發布可以不生成arr文件,好處在於:經常改動代碼或者添加安全控制模塊如wss4j,因為經常改動 services.xml,所以這種情況最好不打包;否則最好打包發布
方法:
(1) 在/WEB-INF/services新建HelloWorldService(最好命名跟service命名一樣,便於識別);
(2) 在HelloWorldService新建META-INF目錄,在META-INF中建立services.xml文件
<service name="HelloWordService"> <description> Please Type your service description here </description> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> </messageReceivers> <parameter name="ServiceClass">com.service.HelloWorldService</parameter> </service> |
至此測試完畢
第四部分 補充
(1) 項目中僅需要使用WebService來傳遞簡單類型的數據,有時也需要傳遞更復雜的數據,這些數據可以被稱為復合類型的數據。 (2) 數組和類(接口)是比較常用的復合類型;在傳遞類的對象實例時,除了直接將數組類型聲明成相應的類戒接口,也可以將對象實例迚行序列化,也就是說,將一個對象實例轉換成字節數組迚行傳遞,然后接收方再迚行反序列化,還原這個對象實例。 (3) webservice不支持復雜的集合類傳遞,譬如list和map,需要轉化為數組類型或者axis2里的axiom對象模型。axiom對象模型感興趣的同學可搜索資料進一步學習 |
實際項目中可以支持webservice服務,也可以支持其他服務如http,axis1.4的webservice等,由於Axis2需要發布到axis2工程,因此實際開發時,可以在自己的web工程開發,只有需要提供webservice服務時,才做成aar包放到axis2項目中。