




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、WebService 四種發(fā)布方式總結 Author:yczhang1. CXF方式CXF與spring搭建webservice是目前最流行的方式,但是傳聞cxf與jdk1.5有些不兼容,我沒有遇到過,我遇到的問題是cxf與was6.1.1不兼容,表現在cxf必須的jar包“wsdl4j-1.6.2.jar”報錯,報的錯為: java.lang.IncompatibleClassChangeError,明顯的jar包不兼容問題,很是頭痛,后來查找資料找到解決辦法是,將上述jar包新建一個was共享庫,可以解決,但是客戶周經理不想用此種方式,因為需要修改was,于是改用了axis2方式,下文會介
2、紹。該問題在此處做個記錄,以后使用cxf與was的時候需要注意!使用cxf+spring搭建WebService:第一步,添加jar包。此處需要注意,不同環(huán)境(tomcat、was)jar也不一定相同,例如我本地cxf+spring只需要如下jar包:而泰康的was環(huán)境則需要如下jar包:明顯的多了很多,原因應該是服務器jar包池的不同。根據錯誤提示缺什么補什么就可以了,注意jar包勿重復。第二步,配置web.xml文件,如下(重要的地方已標記):contextConfigLocationclasspath:/applicationContext.xml org.springframework
3、.web.context.ContextLoaderListener encodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encodingFilter/* CXFServlet org.apache.cxf.transport.servlet.CXFServlet 1 CXFServlet /webservice/* 上述標記的地方,第一處是spring配置文件路徑;第二出是wsdl地址內容;第三步,編寫接口類與實現類,注意注解接口類WebServicepublic interface
4、 SendService public boolean sendOA(WebParam(name=param)String param);public boolean sendOrg(OrgEntity org);實現類WebService(endpointInterface=com.service.SendService,serviceName=sendService)public class SendServiceImpl implements SendServicepublic boolean sendOA(String param) System.out.println(-sendOA
5、-param:+param);if(param.equals(zhoujian)return true;return false;public boolean sendOrg(OrgEntity org) System.out.println(-sendOrg-begin-);return true;第四步,Spring配置文件 !- -“jaxws:client”該標簽可以不必寫,訪問時可以手動拼接該url第五步,發(fā)布,直接部署到服務器,訪問:1:9080/Wb/webservice/sendServie?wsdl2. Xfire方式據說xfire方式已經
6、很老了,但個人感覺,xfire方式很簡單且容易配置,不知為啥過時了,也沒感覺cxf、axis2哪里先進,我當時卡在cxf與was搞不定時想嘗試xfire方式被周經理給拒絕了。Xfire方式發(fā)布webservice:第一步,添加jar包,如下:第二步,修改web.xml文件 XFireServlet org.codehaus.xfire.transport.http.XFireConfigurableServlet 0 XFireServlet /services/* 第三步,編寫接口類接口類:public abstract interface IBankingService public ab
7、stract String transferFunds(String paramString1);實現類:public class BankingService implements IBankingService public String transferFunds(String fromAccount) return fromAccount+:ok; 第四步,編寫services.xml配置文件在WEB-INF目錄下新建目錄META-INF,在該目錄下新建文件夾xfire,該目錄下新建文件services.xmlBankingmybankcom.mybank.xfire.example.
8、IBankingServicecom.mybank.xfire.impl.BankingService第五步,發(fā)布,部署到服務器,訪問url:http:/localhost:9080/Xfire/services/Banking?wsdl3. AXIS2方式Axis2發(fā)布WebService有兩種方式,其一是利用axis2插件打成aar包放到axis_war里面部署到服務器發(fā)布;其二是不打包發(fā)布(本例);我不清楚打包發(fā)布有什么好處,感覺很麻煩項目外還得部署一個war,現在介紹第二種不打包的方式,類似xfire,同時由于cxf與was不兼容導致wsdl.jar報錯,但是xfire與axis2也用
9、到wsdl.jar卻不報錯,我個人也是很費解,泰康項目目前使用的就是axis2方式。Axis2發(fā)布WebService:第一步,添加jar包,如下:很多是吧,不過都是從axis.war里面WEB-INF下的lib目錄復制來的。第二步,修改web.xml文件 AxisServlet org.apache.axis2.transport.http.AxisServlet 1 AxisServlet /services/* 第三步,編寫實現類public class ServiceImpl public String sayHello(String name)System.out.println(=
10、);return hello:+name;第四步,增加WEN-INF內容將axis.war解壓下的WEN-INF文件夾內的conf、modules復制到項目WEB-INF下第五步,在WEB-INF下創(chuàng)建文件夾services(名字不可改),在該目錄下創(chuàng)建文件夾(名稱隨意),在該目錄下創(chuàng)建文件夾META-INF(名稱不可改),在該目錄下創(chuàng)建文件services.xml(名稱不可改),該文件內容為: Web Service例子 com.ServiceImpl 第六步,部署到服務器,發(fā)布URL為:http:/localhost:9080/Axis2Test/services/axisDemo?wsd
11、l4. AXIS1方式同上,不知道AXIS1哪里不好,配置也很簡單,如下:第一步,添加jar包第二步,修改web.xml AxisServlet org.apache.axis.transport.http.AxisServlet AxisServlet /services/* 第三步,實現類與實體類實現類:package com;public class Axis public String sayHello(String name)System.out.println(=:+name);return hi:+name;public String sayHelloToUser(User u)
12、System.out.println(=:+u.getId();System.out.println(=:+u.getPath();System.out.println(=:+u.getAdd();return hi:+u.getName();實體類:package com;public class User private String id;private String name;private String add;private String path; getter setter 方法第四步,創(chuàng)建配置文件:在WEB-INF下新建文件“server-config.wsdd” !- gl
13、obalConfiguration 標簽內容為系統(tǒng)默認 無需更改 !service 標簽是需要配置的 -!name 是url中需要的參數 - !allowedMethods 的value值是方法名 可以寫*- !className的value值是類路徑- !wsdlTargetNamespace的wsdl文件中TargetNamespace的值- parameter name=wsdlTargetNamespace value= !此處很重要,若方法需要傳實體類,則配置此處- !默認- 第五步,部署,同上。5. HTTPCLIENT方式Httpcilent屬于一種比較簡單的實現方式我們將Web
14、 Service發(fā)布在Tomcat或者其他應用服務器上后,有很多方法可以調用該Web Service,常用的有兩種:1、通過瀏覽器HTTP調用,返回規(guī)范的XML文件內容 2、通過客戶端程序調用,返回結果可自定義格式 接下來,我利用Eclipse作為開發(fā)工具,演示一個Httpclient調用WebService的簡單示例步驟如下:準備工作:用到的jar包有: 下載鏈接(第一步:新建Java Project,項目名稱為HttpCallWebService第二步:將所需jar包導入到庫中第三步:編寫調用class,這里有兩種方式調用,即GET方式和POST方式,由于POST方式較安全,故這里采用PO
15、ST方式調用;請求數據的構造也有兩種方式:靜態(tài)和動態(tài)構造,下面分別介紹這兩種方式:注:這里以E郵寶開放的webservice接口為例調用其中一個API函數,而E郵寶的webservice基于SOAP,故請求數據為SOAP格式,大家可根據自己情況進行修改。靜態(tài)構造請求數據:package com.http;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import mons.httpclient.HttpClient;import mons.httpclient.
16、HttpException;import mons.httpclient.methods.InputStreamRequestEntity;import mons.httpclient.methods.PostMethod;import mons.httpclient.methods.RequestEntity;public class StaticHttpclientCall /* * param args * throws IOException * throws HttpException */ public static void main(String args) throws Ht
17、tpException, IOException / TODO Auto-generated method stub String soapRequestData = + + + GetAPACShippingPackage xmlns= + + 123 + 123 + 123 + 123 + 123 + 123 + + + + ; System.out.println(soapRequestData); PostMethod postMethod = new PostMethod( / 然后把Soap請求數據添加到PostMethod中 byte b = soapRequestData.ge
18、tBytes(utf-8); InputStream is = new ByteArrayInputStream(b, 0, b.length); RequestEntity re = new InputStreamRequestEntity(is, b.length, application/soap+xml; charset=utf-8); postMethod.setRequestEntity(re); / 最后生成一個HttpClient對象,并發(fā)出postMethod請求 HttpClient httpClient = new HttpClient(); int statusCode
19、 = httpClient.executeMethod(postMethod); if(statusCode = 200) System.out.println(調用成功!); String soapResponseData = postMethod.getResponseBodyAsString(); System.out.println(soapResponseData); else System.out.println(調用失敗!錯誤碼: + statusCode); 動態(tài)構造數據:package com.http;import java.io.ByteArrayInputStream;
20、import java.io.InputStream;import java.util.HashMap;import java.util.Map;import java.util.Set;import mons.httpclient.HttpClient;import mons.httpclient.methods.InputStreamRequestEntity;import mons.httpclient.methods.PostMethod;import mons.httpclient.methods.RequestEntity;/ 動態(tài)構造調用串,靈活性更大public class D
21、ynamicHttpclientCall private String namespace; private String methodName; private String wsdlLocation; private String soapResponseData; public DynamicHttpclientCall(String namespace, String methodName, String wsdlLocation) space = namespace; this.methodName = methodName; this.wsdlLocation =
22、 wsdlLocation; private int invoke(Map patameterMap) throws Exception PostMethod postMethod = new PostMethod(wsdlLocation); String soapRequestData = buildRequestData(patameterMap); byte bytes = soapRequestData.getBytes(utf-8); InputStream inputStream = new ByteArrayInputStream(bytes, 0, bytes.length)
23、; RequestEntity requestEntity = new InputStreamRequestEntity(inputStream, bytes.length, application/soap+xml; charset=utf-8); postMethod.setRequestEntity(requestEntity); HttpClient httpClient = new HttpClient(); int statusCode = httpClient.executeMethod(postMethod); soapResponseData = postMethod.get
24、ResponseBodyAsString(); return statusCode; private String buildRequestData(Map patameterMap) StringBuffer soapRequestData = new StringBuffer(); soapRequestData.append(); soapRequestData .append(); soapRequestData.append(); soapRequestData.append(); soapRequestData.append(); Set nameSet = patameterMa
25、p.keySet(); for (String name : nameSet) soapRequestData.append( + patameterMap.get(name) + ); soapRequestData.append(); soapRequestData.append(); soapRequestData.append(); soapRequestData.append(); return soapRequestData.toString(); /* * param args * throws Exception */ public static void main(Strin
26、g args) throws Exception / TODO Auto-generated method stub DynamicHttpclientCall dynamicHttpclientCall = new DynamicHttpclientCall( GetAPACShippingPackage, Map patameterMap = new HashMap(); patameterMap.put(TrackCode, 123); patameterMap.put(Version, 123); patameterMap.put(APIDevUserID, 123); patamet
27、erMap.put(APIPassword, 123); patameterMap.put(APISellerUserID, 123); patameterMap.put(MessageID, 123); patameterMap.put(TrackCode, 123); String soapRequestData = dynamicHttpclientCall.buildRequestData(patameterMap); System.out.println(soapRequestData); int statusCode = dynamicHttpclientCall.invoke(p
28、atameterMap); if(statusCode = 200) System.out.println(調用成功!); System.out.println(dynamicHttpclientCall.soapResponseData); else System.out.println(調用失??!錯誤碼: + statusCode); 最終運行結果:可見最終返回的也是xml格式的數據,這里數據未進行格式化顯示和處理6. AXIS1客戶端調用此處調用方式為axis1的調用,需要傳遞的參數可以是字符串或實體類,字符串方式:Service service = new Service();Call
29、 call = (Call) service.createCall();/wsdl地址call.setTargetEndpointAddress(new URL(wsdlUrl);/設定調用3分鐘不返回則超時call.setTimeout(new Integer(180000);/命名空間(wsdl文件中的targetNameSpace屬性值) 以及方法名call.setOperationName(new QName(http:/com, sayHello);/參數類型call.addParameter(name, XMLType.XSD_STRING, ParameterMode.IN);/
30、返回值類型call.setReturnType(XMLType.XSD_STRING);/參數值String retXML2 = (String) call.invoke( new Object yczhang );System.out.println( retXML2);實體類方式(調用axis2的接口有點問題):UserEntity userEntry = new UserEntity();userEntry.setId(yczhang);userEntry.setName(yczhang);Service service = new Service();Call call = (Call
31、) service.createCall();/wsdl地址call.setTargetEndpointAddress(new URL(wsdlUrl);/設定調用3分鐘不返回則超時call.setTimeout(new Integer(180000);/命名空間(wsdl文件中的targetNameSpace屬性值) 以及方法名call.setOperationName(new QName(http:/com, sayHelloToUser);/注冊SimpleObject的序列化類型QName qn = new QName(urn:BeanService, UserEntity);call
32、.registerTypeMapping(UserEntity.class, qn, new BeanSerializerFactory(UserEntity.class, qn), new BeanDeserializerFactory(UserEntity.class, qn);/參數類型(可省略)call.addParameter(requestParam, org.apache.axis.encoding.XMLType.XSD_ANYTYPE, ParameterMode.IN);/返回值類型call.setReturnType(XMLType.XSD_BOOLEAN);Boolea
33、n retXML1 = (Boolean) call.invoke( new Object userEntry );System.out.println( retXML1);注意,實體類方式,當調用的是由axis2方式所發(fā)布的接口時,容易出現問題,表現在所傳遞的實體類的屬性內容為null,但在該實體類內新建一屬性傳如該值時,卻有值。應該是axis1對axis2的不兼容問題。并且調用axis2的接口時,需要在客戶端寫出namespace,即:/call.setOperationName(new QName(http:/localhost:9080/WS_Axis/services/axisTest, sayHelloTo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 領導科學考試背景與重要性分析試題及答案
- 網絡安全事件響應服務合同
- 杭州市房屋買賣合同(18篇)
- 時光都去哪了演講稿(10篇)
- 農業(yè)發(fā)展政策與農村經濟管理試題
- 財務成本管理實務模擬考試卷及答案解析
- 智能安防系統(tǒng)集成與安裝工程合同
- 計算機三級嵌入式學習路徑試題及答案
- 信息系統(tǒng)監(jiān)理師考生如何制定計劃試題及答案
- 嵌入式系統(tǒng)應用案例分析試題及答案
- 施工總承包聯(lián)合體協(xié)議書
- 傳染病法律法規(guī)培訓課件
- 2025年潛油電動螺桿泵變頻器項目可行性研究報告
- 慢性胃炎考試試題及答案
- 浙江首考2025年1月普通高等學校招生全國統(tǒng)考政治試題及答案
- 2023年高考物理試卷(廣東)含答案解析
- 電荷耦合器件(CCD)介紹和工作原理
- JJF(閩) 1101-2020 在線式CCD圖像尺寸測量系統(tǒng)校準規(guī)范
- 生產安全事故調查工作實務含直接經濟損失計算方法和標準
- 四川省甘孜州2022年中考語文試題及參考答案
- 混凝土拌和溫度和澆筑溫度計算混凝土拌和溫度計算
評論
0/150
提交評論