日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用axis2进行WebService的开发

發(fā)布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用axis2进行WebService的开发 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用axis2進行WebService的開發(fā)

Apache Axis2 是 Apache Axis SOAP 項目的后繼項目。此項目是 Web 服務(wù)核心引擎的重要改進,目標(biāo)是成為 Web 服務(wù)和面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)的下一代平臺。
axis2 WebService開發(fā)分為服務(wù)端開發(fā)與客戶端開發(fā),服務(wù)端開發(fā)為對外提供服務(wù),客戶端開發(fā)為用戶調(diào)用外部接口進行業(yè)務(wù)處理。

一、下載與安裝

1.下載

下載地址:http://axis.apache.org/axis2/java/core/download.cgi
有以下下載列表:
Binary Distribution zip | MD5 | PGP?
Source Distribution zip | MD5 | PGP?
WAR Distribution zip | MD5 | PGP?
Documents Distribution zip | MD5 | PGP

注:
axis2-1.6.2-bin.zip里有axis2的jar包。
axis2-1.6.2-docs.zip里有詳細的幫助文檔。
axis2-1.6.2-src.zip里是源代碼。
axis2-1.6.2-war.zip里是axis的管理平臺,放到tomcat可直接使用。

注:本文用bin包進行命令行使用axis2,管理平臺使用的是war包。

2.安裝配置

將axis2-1.6.2-bin.zip解壓到本地目錄D:\axis2-1.6.2

設(shè)置環(huán)境變量。【注:前提需要配置java環(huán)境變量】
AXIS2_HOME 設(shè)置值 D:\axis2-1.6.2
Path 添加值 %AXIS2_HOME%\bin

二、服務(wù)端編寫

1.創(chuàng)建服務(wù)端的java項目testAsixServer。

編寫類City與類User代碼如下:

[java]?view plaincopy
  • package?com.hsinghsu.model;??
  • ??
  • public?class?City??
  • {??
  • ????private?int?cityCode;??
  • ??
  • ????private?String?cityName;??
  • ??
  • ????public?int?getCityCode()??
  • ????{??
  • ????????return?cityCode;??
  • ????}??
  • ??
  • ????public?void?setCityCode(int?cityCode)??
  • ????{??
  • ????????this.cityCode?=?cityCode;??
  • ????}??
  • ??
  • ????public?String?getCityName()??
  • ????{??
  • ????????return?cityName;??
  • ????}??
  • ??
  • ????public?void?setCityName(String?cityName)??
  • ????{??
  • ????????this.cityName?=?cityName;??
  • ????}??
  • ??
  • }??
  • [java]?view plaincopy
  • package?com.hsinghsu.model;??
  • ??
  • public?class?User??
  • {??
  • ????private?int?id;??
  • ??
  • ????private?String?name;??
  • ??
  • ????private?String?password;??
  • ??
  • ????private?City?city;??
  • ??
  • ????public?int?getId()??
  • ????{??
  • ????????return?id;??
  • ????}??
  • ??
  • ????public?void?setId(int?id)??
  • ????{??
  • ????????this.id?=?id;??
  • ????}??
  • ??
  • ????public?String?getName()??
  • ????{??
  • ????????return?name;??
  • ????}??
  • ??
  • ????public?void?setName(String?name)??
  • ????{??
  • ????????this.name?=?name;??
  • ????}??
  • ??
  • ????public?String?getPassword()??
  • ????{??
  • ????????return?password;??
  • ????}??
  • ??
  • ????public?void?setPassword(String?password)??
  • ????{??
  • ????????this.password?=?password;??
  • ????}??
  • ??
  • ????public?City?getCity()??
  • ????{??
  • ????????return?city;??
  • ????}??
  • ??
  • ????public?void?setCity(City?city)??
  • ????{??
  • ????????this.city?=?city;??
  • ????}??
  • ??
  • }??
  • 編寫服務(wù)類UserService。該服務(wù)類即為對外提供的服務(wù),其中對外提供2個服務(wù)getUserById與getUserList,代碼如下:

    [java]?view plaincopy
  • package?com.hsinghsu.service;??
  • ??
  • import?java.util.ArrayList;??
  • import?java.util.List;??
  • ??
  • import?com.hsinghsu.model.User;??
  • ??
  • public?class?UserService??
  • {??
  • ????public?List<User>?getUserList(User?user)??
  • ????{??
  • ????????List<User>?list?=?new?ArrayList<User>();??
  • ??
  • ????????return?list;??
  • ????}??
  • ??
  • ????public?User?getUserById(int?id)??
  • ????{??
  • ????????User?user?=?new?User();??
  • ??
  • ????????return?user;??
  • ????}??
  • ??
  • }??
  • 2.發(fā)布WebService服務(wù)

    發(fā)布WebService服務(wù)方式可使用axis2管理平臺發(fā)布,本文另添加使用soapUI發(fā)布WebService的測試服務(wù)。

    2.1 axis2管理平臺發(fā)布

    2.1.1 部署axis2管理平臺

    將axis2-1.6.1-war.zip壓縮包里面的axis2.war包解壓到tomcat的webapps目錄下,啟動tomcat,訪問地址http://127.0.0.1:8080/axis2/ ,即可訪問axis2的Welcome!頁面。
    訪問地址http://127.0.0.1:8080/axis2/services/listServices 另可訪問服務(wù)列表。

    2.1.2 部署開發(fā)服務(wù)

    編譯服務(wù)端項目testAsixServer后,將UserService.class文件放到tomcat\webapps\axis2\WEB-INF\pojo目錄中【注:若沒有pojo目錄,則手動新建該目錄】。
    在瀏覽器地址欄中輸入如下的URL:
    http://127.0.0.1:8080/axis2/services/listServices 即可訪問刷新后的服務(wù)列表?!咀?#xff1a;POJO類不能使用package關(guān)鍵字聲明包,若使用axis2管理平臺發(fā)布,則需要修改UserService類,去掉package字段?!?br />
    【注:發(fā)布WebService的pojo目錄只是默認的,如果想在其他的目錄發(fā)布WebService,可以打開axis2/WEB-INF/conf/axis2.xml文件,并在<axisconfig>元素中添加如下的子元素:
    <deployer extension=".class" directory="mydir" class="org.apache.axis2.deployment.POJODeployer"/>】

    訪問 http://127.0.0.1:8080/axis2/services/UserService?wsdl 即可訪問服務(wù)UserService的wsdl描述

    【注:另可使用jar cvf命令將服務(wù)打成aar包后導(dǎo)入到axis2管理平臺上使用。】

    2.2 使用soapUI生成WAR發(fā)布WebService測試服務(wù)

    ?

    2.2.1 由java生成wsdl文件

    運用Java2wsdl生成wsdl文件

    使用cmd命令,在命令行中輸入:
    java2wsdl -cn com.hsinghsu.service.UserService
    【注:在testAsixServer項目的classes根目錄下執(zhí)行】

    輸出:
    Using AXIS2_HOME: ? D:\axis2-1.6.2
    Using JAVA_HOME: ? ?C:\Program Files\Java\jdk1.6.0_01
    log4j:WARN No appenders could be found for logger (org.apache.axis2.util.Loader).
    log4j:WARN Please initialize the log4j system properly.

    結(jié)果:
    生成UserService.wsdl文件

    2.2.2 soapUI導(dǎo)出war包:

    在soapUI導(dǎo)入UserService.wsdl文件。
    通過soapUI生成MockService。
    啟動MockService,測試MockService時,在URL填寫http://HSING-PC:8088/mockUserServiceSoap11Binding 后點擊運行,查看是否有正確報文返回。
    soapUI發(fā)送報文如下:

    [html]?view plaincopy
  • <soapenv:Envelope?xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:ser="http://service.hsinghsu.com">??
  • ???<soapenv:Header/>??
  • ???<soapenv:Body>??
  • ??????<ser:getUserById>??
  • ?????????<!--Optional:-->??
  • ?????????<ser:id>2</ser:id>??
  • ??????</ser:getUserById>??
  • ???</soapenv:Body>??
  • </soapenv:Envelope>??
  • soapUI接收報文如下:

    [html]?view plaincopy
  • <soapenv:Envelope?xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:ser="http://service.hsinghsu.com"?xmlns:xsd="http://model.hsinghsu.com/xsd">??
  • ???<soapenv:Header/>??
  • ???<soapenv:Body>??
  • ??????<ser:getUserByIdResponse>??
  • ?????????<!--Optional:-->??
  • ?????????<ser:return>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:city>??
  • ???????????????<!--Optional:-->??
  • ???????????????<xsd:cityCode>001</xsd:cityCode>??
  • ???????????????<!--Optional:-->??
  • ???????????????<xsd:cityName>wh</xsd:cityName>??
  • ????????????</xsd:city>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:id>1</xsd:id>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:name>hsinghsu</xsd:name>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:password>123456</xsd:password>??
  • ?????????</ser:return>??
  • ??????</ser:getUserByIdResponse>??
  • ???</soapenv:Body>??
  • </soapenv:Envelope>??
  • 在soapUI中導(dǎo)出war包,如testUser.war。

    2.2.3 部署war包

    將war包部署到tomcat目錄下?!咀?#xff1a;需要修改war包里面的WEB-INF/soapui/testUser-soapui-project.xml文件引用wsdl文件的路徑】
    啟動tomcat,訪問在war所在的路徑如 http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding?WSDL ,即可查看wsdl描述文件
    【注:可以使用soapUI測試接口,在soapUI測試中,URL中填寫testUser.war的部署地址,如http://ip:port/testUser/mockUserServiceSoap11Binding ,點擊運行,查看對應(yīng)的接口是否有正確報文返回?!?br />

    三、客戶端編寫


    Axis2支持以下4種類型的客戶端:
    i. ?Block(阻塞式客戶端),即傳統(tǒng)客戶端。一旦服務(wù)被啟用,客戶端的應(yīng)用程序?qū)⒈粧炱?#xff0c;直到operation被執(zhí)行完畢(表現(xiàn)為收到一個response或fault),才能重新獲得控制權(quán)。這是調(diào)用Web Service最簡單的方式,并且這種方式適用于多數(shù)業(yè)務(wù)情形。
    ii. Non block(非阻塞式客戶端),即異步客戶端。使用Non-Blocking API來調(diào)用這些Web Services。Axis2提供給用戶一種基于回叫機制的non-blocking API,一旦服務(wù)被起用,客戶端應(yīng)用程序馬上得到控制權(quán),通過使用一個callback對象來獲得response。這種方式使得客戶端應(yīng)用程序可以很方便的同步啟用多個Web Service。
    iii.雙工(雙向傳輸)。以上的機制都使用單一的連接去發(fā)送請求和接收響應(yīng).這都明顯在性能上落后于使用兩條連接(單向或雙向)進行進行請求和響應(yīng)的傳輸 . 因此以上的機制都不能解決長時間運行的交易, 連接將在操作還沒完成就會超時. 一種解決方案是使用分開的兩條傳輸連接來傳輸請求和響應(yīng) . 我們叫這種方案為傳輸層異步。
    iv. 雙工非阻塞(雙向且非阻塞傳輸)。

    注:axis2 webservice client端需要的jar包有:

    [plain]?view plaincopy
  • axis2-kernel-1.6.1.jar??
  • axis2-adb-1.6.1.jar??
  • axiom-api-1.2.12.jar??
  • commons-logging-1.1.1.jar??
  • wsdl4j-1.6.2.jar??
  • XmlSchema-1.4.7.jar??
  • axiom-impl-1.2.12.jar??
  • neethi-3.0.1.jar??
  • axis2-transport-local-1.6.1.jar??
  • axis2-transport-http-1.6.1.jar??
  • commons-httpclient-3.1.jar??
  • httpcore-4.0.jar??
  • commons-codec-1.3.jar??
  • mail-1.4.jar???
  • 1.傳統(tǒng)客戶端【阻塞式客戶端的編寫】

    新建AsixBlockClient類,獲取數(shù)據(jù),代碼如下:

    [java]?view plaincopy
  • package?com.hsinghsu.asix.client;??
  • ??
  • import?org.apache.axiom.om.OMAbstractFactory;??
  • import?org.apache.axiom.om.OMElement;??
  • import?org.apache.axiom.om.OMFactory;??
  • import?org.apache.axiom.om.OMNamespace;??
  • import?org.apache.axis2.AxisFault;??
  • import?org.apache.axis2.addressing.EndpointReference;??
  • import?org.apache.axis2.client.Options;??
  • import?org.apache.axis2.client.ServiceClient;??
  • ??
  • /**?
  • ?*??
  • ?*?Block(阻塞式客戶端),即傳統(tǒng)客戶端調(diào)用WebService?Axis2的底層API來調(diào)用WebService?
  • ?*??
  • ?*?@author?hsinghsu?
  • ?*??
  • ?*/??
  • public?class?AsixBlockClient??
  • {??
  • ??
  • ????private?static?EndpointReference?targetEPR?=?new?EndpointReference(??
  • ????????????"http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding");//接口地址??
  • ??
  • ????public?static?void?main(String[]?args)??
  • ????{??
  • ????????Options?options?=?new?Options();??
  • ????????options.setAction("urn:getUserById");//調(diào)用接口方法??
  • ????????options.setTo(targetEPR);??
  • ????????ServiceClient?sender?=?null;??
  • ????????try??
  • ????????{??
  • ????????????sender?=?new?ServiceClient();??
  • ????????????sender.setOptions(options);??
  • ????????????OMFactory?fac?=?OMAbstractFactory.getOMFactory();??
  • ????????????OMNamespace?omNs?=?fac.createOMNamespace(??
  • ????????????????????"http://service.hsinghsu.com",?"");??
  • ????????????OMElement?method?=?fac.createOMElement("getUserById",?omNs);??
  • ????????????OMElement?name?=?fac.createOMElement("id",?omNs);//設(shè)置入?yún)⒚Q??
  • ????????????name.setText("1");//設(shè)置入?yún)⒅??
  • ????????????method.addChild(name);??
  • ????????????method.build();??
  • ????????????System.out.println("method:"?+?method.toString());//?print:<getUserById?xmlns="http://service.hsinghsu.com"><id>1</id></getUserById>??
  • ????????????OMElement?response?=?sender.sendReceive(method);??
  • ????????????System.out.println("response:"?+?response);??
  • ????????????OMElement?elementReturn?=?response.getFirstElement().getFirstElement().getFirstElement();??
  • ????????????System.out.println("cityCode:"+elementReturn.getText());??
  • ????????}??
  • ????????catch?(AxisFault?e)??
  • ????????{??
  • ????????????System.out.println("Error");??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ??
  • ????}??
  • ??
  • }??
  • 執(zhí)行結(jié)果如下:

    [plain]?view plaincopy
  • method:<getUserById?xmlns="http://service.hsinghsu.com"><id>1</id></getUserById>??
  • response:<ser:getUserByIdResponse?xmlns:ser="http://service.hsinghsu.com">??
  • ?????????<!--Optional:-->??
  • ?????????<ser:return>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:city?xmlns:xsd="http://model.hsinghsu.com/xsd">??
  • ???????????????<!--Optional:-->??
  • ???????????????<xsd:cityCode>001</xsd:cityCode>??
  • ???????????????<!--Optional:-->??
  • ???????????????<xsd:cityName>wh</xsd:cityName>??
  • ????????????</xsd:city>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:id?xmlns:xsd="http://model.hsinghsu.com/xsd">1</xsd:id>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:name?xmlns:xsd="http://model.hsinghsu.com/xsd">hsinghsu</xsd:name>??
  • ????????????<!--Optional:-->??
  • ????????????<xsd:password?xmlns:xsd="http://model.hsinghsu.com/xsd">123456</xsd:password>??
  • ?????????</ser:return>??
  • ??????</ser:getUserByIdResponse>??
  • cityCode:001??
  • 2.使用RPC方法調(diào)用WebService

    編寫AsixRPCClient.java類,獲取數(shù)據(jù)。注:添加User.java、City.java至項目中。
    AsixRPCClient.java代碼如下:

    [java]?view plaincopy
  • package?com.hsinghsu.asix.client;??
  • ??
  • import?javax.xml.namespace.QName;??
  • ??
  • import?org.apache.axis2.addressing.EndpointReference;??
  • import?org.apache.axis2.client.Options;??
  • import?org.apache.axis2.rpc.client.RPCServiceClient;??
  • ??
  • import?com.hsinghsu.model.User;??
  • ??
  • /**?
  • ?*?使用RPC方式調(diào)用WebService?
  • ?*??
  • ?*?@author?hsinghsu?
  • ?*??
  • ?*/??
  • public?class?AsixRPCClient??
  • {??
  • ??
  • ????/**?
  • ?????*?@param?args?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?throws?Exception??
  • ????{??
  • ????????//?使用RPC方式調(diào)用WebService??
  • ????????RPCServiceClient?serviceClient?=?new?RPCServiceClient();??
  • ????????Options?options?=?serviceClient.getOptions();??
  • ??
  • ????????EndpointReference?targetEPR?=?new?EndpointReference(??
  • ????????????????"http://127.0.0.1:8080/testUser/mockUserServiceSoap11Binding");//?指定調(diào)用WebService的URL??
  • ????????options.setTo(targetEPR);??
  • ??
  • ????????Object[]?opAddEntryArgs?=?new?Object[]{new?Integer(1)};//?指定getGreeting方法的參數(shù)值??
  • ??
  • ????????Class[]?classes?=?new?Class[]{User.class};//?指定getGreeting方法返回值的數(shù)據(jù)類型的Class對象??
  • ??
  • ????????QName?opAddEntry?=?new?QName("http://service.hsinghsu.com",??
  • ????????????????"getUserById");//?指定要調(diào)用的getGreeting方法及WSDL文件的命名空間??
  • ????????Object[]?objects?=?serviceClient.invokeBlocking(opAddEntry,??
  • ????????????????opAddEntryArgs,?classes);//?RPCServiceClient類的invokeBlocking方法調(diào)用了WebService中的方法。invokeBlocking方法有三個參數(shù),其中第一個參數(shù)的類型是QName對象,表示要調(diào)用的方法名;第二個參數(shù)表示要調(diào)用的WebService方法的參數(shù)值,參數(shù)類型為Object[];第三個參數(shù)表示W(wǎng)ebService方法的返回值類型的Class對象,參數(shù)類型為Class[]。當(dāng)方法沒有參數(shù)時,invokeBlocking方法的第二個參數(shù)值不能是null,而要使用new?Object[]{}。??
  • ??
  • ????????System.out.println("?objects?size-->:"?+?objects.length);??
  • ??
  • ????????if?(objects.length?>=?1)??
  • ????????{??
  • ????????????User?user?=?new?User();??
  • ????????????user?=?(User)?objects[0];??
  • ??
  • ????????????System.out.println("=="?+?user.getId()?+?"?=="?+?user.getName()??
  • ????????????????????+?"?=="?+?user.getCity().getCityName());??
  • ????????}??
  • ??
  • ????}??
  • ??
  • }??
  • 運行結(jié)果:
    ?objects size-->:1[Ljava.lang.Object;@ba5c7a
    ==1 ==hsinghsu ==wh

    3.使用Stub方式調(diào)用WebService

    運用wsdl2java簡化客戶端,使用Stub方式調(diào)用WebService

    3.1 生成STUB文件。

    在cmd中用 wsdl2java生成stub文件。注:在wsdl文件目錄下執(zhí)行
    輸入:
    wsdl2java -uri UserService.wsdl
    【注:默認adb生成方式,同步生成方式,加參數(shù)-a則使用異步生成】

    輸出:
    Using AXIS2_HOME: ? D:\axis2-1.6.2
    Using JAVA_HOME: ? ?C:\Program Files\Java\jdk1.6.0_01
    Retrieving document at 'UserService.wsdl'.
    log4j:WARN No appenders could be found for logger (org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder).
    log4j:WARN Please initialize the log4j system properly.

    結(jié)果:
    生成build.xml、UserServiceStub.java、UserServiceCallbackHandler.java文件

    3.2 編寫同步調(diào)用函數(shù)

    編寫AsixServiceStub類,獲取數(shù)據(jù)。
    AsixServiceStub.java代碼如下:

    [java]?view plaincopy
  • package?com.hsinghsu.asix.client;??
  • ??
  • import?com.hsinghsu.service.UserServiceStub;??
  • import?com.hsinghsu.service.UserServiceStub.GetUserById;??
  • import?com.hsinghsu.service.UserServiceStub.User;??
  • ??
  • /**?
  • ?*?利用axis2插件生成客戶端方式調(diào)用?wsdl2java簡化客戶端的編寫?
  • ?*??
  • ?*?@author?hsinghsu?
  • ?*??
  • ?*/??
  • public?class?AsixServiceStub??
  • {??
  • ??
  • ????public?static?void?main(String[]?args)?throws?Exception??
  • ????{??
  • ??
  • ????????UserServiceStub?stub?=?new?UserServiceStub();??
  • ????????GetUserById?guid?=?new?GetUserById();??
  • ????????guid.setId(1);??
  • ????????User?user?=?stub.getUserById(guid).get_return();//?同步調(diào)用方式??
  • ??
  • ????????if?(null?!=?user)??
  • ????????{??
  • ????????????System.out.println("=="?+?user.getId()?+?"?=="?+?user.getName()??
  • ????????????????????+?"?=="?+?user.getCity().getCityName());??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????System.out.println("user?null");??
  • ????????}??
  • ??
  • ????}??
  • ??
  • }??
  • 運行結(jié)果:
    ==1 ==hsinghsu ==wh

    注:添加UserServiceStub.java、UserServiceCallbackHandler.java文件至項目中,注意修改UserServiceStub.java類中服務(wù)的地址。

    注:若需要使用異步調(diào)用,則需創(chuàng)建異步回調(diào)類AsynCallback,該類需要繼承UserServiceCallbackHandler抽象類,實現(xiàn)回調(diào)函數(shù)receiveResultgetUserById接口。在AsixServiceStub中,只需要使用stub.startgetUserById(guid, new AsynCallback());執(zhí)行即可。

    轉(zhuǎn)載于:https://www.cnblogs.com/toSeeMyDream/p/6674500.html

    總結(jié)

    以上是生活随笔為你收集整理的使用axis2进行WebService的开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。