幾個重要知識:java
至關於schema文件的idweb
用來指定schema文件的namespace的值 面試
引入一個約束, 它的值是一個schema文件的namespace值 apache
用來指定引入的schema文件的位置瀏覽器
schema規範中:服務器 1. 全部標籤和屬性都須要有schema文件來定義 網絡 2. 全部的schema文件都須要有一個id, 但在這裏它叫namespace,框架 3. namespace的值由什麼來指定?eclipse 由targetNamespace屬性來指定, 它的值是一個url(頗有可能不存在)ide 4. 如何引入一個Schema約束? 屬性: 用xmlns屬性 屬性值: 對應的schema文件的id(namespace值) 5. 若是引入的schema不是w3c組織定義, 必須指定schema文件的位置 6. schema文件的位置由什麼屬性來指定? 屬性: schemaLocation 屬性值: namespace path 7. 若是引入了N個約束, 須要給n-1個取別名
|
幾個重要知識:
1. 請求的組成:
請求行(請求方式 path http1.1)
請求頭
請求體: 只有post請求有
2. 響應的組成
響應狀態行:
響應頭
響應體 : 瀏覽器解析顯示的數據
3. 請求的過程
2. 面試問題
1.webservice至關於HTTP+?+?
? : xml
? : schema
2.wsdl是什麼?
webservice定義語言, 對應.wsdl文檔, 一個webservice會對應一個惟一的wsdl文檔,
定義了客戶端與服務端發送請求和響應的數據格式和過程
3.如何發佈一個webservice?
定義SEI @webservice @webMethod
定義SEI的實現
發佈: Endpoint.publish(url, SEIImplObject)
4. 如何請求一個webservice?
1.根據wsdl文檔生成客戶端代碼 jdk/cxf
2.根據生成的代碼調用webService
1. 基於Web的服務:服務器端整出一些資源讓客戶端應用訪問(獲取數據)
2. 一個跨語言、跨平臺的規範(抽象)
3. 多個跨平臺、跨語言的應用間通訊整合的方案(實際)
以各個網站顯示天氣預報功能爲例:
氣象中心的管理系統將收集的天氣信息並將數據暴露出來(經過WebService Server),
而各大站點的應用就去調用它們獲得天氣信息並以不一樣的樣式去展現(WebService Client).
網站提供了天氣預報的服務,但其實它們什麼也沒有作,
只是簡單了調用了一下氣象中心服務器上的一段代碼而已。
web service能解決:
跨平臺調用
跨語言調用
遠程調用
1. 同一家公司的新舊應用之間
2. 不一樣公司的應用之間
分析業務需求:天貓網與中通物流系統如何交互?
3. 一些提供數據的內容聚合應用:天氣預報、股票行情
直譯 : WebService定義語言
1. 對應一種類型的文件.wsdl
2. 定義了web service的服務器端與客戶端應用交互傳遞請求和響應數據的格式和方式
3. 一個web service對應一個惟一的wsdl文檔
直譯: 簡單對象訪問協議
http+xml片段
4.3. SEI:WebService EndPoint Interface(終端)
直譯: web service的終端接口,
@Webservice
@WebMethod
4.4. CXF:Celtix + XFire
一個apache的用於開發webservice服務器端和客戶端的框架
– 使用JDK開發(1.6及以上版本)
– 使用CXF框架開發(工做中)
– 服務器端
– 客戶端
– @WebService( SEI和SEI的實現類)
– @WebMethod(SEI中的全部方法)
1 import javax.jws.WebMethod; 2 import javax.jws.WebService; 3 4 /** 5 * SEI 6 * @author Administrator 7 * 8 */ 9 @WebService 10 public interface HelloWs { 11 12 @WebMethod 13 public String sayHello(String name); 14 }
1 import javax.jws.WebService; 2 3 import com.ittest.ws.service.HelloWs; 4 /** 5 * SEI 的實現 6 * @author Administrator 7 * 8 */ 9 @WebService 10 public class HelloWsImpl implements HelloWs { 11 12 public String sayHello(String name) { 13 System.out.println("service sayHello() "+name); 14 return "Hello "+name; 15 } 16 17 }
– Endpoint(終端, 發佈webservice)
1 import javax.xml.ws.Endpoint; 2 3 import com.ittest.ws.service.impl.HelloWsImpl; 4 5 /** 6 * 發佈webservice 7 * @author Administrator 8 * 9 */ 10 public class TestService { 11 12 public static void main(String[] args) { 13 String address = "http://192.168.1.100:8989/webService_01_sayService/hellows"; 14 Endpoint.publish(address, new HelloWsImpl()); 15 System.out.println("發佈 webService_01_sayService 成功"); 16 } 17 }
– 查看對應的wsdl文檔:…..?wsdl (通常瀏覽器)
– 請求webService並查看請求和響應消息(webservice瀏覽器)
– 藉助jdk的wsimort.exe工具生成客戶端代碼:
wsimport -keep url //url爲wsdl文件的路徑
– 藉助生成的代碼編寫請求代碼
– http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
– 藉助命令工具自動生成客戶端代碼
– 藉助生成的代碼編寫請求代碼
異常說明: 直接生成客戶端代碼會拋異常, 沒法生成客戶端代碼, 解決辦法:
將 <s:element ref="s:schema" /><s:any /> 替換成
<s:any minOccurs="2" maxOccurs="2"/>
備註: 這個是Java調用net的webservice都有的問題
EndPoint: 加入cxf的jar包便可,其它不須要改動
Client: 加入cxf的jar包便可,使用cxf的 wsdl2java 命令生成代碼(加入path)
D:\javaeclipsWorkSpace\javaeeProject\webService_01_cxf_client3\src>wsdl2java D:\javaeclipsWorkSpace\javaeeProject\webService_01_cxf_client3\hellows.wsdl
wsdl2java 異常說明:
G:\myeclipseworkspace\WS-client\src>wsdl2java http://192.168.1.4/server?wsdl
Exception in thread "main" java.lang.AssertionError: org.xml.sax.SAXParseExcepti
on; systemId: jar:file:/F:/apache-cxf-3.0.0/lib/jaxb-xjc-2.2.7.jar!/com/sun/tool
s/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; s
chema_reference: 因爲 accessExternalSchema 屬性設置的限制而不容許 'file' 訪問,
所以沒法讀取方案文檔 'xjc.xsd'。
緣由: Cxf 和 jdk的版本不匹配 .
微博文章: http://blog.csdn.net/yajun0628/article/details/74458351