傳智播客-web service(6)-即時發佈與定製發佈、wsdl文檔與java對象

即時發佈與定製發佈
Axis開發WS應用有兩種發佈方案:即時發佈與定製發佈。
1、即時發佈:開發這類服務時,只用編寫源碼,不用編譯。源碼一般放在項目的根目錄下,擴展名改爲jws即可。訪問時通過完整路徑(包括jws擴展名)直接訪問該文件。訪問時容器會對該服務類源碼進行實時編譯,編譯後的文件放在生成的/WEB-INF/jwsClass目錄下。

 

需要注意的是,即時發佈的服務類不能有包名。爲什麼呢?
因爲jws文件也可以放在/項目名/aaa/目錄下,因此可以通過http://localhost:8080/ 項目名/aaa/xxx.jws訪問該服務,而此時實時編譯的class文件放在jwsClass/aaa下,如果jws服務類帶有包名,那麼實時編譯時容器會混淆“目錄”和“包”。

 

2、定製發佈:java類允許有包名。第一次發佈時需要藉助客戶端的WSDD(Web Service Deploy Description)文件,該文件可以放在客戶端項目的任意目錄下,然後用Adming Client命令將WSDD文件上傳給服務器(如果是myeclispe這樣的IDE,可以利用工具調用AdminClient類的main方法)第一次發佈後便會在服務端的/WEB-INF目錄下自動生成一個server-config.wsdd文件,以後即使客戶端的wsdd文件被刪除了也可以(不知道是不是個bug,畢竟只有第一次需要,還是作爲服務端的初始化??)。

 

需要明白的是,即時WS項目部署到了tomcat這樣的web容器上,也不意味着就對外發布了WS服務。此外,通過地址訪問服務時,需要在公開的服務名稱之前加services/,當然也可以在配置文件中更改,不過一般沒這個必要。

 

類似一般web應用,WS應用也有“範圍”的概念,不過只有session和application兩種;WS應用中的Handler則類似web應用的filter機制。

 

默認情況下axis服務器只能接受本機的管理請求。如需遠程訪問的話,需要修改Server-config.wsdd文件:
<parameter name="enableRemoteAdmin" value="true"/>

 

wsdl文檔與java對象
Axis用三種方式支持WSDL:url+?wsdl方式獲得自動生成的wsdl文檔;wsdlL2java工具能夠通過wsdl文檔生成java客戶端存根和服務器端骨架;java2wsdl工具可以通過java構建wsdl文檔。

 

重點說說後面兩種:
1、wsdlL2java:根據wsdl文檔生成java對象。
(1)客戶端:run config-->project-->main(org.apache.axis.wsdl.WSDL2Java)-->arguments(http://localhost:8888/webservice/services/CustomerService?wsdl)-->run!-->刷新project-->project根目錄下自動生成了基於pojo類、url信息和map數據的三個包,包最下層是WSDL2Java自動生成的java對象源碼。當然也可以用命令指定生成的源碼安放的路徑和包名:http://localhost:8888/webservice/services/CustomerService?wsdl -v -p cn.itcast.axis.client.wsdl2java.customer -o src。同時還會自動生成deploy.wsdd和undeploy.wsdd文件。

 

生成的源碼中,stub對象是wsdl2java生成的靜態代理;靜態代理類其實就是對動態代理的封裝,用的類是完全一樣的(Service/Call等),但是不用寫地址和操作名了,通過靜態代理(因爲地址和操作名已經封裝在本地了),就可以像訪問本地類一樣訪問遠程方法。XXXSOAPBindingSkeleton、XXXSOAPBindingImple是用命令“--server-side --skeletonDeploy true”生成的服務器端的骨架類,這時,wsdd文檔中發佈的服務是XXXSOAPBindingSkeleton;不過一般情況下,在客戶端調用時不需要服務端的骨架,所以“--skeletonDeploy true”參數可以不用,這時就不會生成AddressBookSOAPBindingSkeleton,而wsdd文檔中部署的是AddressBookSOAPBindingImpl,可以在這個服務類裏實現業務邏輯。

 

(2)服務端:將客戶端自動生成的包copy到服務端src目錄下,因爲XXXSOAPBindingStub、XXXServiceLocator和Service是服務於客戶端的,在服務端可以刪除這三個文件,deploy.wsdd和undeploy.wsdd也是客戶端才用的,也都不需要。將客戶端的服務發佈到WS以後,XXXSOAPBindingImple也可以刪除,因爲XXXSOAPBindingImple服務已經上傳到服務端了。

 

2、java2wsdl:通過java構建wsdl文檔。
通常情況下,雙方合作,一般先寫接口構建業務體系,然後就可以進行其他工作,因爲接口已經包含了業務簽名,而具體的業務邏輯實現可以後期再寫;此時可以通過接口生成wsdl文檔,再通過文檔生成實現類和骨架存根(關於骨架存根,請參見前文《ejb3(2)》),再在Impl裏寫具體實現。一般應用過程如下:
編寫業務接口-->java2wsdl-->wsdl2java-->編寫接口實現(業務邏輯)-->用wsdl2java生成的deploy.wsdd部署(對外發布)-->將編寫完的wsdl2java生成的實現copy到服務端,刪除不需要的部分。

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