版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第五講Web服務1 內(nèi) 容一、Web服務簡介二、SOAP三、WSDL四、支持Web服務的J2EE應用2一、Web服務簡介2000年Microsoft等提出“WebServices”Web服務(WebServices)是基于XML和HTTP的一種服務服務訪問協(xié)議:SOAP服務的描述:WSDL服務查找與發(fā)現(xiàn):UDDI3SOAP(SimpleObjectAccessProtocol)XML-based(text)協(xié)議支持遠程通信平臺中立WSDL(WebServicesDefinitionLanguage)接口描述UDDI(UniversalDescription,Discovery,andIntegration)用于WebServices注冊用于發(fā)現(xiàn)WebServices4客戶/服務請求者服務提供者
注冊請求/應答查找基本結(jié)構(gòu):服務信息注冊庫5提供了軟件模塊之間一種松耦合的交互方式根據(jù)需求通過網(wǎng)絡對松散耦合的粗粒度應用組件進行分布式部署、組合和使用服務層是SOA的基礎(chǔ),可以直接被應用調(diào)用,從而有效控制系統(tǒng)中與軟件代理的人為依賴性SOA的幾個關(guān)鍵特性:一種粗粒度、松耦合服務架構(gòu),服務之間通過簡單、精確定義適配器進行通訊,不涉及底層編程適配器和通訊模型6RPCvs.DocumentRPC耦合密切些相對脆弱僅僅是調(diào)用Document耦合松散些對應用修改適應性好沒有序列化/反序列化問題需要額外的設計工作需要解釋客戶消息內(nèi)容,然后進行相應操作7考慮WebServices的幾個理由業(yè)務上需要與外部客戶通信技術(shù)上應用需要與其它語言編寫的客戶程序通信客戶在防火墻之外管理上管理托管webservice應用8什么時候不要使用WebServices客戶程序與應用使用相同語言編寫通信開銷大序列化或者遠程訪問開銷大WebServices/XML處理開銷大“Don’tUseXMLtoCommunicateUnlessYouReally,ReallyHaveTo”–FloydMarinescu,TheMiddlewareCompany永遠記?。篧ebServices/XML是用于集成的9ApacheAxis(ApacheeXtensibleInteractionSystem)
是ApacheWebService項目中的子項目最初起源于IBM的"SOAP4J“最早的一批用于構(gòu)造基于SOAP應用的FrameworkJBoss,WAS等重要的應用服務器都集成它典型的Web服務支持平臺10服務務器器端端AXIS句句柄柄鏈鏈處處理理架架構(gòu)構(gòu)用戶戶配配置置一一系系列列的的handler,,構(gòu)構(gòu)成成handlerchainAXIS依依次次調(diào)調(diào)用用handler處處理理消消息息((含含context))類似似于于interceptor((截截取取器器))11客戶戶端端AXIS句句柄柄鏈鏈處處理理架架構(gòu)構(gòu)12AXIS的的子子系系統(tǒng)統(tǒng)13二、、SOAP1、、SOAP概述述2、、數(shù)據(jù)據(jù)表表示示3、、消息息格格式式4、、協(xié)議議映映射射141、、SOAP概述述許多多程程序序通通過過使使用用遠遠程程過過程程調(diào)調(diào)用用((RPC))在諸諸如如DCOM與與CORBA等等對對象象之之間間進進行行通通信信但RPC會會產(chǎn)產(chǎn)生生兼兼容容性性以以及及安安全全問問題題;;防火火墻墻和和代代理理服服務務器器通通常常會會阻阻止止此此類類流流量量通過過HTTP在在應應用用程程序序間間通通信信是是更更好好的的方方法法因為為HTTP得得到到了了所所有有的的因因特特網(wǎng)網(wǎng)瀏瀏覽覽器器及及服服務務器器的的支支持持SOAP就就是是被被創(chuàng)創(chuàng)造造出出來來完完成成這這個個任任務務的的152000年年5月月,,UserLand、、Ariba、、CommerceOne、、Compaq、、Developmentor、、HP、、IBM、、IONA、、Lotus、、Microsoft以以及及SAP向向W3C提提交交了了SOAP因因特特網(wǎng)網(wǎng)協(xié)協(xié)議議期望望此此協(xié)協(xié)議議能能夠夠通通過過使使用用因因特特網(wǎng)網(wǎng)標標準準((HTTP以以及及XML))把把圖圖形形用用戶戶界界面面桌桌面面應應用用程程序序連連接接到到因因特特網(wǎng)網(wǎng)服服務務器器首個個關(guān)關(guān)于于SOAP的的公公共共工工作作草草案案由由W3C在在2001年年12月月發(fā)發(fā)布布SOAP1.2于于2003年年6月月被被發(fā)發(fā)布布為為W3C推推薦薦標標準準16簡單單對對象象訪訪問問協(xié)協(xié)議議((SOAP)是網(wǎng)網(wǎng)絡絡環(huán)環(huán)境境中中交交換換信信息息的的簡簡單單協(xié)協(xié)議議為網(wǎng)網(wǎng)絡絡環(huán)環(huán)境境下下軟軟件件之之間間結(jié)結(jié)構(gòu)構(gòu)化化、、類類型型化化信信息息的交交換換提供供了了一一種種基基于于XML的機機制制它可可以以廣廣泛泛地地用用于于基基于于消消息息的的系系統(tǒng)統(tǒng)和和基基于于RPC的系統(tǒng)SOAP被設計為可以以與各種其它它協(xié)議結(jié)合使使用但目前SOAP主要和HTTP及HTTP擴展框架相結(jié)結(jié)合17簡單地講,SOAP=HTTP+RPC+XML即:SOAP以HTTP作為底層通訊訊協(xié)議以RPC作為一致性的的調(diào)用途徑以XML作為數(shù)據(jù)傳送送的格式SOAP的設設計原則是:簡單、易易于擴展SOAP的的設計計忽略略了如如下幾幾方面面的功功能::(1))分布布式垃垃圾回回收(2))消息息的批批處理理(3))對象象引用用(4))對象象激活活18SOAP的數(shù)據(jù)據(jù)表示示完全全不同同于以以往互互操作作協(xié)議議的表表示方方法以往的的互操操作協(xié)協(xié)議都都將調(diào)調(diào)用語語句編編排為為二進制制的字字節(jié)流流的形形式SOAP采用XML作為自自己的的數(shù)據(jù)據(jù)表示示方法法XML是與HTML類似的的基于于文本本的標標記語語言SOAP將調(diào)用用語句句編排排為文文本式式的字字符流流的形形式2、數(shù)據(jù)表表示19SOAP消息是是一個個XML文檔包括:一個必需需的SOAP封裝一個可選選的SOAP頭一個必需需的SOAP體3、消息息格式20SOAP封裝定義義了描述述信息和和如何處處理信息息的框架架用于指定定用XMLSchema來描述XML數(shù)據(jù)的編編碼規(guī)則則封裝可以以包含名名域聲明明和附加加屬性如果包含含附加屬屬性,這這些屬性性必須限限定名字字域類似的,,“Envelope””可以包含含附加子子元素這些也必必須限定定名字域域且跟在在SOAP體元素之之后(1)SOAP封裝21SOAP消息頭是是SOAP消息的可可選部分分用來擴展展其它諸諸如安全全、事務務等服務務的重要要機制如果出現(xiàn)現(xiàn)的話,,必須是是SOAP封裝元素素的第一一個直接接子元素素SOAP頭可以包包含多個個SOAP塊每個都是是SOAP頭元素的的直接子子元素所有SOAP頭的直接接子元素素都必須須限定名名字域(2)SOAP消息頭22SOAP體在SOAP消息中必必須出現(xiàn)現(xiàn)且必須是是SOAP封裝元素素的直接接子元素素SOAP體可以包包括多個個條目每個條目目必須是是SOAP體元素的的直接子子元素SOAP體元素的直直接子元素素可以限定定名字域(3)SOAP體23SOAP自然地遵循循HTTP的請求/應答消息模模型使得SOAP的請求和應應答參數(shù)可可以包含在在HTTP請求和應答答中SOAPHTTP遵循HTTP中表示通信狀狀態(tài)信息的的HTTP狀態(tài)碼的語語義例如,2xx狀態(tài)碼表示示這個包含了了SOAP組件的客戶戶請求已經(jīng)被成功功的收到、、理解和接接受下頁的代碼碼是一個使用用POST的SOAPHTTP例子子該消息通過過HTTP發(fā)出一條條請求“獲取股票票代碼為ABC的最新交易易價格”24251、互操作開開銷不同IIOP、JRMP使用二進制制的字節(jié)流流形式編排排消息(CDR、XDR)SOAP采用字符型型的XML編排消息SOAP消息要比IIOP、JRMP消息長得多多SOAP的編排開銷銷大、占用用內(nèi)存空間間大2、表達能力力不同SOAP易于學習、、易于開發(fā)發(fā)、易于調(diào)調(diào)試SOAP不支持消息息的批處理理、對象引引用、對象象激活等特特性降低了SOAP的表達能力力并使得基于于SOAP的交互受到到限制而IIOP、JRMP等則不存在在這種限制制與其它協(xié)議議的比較263、適應能力力不同IIOP、JRMP嚴重制約于于防火墻防火墻一般般由兩個路路由器與一一個應用程程序網(wǎng)關(guān)構(gòu)構(gòu)成路由器負責責IP層的分組信信息列出可接受受、禁止的的源端和目目標端等信信息應用程序網(wǎng)網(wǎng)關(guān)在應用用程序級進進行控制根據(jù)頭信息息字段、消消息長度、、消息內(nèi)容容等決定傳送還還是丟棄消消息這是IIOP、JRMP的應用受到到限制的核核心因素之之一SOAP則基本不受受其限制4、適用環(huán)環(huán)境不同JRMP適適用于使用用JAVA的應用系系統(tǒng)IIOP、、SOAP支持各種種語言,因因此適用面面更廣IIOP適適合于同一一個防火墻墻內(nèi)部之間間的交互而SOAP則適合于于跨越防火火墻的交互互27三、WSDL1、概述2、文檔結(jié)結(jié)構(gòu)3、例子4、向SOAP的映映射281、概述WSDL(WebServicesDescriptionLanguage)是一個建建議性標準準在Microsoft的SDL(ServiceDescriptionLanguage和SCL(SOAPContractLanguage)和IBM的NASSL(NetworkAccessibleServiceSpecificationLanguage)這這兩項技術(shù)術(shù)的結(jié)合,,形成了WSDL的的基礎(chǔ)2000年年9月25日IBM、Microsoft和Ariba提出WSDL1.02001年年3月15日,他們們提交的WSDL1.1成為為W3C的的Note2002年年7月9日日提出WSDL1.22003年年11月10日提出出WSDL2.029類型消息端口類型綁定服務操作操作端口抽象定義具體說明WSDL文檔代表依賴關(guān)關(guān)系代表包含關(guān)關(guān)系2、文檔結(jié)結(jié)構(gòu)30類型:獨立于計計算機和語語言的類型型定義使用某一類類型系統(tǒng)((例如XSD)進行數(shù)據(jù)據(jù)類型定義義的容器用用于描述述被交換的的消息消息:對通信數(shù)數(shù)據(jù)的一個個抽象、類類型化定義義一個消息包包含多個邏邏輯部分每一個都與與某一個類類型系統(tǒng)中中的定義相相關(guān)聯(lián)包含函數(shù)參參數(shù)(輸入入與輸出分分開)或文文檔說明端口類型:由一個或或多個端點點支持操作作的抽象集集合每個操作對對應于一個個輸入消息息與一個輸輸出消息它引用消息息節(jié)中的消消息定義來來說明函數(shù)數(shù)基調(diào)操作名稱、、輸入?yún)?shù)數(shù)和輸出參參數(shù)等(1)抽象定義義31綁定:為一個由由特定端口口類型定義義的操作與與消息指定具體的的協(xié)議及數(shù)數(shù)據(jù)格式規(guī)規(guī)范服務:指定每個個綁定的端端口地址(2)具體說明明323、例子33<bindingname="SimpleBinding"type="wsdlns:SimplePortType"><stk:bindingpreferredEncoding="UTF-8"/><soap:bindingstyle="rpc"transport="/soap/http"/><operationname="foo"><soap:operationsoapAction="/action/Simple.foo"/><input><soap:bodyuse="encoded"namespace="/message/"encodingStyle="/soap/encoding/"/></input><output><soap:bodyuse="encoded"namespace="/message/"encodingStyle="/soap/encoding/"/></output></operation></binding><servicename="FOOSAMPLEService"><portname="SimplePort"binding="wsdlns:SimpleBinding"><soap:addresslocation="http://carlos:8080/FooSample/FooSample.asp"/></port></service></definitions>34interfaceFooSample{longfoo(longarg);}用OMG-IDL表表示為:35對應的SOAP請求求消息為::<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><SOAP-ENV:EnvelopeSOAP-ENV:encodingStyle="/soap/encoding/"xmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><m:fooxmlns:m="/message/"><arg>5131953</arg></m:foo></SOAP-ENV:Body></SOAP-ENV:Envelope>4、向SOAP的映映射36<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><SOAP-ENV:EnvelopeSOAP-ENV:encodingStyle="/soap/encoding/"xmlns:SOAP-ENV="/soap/envelope/"><SOAP-ENV:Body><SOAPSDK1:fooResponsemlns:SOAPSDK1="/message/"><result>5131953</result></SOAPSDK1:fooResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>37與其它描述述方法的比比較有的以描述述結(jié)構(gòu)化程程序的功能能為主例如RPC-IDL微軟的-IDL有的以描述述對象的功功能為主例如CORBA的IDL有的以描述述服務為主主例如webservice的WSDL1、描述對象象不同38有的以具體體計算機語語言的方式式表達例如SUN的JavaInterface有的以獨立立于具體的的計算機語語言但十分類似似于計算機機語言的方方式表達例如:RPC-IDL微軟的-IDLCORBA的IDL有的以XML為方式表達達例如:webservice的WSDL2、描述方式式不同39有的僅描述述接口的語語法信息例如:RPC-IDL微軟的-IDLCORBA的IDL有的還包括與與底層協(xié)議的的綁定信息例如:WSDL等在CORBA中這部分信息息包含在IOR中3、描述內(nèi)容不不同40如何為web系統(tǒng)增增加webservices接口口下面模塊可以以暴露為WebServices:EJBPOJO后面的例子針針對EJB四、支持Web服務的的J2EE應應用41JAX-RPC:JavaAPIforXML-basedRPCJava世界界的webservice編編程模型規(guī)范范如何以類似RPC的的方式調(diào)用webserviceJAX—RPC的客戶端端編程模式有有以下的三種種:Staticstub(靜態(tài)的客客戶端存根調(diào)調(diào)用)Dynamicproxy(部部分動態(tài)的代代理調(diào)用)Dynamicinvocationinterface(DII)(動動態(tài)調(diào)用接口口)42三種JAX——RPC的客客戶端編程模模式43Staticstub1)首先通通過映射轉(zhuǎn)換換將服務描述述的WSDL文檔生成客客戶端的Javastub2)然后實實例化服務的的locator實例3)通過loacator獲得服服務在客戶端端的代理4)用客戶戶端代理去去調(diào)用服務44packageitso.test;importjava.io.*;importjava.util.*;importitso.test.*;publicclassWeatherForecastClient{publicstaticvoidmain(String[]args){try{WeatherForecastServiceLocatorwsl=newWeatherForecastServiceLocator();WeatherForecastServicews=(WeatherForecastService)wsl.getWeather();Stringtemperature=ws.getTemperature();System.out.println(temperature);System.out.println("WeatherForecastClientcompleted");}catch(Exceptione){e.printStackTrace();}}}45Dynamicproxy與Staticstub不同的的是可以指定定生成的客戶戶端代理46一個汽車網(wǎng)站站的例子例子構(gòu)成:JSPsControllerServletStatelessSessionBean–InventoryFacadeBeanHibernateDAOs暴露對象:InventoryFacadeBean.findAllAvailableCars()47服務端點接口口將業(yè)務方法暴暴露為WebServices類似于服務器器端的stub類似于EJBRemoteInterfacepackagecom.jbossatwork.ws;/***ServiceendpointinterfaceforInventoryFacade.*/publicinterfaceInventoryEndpointextendsjava.rmi.Remote{publiccom.jbossatwork.ws.CarDTOArrayfindAvailableCars()throwsjava.rmi.RemoteException;}//InventoryEndpoint.java48修改ejb-jar.xml<enterprise-beans>…<session>…<display-name>InventoryFacadeSB</display-name><ejb-name>InventoryFacade</ejb-name>…<service-endpoint></service-endpoint>…</session>…</enterprise-beans>49webservices.xml定義并并注冊冊InventoryServiceWebService將ServiceEndpointInterfaceclass綁綁定到到InventoryFacadeBeanEJB告訴J2EEappserver到到哪哪里找找WSDL與與JAX-RPC映映射射文件件(Mappingfiles,inEJBJARfile))5051JAX-RPC映映射文文件幫助JAX-RPC編編譯譯器將將Java對對象映映射到到WSDL對對象復雜的的Java對對象導導致復復雜的的JAX-RPC與與WSDL文文件件5253<java-xml-type-mapping><java-type>com.jbossatwork.dto.CarDTO</java-type><root-type-qnamexmlns:typeNS="http://localhost:8080/jbossatwork-ws/types">typeNS:CarDTO</root-type-qname><qname-scope>complexType</qname-scope><variable-mapping><java-variable-name>id</java-variable-name><xml-element-name>id</xml-element-name></variable-mapping><variable-mapping><java-variable-name>make</java-variable-name><xml-element-name>make</xml-element-name></variable-mapping><variable-mapping><java-variable-name>model</java-variable-name><xml-element-name>model</xml-element-name></variable-mapping><variable-mapping><java-variable-name>modelYear</java-variable-name><xml-element-name>modelYear</xml-element-name></variable-mapping>54<variable-mapping><java-variable-name>status</java-variable-name><xml-element-name>status</xml-element-name></variable-mapping></java-xml-type-mapping><service-interface-mapping><service-interface>com.jbossatwork.ws.InventoryService</service-interface><wsdl-service-namexmlns:serviceNS="http://localhost:8080/jbossatwork-ws">serviceNS:InventoryService</wsdl-service-name><port-mapping><port-name>InventoryEndpointPort</port-name><java-port-name>InventoryEndpointPort</java-port-name></port-mapping></service-interface-mapping>55<service-endpoint-interface-mapping><service-endpoint-interface></service-endpoint-interface><wsdl-port-typexmlns:portTypeNS="http://localhost:8080/jbossatwork-ws">portTypeNS:InventoryEndpoint</wsdl-port-type><wsdl-bindingxmlns:bindingNS="http://localhost:8080/jbossatwork-ws">bindingNS:InventoryEndpointBinding</wsdl-binding><service-endpoint-method-mapping><java-method-name>findAvailableCars</java-method-name><wsdl-operation>findAvailableCars</wsdl-operation><wsdl-return-value-mapping><method-return-value>com.jbossatwork.dto.CarDTOArray</method-return-value><wsdl-messagexmlns:wsdlMsgNS="http://localhost:8080/jbossatwork-ws">wsdlMsgNS:InventoryEndpoint_findAvailableCarsResponse</wsdl-message><wsdl-message-part-name>result</wsdl-message-part-name></wsdl-return-value-mapping></service-endpoint-method-mapping></service-endpoint-interface-mapping></java-wsdl-mapping>56WSDLFile57<complexTypename="CarDTO"><sequence><elementname="id"type="int"/><elementname="make"type="string"nillable="true"/><elementname="model"type="string"nillable="true"/><elementname="modelYear"type="string"nillable="true"/><elementname="status"type="string"nillable="true"/></sequence></complexType></schema></types><messagename="InventoryEndpoint_findAvailableCars"/><messagename="InventoryEndpoint_findAvailableCarsResponse"><partname="result"type="ns2:CarDTOArray"/></message><portTypename="InventoryEndpoint"><operationname="findAvailableCars"><inputmessage="tns:InventoryEndpoint_findAvailableCars"/><outputmessage="tns:InventoryEndpoint_findAvailableCarsResponse"/></operation></portType>58<bindingname="InventoryEndpointBinding"type="tns:InventoryEndpoint"><soap:bindingtransport="/soap/http"style="rpc"/><operationname="findAvailableCars"><soap:operationsoapAction=""/><input><soap:bodyuse="literal"namespace="http://localhost:8080/jbossatwork-ws"/></input><output><soap:bodyuse="literal"namespace="http://localhost:8080/jbossatwork-ws"/></output></operation></binding><servicename="InventoryService"><portname="InventoryEndpointPort"binding="tns:InventoryEndpointBinding"><soap:addresslocation="REPLACE_WITH_ACTUAL_URL"/></port></service></definitions>59修改WSDLURL60修改EJB/***@ejb.bean*name="InventoryFacade"*……*view-type="all"*…**@wsee.port-component*name="Inventory"*wsdl-port="InventoryEndpointPort"*service-endpoint-interface="com.jbossatwork.ws.InventoryEndpoint"*service-endpoint-bean="com.jbossatwork.ejb.InventoryFacadeBean"**@erface*service-endpoint-class="com.jbossatwork.ws.InventoryEndpoint"**/publicclassInventoryFacadeBeanimplementsSessionBean{…61/***@erface-method*view-type="all"*…**/publicCarDTOArrayfindAvailableCars()throwsEJBException{CarDTOArraycarDTOArray=newCarDTOArray();CarDTO[]cars=(CarDTO[])listAvailableCars().toArray(newCarDTO[0]);carDTOArray.setCars(cars);returncarDTOArray;}/***@erface-method*view-type="both"*…**/publicListlistAvailableCars()throwsEJBException{…}…}62WebServices與與Collectionspackagecom.jbossatwork.dto;importjava.io.Serializable;importcom.jbossatwork.dto.CarDTO;publicclassCarDTOArrayimplementsSerializable{privateCarDTO[]cars;publicCarDTOArray(){}publicCarDTO[]getCars
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件開發(fā)二手房買賣合同樣本
- 城市排水招投標廉潔合同模板
- 墻繪裝飾施工合同
- 新能源項目招投標合同風險防范
- 房屋戶外照明安裝合同
- 教育培訓機構(gòu)裝修施工合同
- 國際實驗室地暖系統(tǒng)安裝工程合同
- 勞動合同簽訂與解除規(guī)范
- 水利工程建造師聘用合同范例
- 交通運輸設備維修合同
- 2024年四川省達州市中考英語試題含解析
- 金融求職自我介紹
- 標志設計(全套課件88P)
- 2023年高考物理一輪復習練習題:靜電場及其應用(含基礎(chǔ)、提升兩套)
- 鋰離子電池行業(yè)發(fā)展趨勢
- 第十八章 正比例函數(shù)和反比例函數(shù)(5類壓軸題專練)
- 單項式乘多項式教案
- 遼寧省大連市中山區(qū)2024-2025學年九年級上學期期中化學試題
- 天津市天津市紅橋區(qū)2024-2025學年八年級上學期10月期中英語試題
- 老舊房子改造合同模板
- 幼兒園實習生總結(jié)會方案
評論
0/150
提交評論