使用axis開發(fā)webservice詳解
摘要:本節(jié)主要用于介紹使用axis開發(fā)webservice,包括服務端的創(chuàng)建、webservice的部署、客戶端的調用。
preparation:
說明:相關的可能要了解SOAP(簡單對象訪問協(xié)議)、WSDL(web服務描述語言)、XML(可擴展標記語言)、axis(阿帕奇可擴展交互系統(tǒng))等相關知識。
1.下載axis的jar包,請到apache官網或者在百度自行下載,然后導入jar包,不清楚的話導入所有的jar包就好了。(本人用的是axis1的版本,因為項目中用的是axis1的版本)
2.webservice客戶端生成工具genclient.bat(后面會對這個工具做一個簡單的說明)
之前介紹沒有說明本機的環(huán)境,現在把本機環(huán)境羅列一下:
系統(tǒng):XP myeclipse:6.5 tomcat:5.X JDK:1.5
生成webservice的方式有XFire、Jax-WS、axis等,使用axis調用webservi有三種方式:動態(tài)調用接口、使用動態(tài)代理Dynamic Proxy、使用從WSDL生成的存根generated Stubs from Service WSDL description,由于本人工作中使用的是axis,調用webservice的方式用到的有動態(tài)調用接口、使用從WSDL生成的存根generated Stubs from Service WSDL description,故本節(jié)只介紹用axis調用webservice的這兩種方式。后續(xù)的拓展部分根據需要再說。
start:
***步:服務器端的開發(fā)
(1)開發(fā)java文件
代碼如下:
接口文件:IBbossGroupInfoService.java
- package com.asiainfo.b2p.soap.interfaces;
- import java.rmi.RemoteException;
- public interface IBbossGroupInfoService {
- // 根據集團編號查詢集團基本信息
- /**
- * 集團編號 GROUP_NUM 集團名稱 GROUP_NAME 公司地址 CO_ADDR 集團狀態(tài) GROUP_STATE 集團開戶時間
- * START_TIME 傳真 FAX 企業(yè)網址 WEB_URL 證件類型 CARD_TYPE 證件號碼 CARD_CODE
- * 公司郵編CO_POSTCODE 聯系電話 TEL_NUM 法人代表名稱 PERSON_NAME 發(fā)展類型 DEVELOP_TYPE
- * 地區(qū)編碼REGION_ID regionId
- *
- * @throws Exception
- */
- public abstract String groupInfo(long groupNo) throws Exception,
- RemoteException;
- // 根據集團編號查詢集團訂購歷史
- public abstract String groupSubHistoryInfo(long groupNo) throws Exception;
- }
實現類:IBbossGroupInfoServiceImpl.java
- package com.asiainfo.b2p.soap.impl;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import com.asiainfo.b2p.soap.interfaces.IBbossGroupInfoService;
- /**
- * @Product esop_dev
- * @FileName IBbossGroupInfoServiceImpl.java
- * @History TODO 根據集團編號,查詢集團基本信息、集團用戶信息、集團訂購歷史
- * @Version 1.0.0
- * @Date Nov 22, 2011
- * @Author pantaipeng
- * @Content 最初版本
- */
- public class IBbossGroupInfoServiceImpl implements IBbossGroupInfoService {
- private static transient Log log = LogFactory
- .getLog(IBbossGroupInfoServiceImpl.class);
- // 根據集團編號查詢集團基本信息
- public String groupInfo(long groupNo) throws Exception, RemoteException {
- log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集團編號=" + groupNo);
- //方法體我省略了,為了測試我僅加入一句打印語句
- System.out.println("我是一個公共的方法,作用是根據集團編號查詢集團基本信息");
- String xml="<message>public_groupInfo</message>";//為了測試,返回的信息我也是隨便寫的一個字符串
- return xml;
- }
- // 根據集團編號查詢集團訂購歷史
- public String groupSubHistoryInfo(long groupNo) throws Exception {
- log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>集團編號=" + groupNo);
- //方法體我省略了,為了測試我僅加入一句打印語句
- System.out.println("我是一個公共的方法,作用是根據集團編號查詢集團訂購歷史");
- String xml="<message>public_groupSubHistoryInfo</message>";//為了測試,返回的信息我也是隨便寫的一個字符串
- return xml;
- }
- }
說明:為了更加的接近實際的開發(fā),這個是本機上運行的程序,實現的功能是通過一個編號查詢相關信息拼成一個字符串,方法體的部分我刪除了,你需要用這個代碼的話,直接拷貝修改包名稱就可以直接用了。
(2)wsdd文件
wsdd文件只需加入一列幾行(前提是你之前已經有wsdd文件了,沒有的話可以在下載的apache的demo中拷貝一個):
- <service name="GroupInfoService" type="" provider="java:RPC">
- <parameter name="className" value="com.asiainfo.b2p.soap.impl.IBbossGroupInfoServiceImpl" ></parameter>
- <parameter name="allowedMethods" value="*"/>
- </service>
這個文件放在項目的WEB-INF下面。<service>標簽的name屬性是發(fā)布的webservice的名稱,可以自己命名,***個<parameter>標簽的value屬性指定實現類的完整路徑,包括類名。其他的地方默認就好。
(3)配置web.xml文件
- <servlet>
- <servlet-name>AxisServlet</servlet-name>
- <display-name>Apache-Axis Servlet</display-name>
- <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>AxisServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
指定處理類以及映射就好,如果像這樣配置的話,后面再寫webservice的話,這個文件就不用再配置了。
第二步:客戶端的開發(fā)
(1).動態(tài)調用接口
代碼如下:
- package test.webserviceclient;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.rmi.RemoteException;
- import javax.xml.rpc.ParameterMode;
- import javax.xml.rpc.ServiceException;
- import org.apache.axis.client.Call;
- import org.apache.axis.encoding.XMLType;
- public class Test {
- /**
- * 通過genClient.bat文件生成的webservice客戶端調用webservice服務的步驟如下:
- * 1.創(chuàng)建service對象
- * 2.創(chuàng)建url對象
- * 3.創(chuàng)建call對象,
- * 4.調用webservice的方法
- */
- public static void test1() {
- try {
- // 1.創(chuàng)建service對象,通過axis自帶的類創(chuàng)建
- org.apache.axis.client.Service service = new org.apache.axis.client.Service();
- // 2.創(chuàng)建url對象
- String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";//請求服務的URL
- URL url = new URL(wsdlUrl);//通過URL類的構造方法傳入wsdlUrl地址創(chuàng)建URL對象
- // 2.創(chuàng)建服務方法的調用者對象call,設置call對象的屬性
- Call call = (Call) service.createCall();
- call.setTargetEndpointAddress(url);//給call對象設置請求的URL屬性
- String serviceName = "groupInfo";
- call.setOperationName(serviceName);//給call對象設置調用方法名屬性
- call.addParameter("groupNo", XMLType.XSD_LONG, ParameterMode.IN);// 給call對象設置方法的參數名、參數類型、參數模式
- call.setReturnType(XMLType.SOAP_STRING);// 設置調用方法的返回值類型
- //4.通過invoke方法調用webservice
- long groupNo = 2100000014L;
- String res = (String) call.invoke(new Object[] { groupNo });//調用服務方法
- System.out.println(res);
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (ServiceException e) {
- e.printStackTrace();
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- test1();
- }
- }
代碼中的注釋很詳細,我就不介紹了。
(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文件,執(zhí)行后生成的四個java類如下:
第三步:寫測試類調用webservice
- package test.webserviceclient;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.rmi.RemoteException;
- import javax.xml.rpc.ParameterMode;
- import javax.xml.rpc.ServiceException;
- import org.apache.axis.client.Call;
- import org.apache.axis.encoding.XMLType;
- public class Test {
- /**
- * 通過genClient.bat文件生成的webservice客戶端調用webservice服務的步驟如下:
- * 先介紹創(chuàng)建的四個文件分別為:
- * IBbossGroupInfoServiceImpl 定義了web服務接口,
- * IBbossGroupInfoServiceImplService 定義了用戶獲取web服務接口的方法
- * IBbossGroupInfoServiceImplServiceLocator 接口IBbossGroupInfoServiceImplService的具體實現
- * GroupInfoServiceSoapBindingStub web服務客戶端樁,通過該類與服務器交互,該類實現了IBbossGroupInfoServiceImpl接口
- * 1.創(chuàng)建service對象
- * 2.創(chuàng)建url對象
- * 3.創(chuàng)建client對象
- * 4.調用webservice的方法
- */
- public static void test1() {
- // 1.創(chuàng)建一個service對象
- IBbossGroupInfoServiceImplService service = new IBbossGroupInfoServiceImplServiceLocator();
- try {
- // 2.創(chuàng)建一個URL對象,傳入wsdl的地址夠過URL的構造方法創(chuàng)建
- String wsdlUrl = "http://10.10.146.82:8080/esop_dev/services/GroupInfoService?wsdl";
- URL url = new URL(wsdlUrl);
- // 3創(chuàng)建一個client對象
- IBbossGroupInfoServiceImpl client = service
- .getGroupInfoService(url);
- // 4調用webservice的方法
- long groupNo = 2100000014L;
- String res = client.groupInfo(groupNo);
- System.out.println(res);
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (ServiceException e) {
- e.printStackTrace();
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- test1();
- }
- }
對這種生成客戶端四個類的情況我要說明下,還有通過wsdltojava命令的方式生成客戶端類,但是這個都是一種通過axis調用webservice的方式,既然有工具我們?yōu)槭裁床挥媚兀?/p>
所以能使用wsdltojava命令的方式,我就不介紹了。
test result:
代碼的測試截圖我就不貼了,感興趣的可以試試看。
《!--好久沒有上來活動了,今天寫的是最近用到的一個東東,本人也是個菜鳥,剛剛在項目中用到webservice,如果有不對的,請各位大俠指正。--》
原文鏈接:http://www.cnblogs.com/java-pan/archive/2011/11/25/axis_webservice.html
【編輯推薦】