axis 開發webservice

摘要:本節主要用於介紹使用axis開發webservice,包括服務端的創建、webservice的部署、客戶端的調用。

preparation:

 說明:相關的可能要了解SOAP(簡單對象訪問協議)、WSDL(web服務描述語言)、XML(可擴展標記語言)、axis(阿帕奇可擴展交互系統)等相關知識。

1.下載axis的jar包,請到apache官網或者在百度自行下載,然後導入jar包,不清楚的話導入所有的jar包就好了。(本人用的是axis1的版本,因爲項目中用的是axis1的版本)

2.webservice客戶端生成工具genclient.bat(後面會對這個工具做一個簡單的說明)

之前介紹沒有說明本機的環境,現在把本機環境羅列一下:

系統:XP  myeclipse:6.5  tomcat:5.X  JDK:1.5

     生成webservice的方式有XFire、Jax-WS、axis等,使用axis調用webservi有三種方式:動態調用接口、使用動態代理Dynamic Proxy、使用從WSDL生成的存根generated Stubs from Service WSDL description,由於本人工作中使用的是axis,調用webservice的方式用到的有動態調用接口、使用從WSDL生成的存根generated Stubs from Service WSDL description,故本節只介紹用axis調用webservice的這兩種方式。後續的拓展部分根據需要再說。

start:

第一步:服務器端的開發

(1)開發java文件

代碼如下:

接口文件:IBbossGroupInfoService.java

複製代碼
 1 package com.asiainfo.b2p.soap.interfaces;
2
3 import java.rmi.RemoteException;
4
5 public interface IBbossGroupInfoService {
6
7 // 根據集團編號查詢集團基本信息
8 /**
9 * 集團編號 GROUP_NUM 集團名稱 GROUP_NAME 公司地址 CO_ADDR 集團狀態 GROUP_STATE 集團開戶時間
10 * START_TIME 傳真 FAX 企業網址 WEB_URL 證件類型 CARD_TYPE 證件號碼 CARD_CODE
11 * 公司郵編CO_POSTCODE 聯繫電話 TEL_NUM 法人代表名稱 PERSON_NAME 發展類型 DEVELOP_TYPE
12 * 地區編碼REGION_ID regionId
13 *
14 * @throws Exception
15 */
16 public abstract String groupInfo(long groupNo) throws Exception,
17 RemoteException;
18
19 // 根據集團編號查詢集團訂購歷史
20 public abstract String groupSubHistoryInfo(long groupNo) throws Exception;
21
22 }
複製代碼

 實現類:IBbossGroupInfoServiceImpl.java

複製代碼
 1 package com.asiainfo.b2p.soap.impl;
2
3 import org.apache.commons.logging.Log;
4 import org.apache.commons.logging.LogFactory;
5 import com.asiainfo.b2p.soap.interfaces.IBbossGroupInfoService;
6
7 /**
8 * @Product esop_dev
9 * @FileName IBbossGroupInfoServiceImpl.java
10 * @History TODO 根據集團編號,查詢集團基本信息、集團用戶信息、集團訂購歷史
11 * @Version 1.0.0
12 * @Date Nov 22, 2011
13 * @Author pantaipeng
14 * @Content 最初版本
15 */
16 public class IBbossGroupInfoServiceImpl implements IBbossGroupInfoService {
17 private static transient Log log = LogFactory
18 .getLog(IBbossGroupInfoServiceImpl.class);
19
20
21 // 根據集團編號查詢集團基本信息
22 public String groupInfo(long groupNo) throws Exception, RemoteException {
23 log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集團編號=" + groupNo);
24 //方法體我省略了,爲了測試我僅加入一句打印語句
25 System.out.println("我是一個公共的方法,作用是根據集團編號查詢集團基本信息");
26 String xml="<message>public_groupInfo</message>";//爲了測試,返回的信息我也是隨便寫的一個字符串
27 return xml;
28 }
29
30 // 根據集團編號查詢集團訂購歷史
31 public String groupSubHistoryInfo(long groupNo) throws Exception {
32
33 log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集團編號=" + groupNo);
34 //方法體我省略了,爲了測試我僅加入一句打印語句
35 System.out.println("我是一個公共的方法,作用是根據集團編號查詢集團訂購歷史");
36 String xml="<message>public_groupSubHistoryInfo</message>";//爲了測試,返回的信息我也是隨便寫的一個字符串
37 return xml;
38 }
39 }
複製代碼

      說明:爲了更加的接近實際的開發,這個是本機上運行的程序,實現的功能是通過一個編號查詢相關信息拼成一個字符串,方法體的部分我刪除了,你需要用這個代碼的話,直接拷貝修改包名稱就可以直接用了。

(2)wsdd文件

wsdd文件只需加入一列幾行(前提是你之前已經有wsdd文件了,沒有的話可以在下載的apache的demo中拷貝一個):

1 <service name="GroupInfoService" type=""  provider="java:RPC">
2 <parameter name="className" value="com.asiainfo.b2p.soap.impl.IBbossGroupInfoServiceImpl" ></parameter>
3 <parameter name="allowedMethods" value="*"/>
4 </service>

      這個文件放在項目的WEB-INF下面。<service>標籤的name屬性是發佈的webservice的名稱,可以自己命名,第一個<parameter>標籤的value屬性指定實現類的完整路徑,包括類名。其他的地方默認就好。

(3)配置web.xml文件

