通俗地說,WSDL文檔描述了WebService如下3個方面:-WHAT:該WebService包含什么操作-HOW:該WebService的操作應該怎么調用-WHERE:該WebService的服務地址/*******************************只要得到Web Service的WSDL文檔,接下來程序就可以調用Web Service*******************************/
-------------------------------------------Web Service 接口-types(標準的Schema)-message(2N個)-portType(N個Operation)Web Service實現-binding (N個更詳細的operation)-service (指定Web Service的服務器名稱/地址)-------------------------------------------一次WebService的調用--其實并不是方法調用,而是發送SOAP消息(即XML片段);調用一次Web Service 的本質:1.客戶端把調用方法參數,轉化為XML文檔片段(SOAP消息)--該文檔片段必須符合WSDL定義的格式;2.通過網絡把XML文檔片段傳給服務器;3.服務器接收到XML文檔片段;4.服務器解析XML文檔片段,提取其中的數據,并把數據轉換成調用Web Service所需的參數值;5.服務器端執行方法;6.把執行方法得到的返回值再次轉換生成XML文檔片段(SOAP消息)--該文檔片段必須符合WSDL定義的格式;7.通過網絡把XML文檔片段傳給客戶端;8.客戶端接收到XML文檔片段;9.客戶端解析XML文檔片段,提取其中的數據,并把數據轉換調用Web Service的返回值;從上面調用本質來看,要一個語言支持Web Service,唯一的要求是:該語言支持XML文檔解析、生成,支持網絡傳輸。2.SAOP:Simple Object access Protocol(簡單對象訪問協議)=========================第七講=============================處理Map等CXF無法自動轉換的復合數據類型的形參和返回值==========================================================在CXF開發中,如果遇到系統無法自動處理的類型,就需要這樣處理思路:提供一個轉換器(繼承XmlAdapter),負責把CXF無法自動處理的類型,轉換為可以處理的類型。1.使用@XmlJavaTypeAdapter注釋修飾CXF無法自動處理的類型;使用該Annotation處理的時候,需要指定一個轉換器2.實現自己的轉換器,需要開發一個CXF可以處理的類型;==========================第八講/第十講========================CXF攔截器===========================================================Web Service 急需解決的問題:如何進行權限控制?
思路:服務器端要求input消息攜帶用戶名密碼信息,否則拒絕調用。如果不用CXF等框架,SOAP消息的生成、解析都是由程序員負責的,因此無論是添加用戶名密碼信息,還是提取用戶名密碼信息,都可以由程序員的代碼完成。如果用CXF等框架,SOAP消息的生成、解析都是由CXF等框架來完成的。為了讓程序員能訪問、修改CXF框架所生成的XML(SOAP消息),CXF提供了攔截器。**服務器端添加攔截器1.獲取Endpoint的publish方法返回值;2.調用該方法返回值的getInInterceptors()、getOutInterceptors()方法獲取In、Out攔截器列表,添加攔截器;//調用Endpoint的publish方法發布Web ServiceEndpointImpl ep =EndPoint.publish("http://10.1.14.6");//添加In攔截器ep.getInInterceptors().add(e);//添加Out攔截器ep.getOutInterceptors().add(e);HelloWorldWs factory =newHelloWorldWs();//此處返回的是遠程WebService的代理HelloWorld hw = factory.getHelloWorldPort();Client client =ClientProxy.getClient(hw);client.getInInterceptors().add(e);client.getOutInterceptors().add(e);// 服務器添加校驗Header攔截器//通過PhaseInterceport,可以指定攔截器在哪個階段起作用publicclassAuthInterceptorextendsAbstractPhaseInterceptor<SoapMessage>{publicAuthInterceptor(){//該攔截器會在“調用之前”攔截;Phase是階段常量super(Phase.PRE_INVOKE);}//實現自己的攔截器時,需要實現handleMessage方法//handleMessage方法中的形參就是被攔截到的SOAP消息//一旦程序獲取到SOAP消息,就可以解析或修改SOAP消息@Overridepublicvoid handleMessage(SoapMessage msg)throwFault{//得到SOAP消息的所有HeaderList<Header> headers = msg.getHeaders();}}//客戶端添加Header消息攔截器publicclassAddHeaderInterceptorextendsAbstractPhaseInterceptor<SoapMessage>{privateString userId;privateString userPass;publicAddHeaderInterceptor(String userId,String userPass){super(Phase.PREPAR_SEND);//準備發送時調用this.userId = userId;this.userPass = userPass;}@Overridepublicvoid handleMessage(SoapMessage msg)throwsFault{List<Header> headers = msg.getHeaders();//把ele元素包裝成Header,并添加到SOAP消息的Header列表headers.add(newHeader(newQName("fkjava"),ele));}}
SOAP Header 可選的,有程序員控制添加; Body Body元素總是默認的,Body元素里可有兩種情況 -當Web Service交互正確時,Body元素里的內容由WSDL控制; -當Web Service交互出錯時,Body元素內容是Fault===========================第十二講/第十三講========================CXF與Spring整合==============================================================可以在傳統的Java EE應用的基礎上添加一層Web Service。我們的Java EE應用就可以對外暴露成Web Service,這樣就允許任何平臺任何語言編寫的程序來調用這個Java EE應用。在傳統SSH項目基礎上增加WebService的步驟1.復制CXF的Jar包;(最核心6個)2.在web.xml配置CXF的核心控制器:CXFServlet;3.在Spring配置文件中倒入CXF提供Schema,XML配置文件;4.在Spring配置文件中使用jaxws:endpoint元素暴露WebService;5.如果要添加攔截器,在jaxws:endpoint元素里添加inInterceptors,outInterceptors子元素;**implementor指定WebService的服務提供者。支持兩種方式:a.直接給定服務器提供者的類名(不推薦);<javws:endpoint implementor="org.lr.cxf.ws.impl.HelloWorldWs" address="/lrservice"></javws:endpoint>b.設置為容器中一個bean.<bean id="helloWorldWs" class="org.lr.cxf.ws.impl.HelloWorldWs" p:us-ref="userService"/><!-- id前要加# --><javws:endpoint implementor="#helloWorldWs" address="/lrservice"></javws:endpoint>===========================第十四講=============================CXF與Spring整合的第二種方式_讓JavaEE應用依賴第三方WebService--就是調用WebService==============================================================1.復制CXF的Jar包;(最核心6個)2.在web.xml配置CXF的核心控制器:CXFServlet;3.在Spring配置文件中倒入CXF提供Schema,XML配置文件;4.在Spring配置文件中使用jaxws:client元素調用WebService;5.如果要添加攔截器,在jaxws:client元素里添加inInterceptors,outInterceptors子元素;**為了保證該Web Service代理對象可以自動裝配給Action,應該保證該id屬性值與Action中setter方法名有對應關系<jaxws:client id="hw" serviceClass="org.lr.cxf.ws.HelloWorld" address="http://192.168.10.254:9999/lrservice"></jaxws:client>來自為知筆記(Wiz)附件列表新聞熱點
疑難解答