1、基本概念
1.1什么是Web Services?
????? 舉個例子,如果我們要在自己的程序里面展示天氣預報,那怎么弄?正確的做法是我們發送一個請求到一個系統,他會給我們返回來天氣情況。這個就是一個webservice
webService定義:即Web服務,它是一種跨編程語言和跨操作系統平臺的遠程調用技術
1.2.Web Services 平臺元素
SOAP:簡易對象訪問協議,soap用來描述傳遞信息的格式?;镜?Web services 平臺是 XML + HTTP
WSDL:是基于 XML 的用于描述 Web Services 以及如何訪問 Web Services 的語言
UDDI:通用描述、發現及整合,用來管理、分發、查詢webService。
2.1獲取webservice的wsdl文檔
2.11、什么是wsdl文檔
wsdl跟java一樣,也是一種語言,是通過xml的形式說明該webservice如何調用
2.12、如何獲取wsdl文檔
通過在webservice的URL后面加上?wsdl的方式。比如天氣預報的的就是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
2.13、WSDL解析
wsdl文檔從下往上讀
Types - 數據類型定義的容器,它使用某種類型系統(一般地使用XML Schema中的類型系統)、(入參和出參的數據類型)。
Message - 通信消息的數據結構的抽象類型化定義,使用Types所定義的類型來定義整個消息的數據結構(入參和出參)。
Operation - 對服務中所支持的操作的抽象描述,一般單個Operation描述了一個訪問入口的請求/響應消息對(方法)。
PortType - 對于某個訪問入口點類型所支持的操作的抽象集合,這些操作可以由一個或多個服務訪問點來支持(服務類)。
Binding - 特定服務訪問點與具體服務類的綁定(不看內容,看關系)。
Port - 定義為webservice單個服務訪問點。
Service- 相關服務訪問點的集合。
2.2、通過wsdl文檔生成客戶端調用代碼
2.21使用jdk自帶的命令生成
配置java環境變量后在命令窗口中輸入wsimport –s . http://xxxx.xx.xx/xxx?wsdl即可生成java代碼
注意:-s不能分開,-s后面有個小點,用于指定源代碼生成的目錄。點即當前目錄。如果使用了-s參數則會在目錄下生成兩份代碼,一份為.class代碼。一份為.java代碼。.class代碼,可以經過打包以后使用。.java代碼可以直接Copy到我們的項目中運行
2.3生成代碼后如何調用
先把生成的代碼復制到項目中,然后通過讀wsdl文檔來調用
//wsdl文檔中service的name
SayHelloIntefaceService ss = new SayHelloIntefaceService();
//wsdl文檔中portType的name
SayHelloInteface shf=ss.getSayHelloIntefacePort();
//wdl文檔中complexType的name
String str=shf.sayhellow("lisi");
//str即為webservice的服務端返回的信息
System.out.println(str);
Endpoint.publish("http://127.0.0.1:8080/sayHello", new SayHellowIntefaceImpl());
主要類有:
(1)@WebService - 它是一個注解,用在類上指定將此類發布成一個webservice服務
(2)Endpoint – 此類為端點服務類,它的方法publish用于將一個已經添加了@WebService注解對象綁定到一個地址的端口上。Endpoint是jdk提供的一個專門用于發布服務的類,它的publish方法接收兩個參數,一個是本地的服務地址,二是提供服務的類。它位于javax.xml.ws.*包中
static Endpoint.publish(String address, Object implementor) //在給定地址處針對指定的實現者對象創建并發布端點。
//stop方法用于停止服務
其他注意事項:
4.11使用ajax調用
var xhr; function invoke(){
? if(window.ActiveXObject){
? xhr = new ActiveXObject("Microsoft.XMLHTTP");
}else{
??? xhr = new XMLHttpRequest();
}
//指定請求地址
?var url = "http://127.0.0.1:7777/hello?wsdl";
?//定義請求類型和地址和異步
? xhr.open("POST", url, true);
? //設置Content-Type
? xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
? //指定回調方法
? xhr.onreadystatechange = back;
?? var textVal = document.getElementById("mytext").value;
??? //組裝消息體的數據
?var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:
? +'<soapenv:Body>'
? +'<q0:sayHello>'
? +'<arg0>'+textVal+'</arg0>'
? +'</q0:sayHello>'
? +'</soapenv:Body>'
? +'</soapenv:Envelope>';
? xhr.send(data);
}
function back(){
?if(xhr.readyState == 4){
? if(xhr.status == 200){
?? var doc = xhr.responseXML;
?? alert(doc);
?? alert(xhr.responseText);
?? var tag = doc.getElementsByTagName("return")[0];
?? alert(tag)
?? }
? }
?}
4.12通過URLConnection調用
4.12、通過URLConnection調用
//創建url地址
URL url = new URL("http://192.168.1.104:8080/hello");
//打開連接
URLConnection conn = url.openConnection();
//轉換成HttpURL
HttpURLConnection httpConn = (HttpURLConnection) conn;
//打開輸入輸出的開關
httpConn.setDoInput(true);
httpConn.setDoOutput(true);
//設置請求方式
httpConn.setRequestMethod("POST");
//設置請求的頭信息
httpConn.setrequestproperty("Content-type", "text/xml;charset=UTF-8");
//拼接請求消息
String data = "<soapenv:Envelope xmlns:soapenv=" +
??????? "\"http://schemas.xmlsoap.org/soap/envelope/\" " +
??????? "xmlns:q0=\"http://server.rl.com/\" " +
??????? "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
??????? "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
??????? +"<soapenv:Body>"
??????? +"<q0:sayHello>"
??????? +"<arg0>renliang</arg0> "
????? +"</q0:sayHello>"
????? +"</soapenv:Body>"
????? +"</soapenv:Envelope>";
//獲得輸出流
OutputStream out = httpConn.getOutputStream();
//發送數據
out.write(data.getBytes());
//判斷請求成功
if(httpConn.getResponseCode() == 200){
??? //獲得輸入流
??? InputStream in = httpConn.getInputStream();
??? //使用輸入流的緩沖區
??? BufferedReader reader = new BufferedReader(new InputStreamReader(in));
??? StringBuffer sb = new StringBuffer();
??? String line = null;
??? //讀取輸入流
??? while((line = reader.readLine()) != null){
??????? sb.append(line);
??? }
??? //創建sax的讀取器
??? SAXReader saxReader = new SAXReader();
??? //創建文檔對象
??? Document doc = saxReader.read(new StringReader(sb.toString()));
??? //獲得請求響應return元素
??? List<Element> eles = doc.selectNodes("//return");
??? for(Element ele : eles){
??????? System.out.println(ele.getText());
??? }
}
4.13、使用jquery調用cxf
$(function(){
??????? $("#mybutton").click(function(){
??????????? var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://server.web.cxf.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
????????????????? +'<soapenv:Body>'
????????????????? +'<q0:sayHello>'
????????????????? +'?? <arg0>sss</arg0>'
????????????????? +' </q0:sayHello>'
????????????????? +'</soapenv:Body>'
????????????????? +'</soapenv:Envelope>';
??????????????? $.ajax({
??????????????????? url:'http://localhost:8080/cxf-web-server/services/hello',
??????????????????? type:'post',
??????????????????? dataType:'xml',
??????????????????? contentType:'text/xml;charset=UTF-8',
??????????????????? data:data,
??????????????????? success:function(responseText){
??????????????????????? alert($(responseText).find('return').text());
??????????????????? },
??????????????????? error:function(){
??????????????????????? alert("error");
??????????????????? }
??????????????? })
??????? })
??? })
?
Web Service 元數據注釋(JSR 181)
@WebService
1、serviceName: 對外發布的服務名,指定 Web Service 的服務名稱:wsdl:service。缺省值為 Java 類的簡單名稱+Service。(字符串)
2、endpointInterface: 服務接口全路徑, 指定做SEI(Service EndPoint Interface)服務端點接口
3、name:此屬性的值包含XML Web Service的名稱。在默認情況下,該值是實現XML Web Service的類的名稱,wsdl:portType 的名稱。缺省值為 Java 類或接口的非限定名稱。(字符串)
4、portName: ?wsdl:portName。缺省值為 WebService.name+Port。
5、targetNamespace:指定你想要的名稱空間,是使用接口實現類的包名的反綴
6、wsdlLocation:指定用于定義 Web Service 的 WSDL 文檔的 Web 地址。Web 地址可以是相對路徑或絕對路徑。(字符串)
注意:實現類上可以不添加Webservice注解 ?
@WebMethod?
注釋表示作為一項 Web Service 操作的方法,將此注釋應用于客戶機或服務器服務端點接口(SEI)上的方法,或者應用于 JavaBeans 端點的服務器端點實現類。
要點:
僅支持在使用 @WebService 注釋來注釋的類上使用 @WebMethod 注釋
1、operationName:指定與此方法相匹配的wsdl:operation 的名稱。缺省值為 Java 方法的名稱。(字符串)
2、action:定義此操作的行為。對于 SOAP 綁定,此值將確定 SOAPAction 頭的值。缺省值為 Java 方法的名稱。(字符串)
3、exclude:指定是否從 Web Service 中排除某一方法。缺省值為 false。(布爾值) ?
@Oneway?
注釋將一個方法表示為只有輸入消息而沒有輸出消息的 Web Service 單向操作。
將此注釋應用于客戶機或服務器服務端點接口(SEI)上的方法,或者應用于 JavaBeans 端點的服務器端點實現類 ?
@WebParam?
注釋用于定制從單個參數至 Web Service 消息部件和 XML 元素的映射。
將此注釋應用于客戶機或服務器服務端點接口(SEI)上的方法,或者應用于 JavaBeans 端點的服務器端點實現類。
1、name :參數的名稱。如果操作是遠程過程調用(RPC)類型并且未指定partName 屬性,那么這是用于表示參數的 wsdl:part 屬性的名稱。
如果操作是文檔類型或者參數映射至某個頭,那么 -name 是用于表示該參數的 XML 元素的局部名稱。如果操作是文檔類型、
參數類型為 BARE 并且方式為 OUT 或 INOUT,那么必須指定此屬性。(字符串) ??
2、partName:定義用于表示此參數的 wsdl:part屬性的名稱。僅當操作類型為 RPC 或者操作是文檔類型并且參數類型為BARE 時才使用此參數。(字符串)
3、targetNamespace:指定參數的 XML 元素的 XML 名稱空間。當屬性映射至 XML 元素時,僅應用于文檔綁定。缺省值為 Web Service 的 targetNamespace。(字符串)
4、mode:此值表示此方法的參數流的方向。有效值為 IN、INOUT 和 OUT。(字符串)
5、header:指定參數是在消息頭還是消息體中。缺省值為 false。(布爾值)
@WebResult?
注釋用于定制從返回值至 WSDL 部件或 XML 元素的映射。將此注釋應用于客戶機或服務器服務端點接口(SEI)上的方法,或者應用于 JavaBeans 端點的服務器端點實現類。
1、name:當返回值列示在 WSDL 文件中并且在連接上的消息中找到該返回值時,指定該返回值的名稱。對于 RPC 綁定,這是用于表示返回值的 wsdl:part屬性的名稱。對于文檔綁定,-name參數是用于表示返回值的 XML 元素的局部名。對于 RPC 和?DOCUMENT/WRAPPED 綁定,缺省值為 return。對于 DOCUMENT/BARE 綁定,缺省值為方法名 + Response。(字符串)
2、targetNamespace:指定返回值的 XML 名稱空間。僅當操作類型為 RPC 或者操作是文檔類型并且參數類型為 BARE 時才使用此參數。(字符串)
3、header:指定頭中是否附帶結果。缺省值為false。(布爾值)
4、partName:指定 RPC 或 DOCUMENT/BARE 操作的結果的部件名稱。缺省值為@WebResult.name。(字符串)
@HandlerChain?
注釋用于使 Web Service 與外部定義的處理程序鏈相關聯。只能通過對 SEI 或實現類使用 @HandlerChain 注釋來配置服務器端的處理程序。
但是可以使用多種方法來配置客戶端的處理程序??梢酝ㄟ^對生成的服務類或者 SEI 使用 @HandlerChain 注釋來配置客戶端的處理程序。此外,可以按程序在服務上注冊您自己的 HandlerResolver 接口實現,或者按程序在綁定對象上設置處理程序鏈。
1、file:指定處理程序鏈文件所在的位置。文件位置可以是采用外部格式的絕對 java.net.URL,也可以是類文件中的相對路徑。(字符串)
2、name:指定配置文件中處理程序鏈的名稱。
?
?
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
紅鉆過期后Q秀就沒了?紅鉆服務關閉后,所有秀物品將恢復到期時間,服務期限仍從購買之日起計算,服務期限為6個月。如果商品購買時間超過6個月,商品會在紅鉆關閉后放入破布中;將保存一個月供用戶購買。同時會有提示通知用戶續費。如果超過一個月,該項目將從我的秀中刪除。怎樣打開已過期的郵件?在面板中打開郵箱。02點擊 "文件傳輸站和。03如果有過期的郵件,會保存在這里。你可以選擇那些過期的郵件,點擊右上角的上...
如何用office publisher編輯小冊子?Office publisher可用于制作小冊子或其他原創出版物。Publisher內置了許多模板,使得制作手冊更容易。首先,啟動軟件,打開宣傳冊模板,或在線下載適當的模板。在頁面中打開模板后,您將看到占位符的文本和圖像,第一個頁面包含占位符的業務信息,您將立即更新這些信息。把這些信息改成你需要的,把圖片改成適合你需要的。你可以保存指紋。Publi...
CC英語CC是什么意思?TO: to.(寫信給某某)CC:抄送,意思是給寫信給某人的人送一份,主要是給,但因為其他人也需要了解情況,所以抄送給抄送的人。為什么很多女生網名叫cc?我覺得女生網名cc的意思是純潔的意思。每個女孩都希望自己永遠保持年輕純潔,不被世俗化,能保持生命之初擁有的優秀品質。女生的網名cc就有上面的意思,所以很多女生都愿意給自己的網名取名cc。為什么很多女生網名叫cc?可能性如是...