複製代碼
1   <servlet>
2 <servlet-name>AxisServlet</servlet-name>
3 <display-name>Apache-Axis Servlet</display-name>
4 <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
5 </servlet>
6 <servlet-mapping>
7 <servlet-name>AxisServlet</servlet-name>
8 <url-pattern>/services/*</url-pattern>
9 </servlet-mapping>
複製代碼

指定處理類以及映射就好,如果像這樣配置的話,後面再寫webservice的話,這個文件就不用再配置了。

第二步:客戶端的開發

(1).動態調用接口

代碼如下:

複製代碼
 1 package test.webserviceclient;
2
3 import java.net.MalformedURLException;
4 import java.net.URL;
5 import java.rmi.RemoteException;
6 import javax.xml.rpc.ParameterMode;
7 import javax.xml.rpc.ServiceException;
8 import org.apache.axis.client.Call;
9 import org.apache.axis.encoding.XMLType;
10
11 public class Test {
12 /**
13 * 通過genClient.bat文件生成的webservice客戶端調用webservice服務的步驟如下:
14 * 1.創建service對象
15 * 2.創建url對象
16 * 3.創建call對象,
17 * 4.調用webservice的方法
18 */
19 public static void test1() {
20 try {
21 // 1.創建service對象,通過axis自帶的類創建
22 org.apache.axis.client.Service service = new org.apache.axis.client.Service();
23
24 // 2.創建url對象
25 String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";//請求服務的URL
26 URL url = new URL(wsdlUrl);//通過URL類的構造方法傳入wsdlUrl地址創建URL對象
27
28 // 2.創建服務方法的調用者對象call,設置call對象的屬性
29 Call call = (Call) service.createCall();
30 call.setTargetEndpointAddress(url);//給call對象設置請求的URL屬性
31 String serviceName = "groupInfo";
32 call.setOperationName(serviceName);//給call對象設置調用方法名屬性
33 call.addParameter("groupNo", XMLType.XSD_LONG, ParameterMode.IN);// 給call對象設置方法的參數名、參數類型、參數模式
34 call.setReturnType(XMLType.SOAP_STRING);// 設置調用方法的返回值類型
35
36 //4.通過invoke方法調用webservice
37 long groupNo = 2100000014L;
38 String res = (String) call.invoke(new Object[] { groupNo });//調用服務方法
39 System.out.println(res);
40 } catch (MalformedURLException e) {
41 e.printStackTrace();
42 } catch (ServiceException e) {
43 e.printStackTrace();
44 } catch (RemoteException e) {
45 e.printStackTrace();
46 }
47 }
48
49 public static void main(String[] args) {
50 test1();
51 }
52
53 }
複製代碼

代碼中的註釋很詳細,我就不介紹了。

(2).使用從WSDL生成的存根generated Stubs from Service WSDL description

第一步:配置genclient.bat文件

右鍵單擊“編輯”打開bat文件如下(爲了便於說明,每行的意思我就直接寫在後面了):

set Axis_Lib=E:\esop\lib       -----指定工程的lib目錄
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%  -----默認
set Output_Path=E:\esop\src   -----指定工程的src目錄
set Package=com.asiainfo.maks.webservices.pbosswebclient -----指定生成的四個文件的存放位置
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package%  ----- 默認http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl   -----指定wsdl文件的路徑

第二步:用genclient.bat生成四個客戶端類

雙擊編譯好的bat文件,執行後生成的四個java類如下:

 第三步:寫測試類調用webservice

複製代碼
 1 package test.webserviceclient;
2
3 import java.net.MalformedURLException;
4 import java.net.URL;
5 import java.rmi.RemoteException;
6 import javax.xml.rpc.ParameterMode;
7 import javax.xml.rpc.ServiceException;
8 import org.apache.axis.client.Call;
9 import org.apache.axis.encoding.XMLType;
10
11 public class Test {
12 /**
13 * 通過genClient.bat文件生成的webservice客戶端調用webservice服務的步驟如下:
14 * 先介紹創建的四個文件分別爲:
15 * IBbossGroupInfoServiceImpl 定義了web服務接口,
16 * IBbossGroupInfoServiceImplService 定義了用戶獲取web服務接口的方法
17 * IBbossGroupInfoServiceImplServiceLocator 接口IBbossGroupInfoServiceImplService的具體實現
18 * GroupInfoServiceSoapBindingStub web服務客戶端樁,通過該類與服務器交互,該類實現了IBbossGroupInfoServiceImpl接口
19 * 1.創建service對象
20 * 2.創建url對象
21 * 3.創建client對象
22 * 4.調用webservice的方法
23 */
24 public static void test1() {
25 // 1.創建一個service對象
26 IBbossGroupInfoServiceImplService service = new IBbossGroupInfoServiceImplServiceLocator();
27
28 try {
29 // 2.創建一個URL對象,傳入wsdl的地址夠過URL的構造方法創建
30 String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";
31 URL url = new URL(wsdlUrl);
32
33 // 3創建一個client對象
34 IBbossGroupInfoServiceImpl client = service
35 .getGroupInfoService(url);
36
37 // 4調用webservice的方法
38 long groupNo = 2100000014L;
39 String res = client.groupInfo(groupNo);
40
41 System.out.println(res);
42
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (ServiceException e) {
46 e.printStackTrace();
47 } catch (RemoteException e) {
48 e.printStackTrace();
49 }
50
51 }
52
53 public static void main(String[] args) {
54 test1();
55 }
56
57 }
複製代碼

 對這種生成客戶端四個類的情況我要說明下,還有通過wsdltojava命令的方式生成客戶端類,但是這個都是一種通過axis調用webservice的方式,既然有工具我們爲什麼不用呢?

所以能使用wsdltojava命令的方式,我就不介紹了。

test result:

代碼的測試截圖我就不貼了,感興趣的可以試試看。

《!--好久沒有上來活動了,今天寫的是最近用到的一個東東,本人也是個菜鳥,剛剛在項目中用到webservice,如果有不對的,請各位大俠指正。--》

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