WebService流行框架之Axis和CXF


 

前言

上節課我們對WebService進行了簡單的介紹,對於其所應用到的技術有了一定的了解。今天主要講解下WebService的兩個流行的框架AxisCXF

 

正題

一、服務端發布WebService

在講解之前,我們先來看一下這篇博客主要講解的內容:


    每一種框架都有自己的特點,有自己的側重,但是他們的共同之處在於對發布WebService進行了封裝,所以我們只需編寫一個配置文件或者使用@WebService注解就可以發布WebService,我們這里着重說一下他們各自的特點:


1.Axis1

Axis1有兩種發布方式:

1JWS方式

a.這種方式很簡單,只需要將源碼java文件放到AXIS_HOME下面,然后將后綴改為.jws,這樣,Axis 會自動編譯.jws文件,並把它自動加入到Java WebServie的服務中。


b.但是這種方式的缺點是:只能是java源代碼,同時類中不能含有包名。

 

2WSDD方式

1.寫一個java類(需要引入axis的jar包)


2.配置web.xml文件(配置AxisServletAdminServletSOAPMonitorServiceAxisHTTPSessionListener


3.寫一個deloy.wsdd文件,部署項目(tomcat啟動就可以部署項目)

 

安裝axis1到tomcat:

1.Axis官方網站:http://ws.apache.org/axis/,可以在官網下載最新1.4的包:axis-bin-1_4.zip


2.將解壓后的axis-1_4\webapps\下的axis目錄考到%TOMCAT_HOME%/Webapps/目錄下


3.啟動tomcat后在瀏覽器里輸入http://localhost:port/axis


4.點擊上圖中的Validataion鏈接,頁面上會提示已經有的包和缺少的包的信息,根據提示將必須的包下載全,

將這些類包復制到%tomcathome%/webapps/axis/WEB-INF/lib/目錄下

重新啟動tomcat,直到Validation頁面中看不到有Error與Warning的提示信息。

 

2.Axis2

客戶端對於數據類型的不同有兩種調用方式:RPCServiceClient和OMAbstractFactory方式

1)RPC方式:

處理基本的數據類型,如String,int等

 

2)OM方式:

可處理基本數據類型和自定義數據類型(比如java實體對象):通過xml的參數形式進行傳遞(傳遞的參數需要轉換為OMElement)

 

注:如果參數或返回值是List類型則需要進行手動處理轉換(手動編寫一個服務端對傳遞過來的參數進行處理,將傳過來的OMElement手動轉換為List類型,調用執行方法,然后將返回的List類型再轉換為OMElement傳回客戶端)

 

Axis2發布文件(編寫services.xml

1.將官網下載的axis2.war包拷貝到tomcat_home/webapps下,運行即會解壓


2.將其conf,modules和services文件夾拷貝到項目的WEB-INF下面,並將lib下的jar包拷貝到web-inf/lib下面


3.配置Web.xml(配置AxisServletAxisAdminServlet


4.編寫services下面的services.xml文件,指定要發布的類

 

3.CXF

CXF發布WebService有三種方式:main方式,基於和不基於Spring發布到容器

1main方式

引入jar包,在接口和實現類上使用@WebService即可,發布完成后即可在瀏覽器中訪問url,不需要啟動tomcat等服務。

 

2)不基於Spring方式發布到容器

a)引入cxfjar包,編寫web.xml(配置自定義的CXFServlet,該CXFServlet需要繼承CXFNonSpringServlet


b)編寫實體類,業務類和服務類(實體類需要和服務類在同一包下,否則報錯)


c)啟動Tomcat,即可發布服務

 

3)基於Spring方式發布到容器

a)web.xml配置(Spring配置,cxf封裝的CXFServlet配置)


b)applicationContext-server.xml配置

<!--Import apache CXF bean definition 固定-->

<importresource="classpath:META-INF/cxf/cxf.xml" />

<importresource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

<importresource="classpath:META-INF/cxf/cxf-servlet.xml" />

 

<!--services接口配置 -->

<beanid="helloServicesBean"class="com.ms.services.impl.HelloServicesImpl" />

<!--CXF 配置WebServices的服務名及訪問地址 -->

<jaxws:serverid="helloServices" address="/HelloServices"

serviceClass="com.ms.services.IHelloServices">

<!--要暴露的webservice服務 -->

<jaxws:serviceBean>

<refbean="helloServicesBean"/>

</jaxws:serviceBean>

</jaxws:server>

 

c)編寫類

實體類

服務接口(類頭使用@WebService)

服務實現(類頭使用@WebService(endpointInterface="com.ms.services.IHelloServices"))

 

以上是關於AxisCXF發布特點及其需要注意的地方,是我做例子時的總結,有興趣的同學可以下載源碼

 

 

二、客戶端調用WebService

服務端將接口發布成功后,就等着客戶端來進行調用了,客戶端如何並通過什么方式來調用我們服務端發布的wsdl文件呢?

 

1.調用一次WebService的本質:


 

1.客戶端把調用方法參數,轉換生成XML文檔片段(SOAP消息,input消息,該文檔片段必須符合WSDL定義的格式),通過網絡,把XML文檔片段傳給服務器

 

2.服務器接收到XML文檔片段,解析XML文檔片段,提取其中的數據,並把數據轉換調用WebService所需要的參數值。

 

3.服務器執行方法。

 

4.把執行方法得到的返回值,再次轉換生成為XML文檔片段(SOAP消息,output消息)——該文檔片段必須符合WSDL定義的格式,通過網絡,把XML文檔片段傳給客戶端。

 

5.客戶端接收到XML文檔片段,解析XML文檔片段,提取其中數據,並把數據轉換調用WebService的返回值。

 

從上面調用本質來看,要一個語言支持WebService,唯一的要求是:該語言支持XML文檔解析、生成、支持網絡傳輸。

 

2.客戶端調用方式:

客戶端調用服務端方法總體來說有三種方式:

 

1DIIDynamic Invocation Interface

采用直接調用方式,可以在程序中設置諸多的調用屬性,使用較為靈活,但是調用過程卻相對繁瑣復雜,易造成代碼膨脹且可重用性低,每次調用不同的Web Service都要重復進行大量編碼。

 

這也是我們比較常用的一種方法,就是調用invoke方法,傳入方法名和方法參數即可。

 

2Stubs

JAX-RPC使用靜態的Stub方式包裝對底層接口的調用,從而提供一種更為簡便的調用方式。使用該方式需要利用支持環境(比如Axis)所提供的工具根據WSDL預生成WebService客戶端的實現代碼。因此如果服務的WSDL發生變化,就必須重新生成新的客戶端代碼並進行重新部署。

 

該方法需要使用wsdl2java命令來預生成WebService客戶端代碼,為了支持該命令,需要安裝一些環境。

 

3Dynamic Proxy

動態代理(Dynamic Proxy)的方法實現對Web Service的動態調用,可以在運行時根據用戶定義的Client端接口創建適配對象。從而避免了直接操作底層的接口,減少了客戶端的冗余,屏蔽了調用相關的復雜性。

 

該方法主要在於客戶端接口,該客戶端接口需要繼承java.rmi.Remote接口,然后將服務端的接口中的方法copy過來。

 

 

小結:

從發展歷史角度來看,很容易理解他們的側重點,Axis1最早,所以注重的只是簡單的發布接口即可,之后隨之Axis2對其進行了優化,可以支持自定義參數,但並不完善,所以CXF的出現對這一功能進行了完善並且適應了潮流,實現了與Spring的集成,跟這些比起來,EJB3中對於WebService的支持只需要使用一個@WebService即可完成,所以軟件的開發是讓使用者變傻,而我們學習這些是為了理解其原理和本質。


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM