乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      開發(fā)者關(guān)于 JAX-RPC 的介紹,第 2 部分: 研究 JAX-RPC 的規(guī)范提高 Web 服務(wù)互操作性

       不會(huì)游泳的魚 2007-06-25

      2003 年 1 月 01 日

      在 這個(gè)系列的第一篇文章里, Joshy Joseph 討論了 JAX-RPC 標(biāo)準(zhǔn)的一個(gè)重要方面:它的類型映射系統(tǒng)。既然知道了 JAX-RPC 怎樣把 XML 類型映射成 Java 類型,您就可以認(rèn)真地研究這個(gè)規(guī)范,包括它的異常處理機(jī)制和潛在的運(yùn)行時(shí)服務(wù)了。讀完本文后,您就可以開始構(gòu)建基于 JAVA 的互操作 Web 服務(wù)了。

      基于 XML 的遠(yuǎn)程過(guò)程調(diào)用的 JAVA API(Java APIs for XML-based Remote Procedure Call(JAX-RPC))在 Java Community Process 已經(jīng)作為 JSR 101 進(jìn)入了最后建議階段。XML Web 服務(wù)提供商已經(jīng)開始將這個(gè)包作為核心 API 在 JAVA 平臺(tái)上構(gòu)建互操作 Web 服務(wù)。在本系列中,我會(huì)引導(dǎo)讓您一步一步地了解這個(gè)標(biāo)準(zhǔn)提供的主要功能,并使用樣本代碼作為全程指導(dǎo)。

      本系列的第一部分中,我描述了 WSDL/XML 類型和 JAVA 類型之間的互相映射。我解釋了 JAX-RPC 標(biāo)準(zhǔn)怎樣定義該功能,以及關(guān)于如何設(shè)計(jì)互操作類型系統(tǒng)的一些要點(diǎn)。在某種程度上,這個(gè)類型映射標(biāo)準(zhǔn)有助于使 Web 服務(wù)運(yùn)行時(shí)系統(tǒng)實(shí)現(xiàn)消息級(jí)別的互操作性。

      在這本系列的第二部分中,您將學(xué)到如何用 JAX-RPC 標(biāo)準(zhǔn)的客戶機(jī)和服務(wù)器端接口定義和消息處理模型實(shí)現(xiàn)下一級(jí)別的 Web 服務(wù)互操作性。

      您可以回憶一下,JAX-RPC 規(guī)范包括下列主題:

      • 類型映射系統(tǒng)
      • 服務(wù)端點(diǎn)
      • 異常處理
      • 服務(wù)端點(diǎn)上下文
      • 消息處理程序
      • 服務(wù)客戶機(jī)和服務(wù)上下文
      • 帶附件的 SOAP
      • 運(yùn)行時(shí)服務(wù)
      • JAX-RPC 客戶機(jī)調(diào)用模型

      正 如我在本系列的第 1 部分談到的那樣,我討論了 JAX-RPC 的類型映射系統(tǒng)的重要方面?,F(xiàn)在我將探究一下規(guī)范中剩余部分的重點(diǎn)。正如我在第一部分所做的那樣,我將用一段代碼(來(lái)自為 ACME 售書商所做的樣本 Web 服務(wù))來(lái)描述這些要點(diǎn)。要想了解關(guān)于本示例的更多信息,請(qǐng)參閱第 1 部分,要了解關(guān)于本示例完整的 WSDL 清單,請(qǐng)參閱 附錄。(請(qǐng)參閱 參考資料以了解更多信息)

      服務(wù)端點(diǎn)

      JAX-RPC 服務(wù)端點(diǎn)指的是真正的服務(wù)實(shí)現(xiàn)所依賴的 Web 服務(wù)端點(diǎn)。請(qǐng)參閱 圖 1,那里有一個(gè)服務(wù)端點(diǎn)實(shí)現(xiàn)(具體的)類和一個(gè)服務(wù)端點(diǎn)接口的定義。



      圖 1. 服務(wù)實(shí)現(xiàn)接口層次結(jié)構(gòu)
      服務(wù)實(shí)現(xiàn)接口層次結(jié)構(gòu)

      服務(wù)端點(diǎn)接口

      Web 服務(wù)端點(diǎn)類是通過(guò)使用 WSDL2JAVA(一個(gè)由 Apache Axis 提供的 WSDL 到 Java 的映射工具)由服務(wù)端點(diǎn)界面派生出來(lái)的,而服務(wù)端點(diǎn)界面是根據(jù) WSDL 定義創(chuàng)建的。正如 JAX-RPC 規(guī)范的 5.2 節(jié)中預(yù)先定義好的一樣,這些服務(wù)端點(diǎn)必須和服務(wù)端點(diǎn)接口定義一致。這個(gè)定義的一些要求如下:

      • 所有服務(wù)端點(diǎn)必須繼承 java.rmi.Remote 接口。
      • 所有由這個(gè)接口實(shí)現(xiàn)的方法必須拋出一個(gè) java.rmi.RemoteException 。可能有特定于應(yīng)用程序的異常作為這個(gè)標(biāo)準(zhǔn)異常的補(bǔ)充。
      • 這個(gè)方法參數(shù)必須是 JAX-RPC 支持的 Java 類型。用這種方法,這個(gè)規(guī)范為 Java 平臺(tái)和它對(duì)應(yīng)的 XML 類型保證了一個(gè)適當(dāng)?shù)男蛄谢?反序列化機(jī)制。
      • 通常,Java接口可以通過(guò)使用 public static final 聲明維護(hù)常量數(shù)據(jù)。然而,JAX-RPC 規(guī)范阻礙您這么做,這個(gè)規(guī)范表明 WSDL 1.1 在 wsdl.porttype 中對(duì)常量的表示不標(biāo)準(zhǔn)。
      • 您可以使用 HolderSOAPElement 類作為接口方法的自變量。(請(qǐng)參閱這個(gè)系列的第 1 部分,您可得到關(guān)于 HolderSOAPElement 類的更多信息。)

      清單 1包含一個(gè)服務(wù)端點(diǎn)接口的示例。



      清單 1. 服務(wù)端點(diǎn)接口
      Public interface AuthorSearchService implements java.rmi.Remote{
      Public Books[] seachForAuthor(String authorName) throws java.rmi.RemoteException,
      com.acme.InvalidAuthorName;
      }

      注意 清單 1 中的樣本端點(diǎn)接口處理運(yùn)行時(shí) RemoteException 和應(yīng)用程序級(jí)的 InvalidAuthorName 。在我描述 JAX-RPC 異常處理時(shí),我將更深入地看一下語(yǔ)義上的意思以及應(yīng)用程序異常之間的關(guān)系(在 WSDL 的上下文環(huán)境里)。

      也要注意,基于 SOAP 的分布式系統(tǒng)和基于其他協(xié)議(如 RMI)的分布式系統(tǒng)的主要的實(shí)現(xiàn)上的區(qū)別是,前者不支持通過(guò)引用傳遞和返回對(duì)象。因此您應(yīng)該避免去創(chuàng)建一個(gè)使用遠(yuǎn)程引用作為參數(shù)或返回值的服務(wù)端點(diǎn)。另外 JAVA 值的類型和數(shù)組不應(yīng)該存有遠(yuǎn)程引用。

      一些服務(wù)提供商(如 WASP)有支持遠(yuǎn)程對(duì)象引用的實(shí)現(xiàn)。可是為這些實(shí)現(xiàn)寫的代碼可能在運(yùn)行時(shí)系統(tǒng)之間缺少可移植性。例如,可能不是所有的 JAX-RPC 系統(tǒng)都支持 清單 2 中的代碼,因?yàn)? BookSearchBroker 對(duì)象是通過(guò)引用返回的。



      清單 2. 潛在的無(wú)可移植性的代碼
      Public interface BookSearchBroker extends java.rmi.Remote{
      Public Books[] searchForAuthor(String tickerSymbol) throws java.rmi.RemoteException;
      }
      public interface StockQuote extends java.rmi.Remote{
      public BookSearchBroker getBooksSearchBroker() throws java.rmi.RemoteException;
      }

      服務(wù)端點(diǎn)實(shí)現(xiàn)類型

      服務(wù)端點(diǎn)實(shí)現(xiàn)類型是由服務(wù)端點(diǎn)接口派生出來(lái)的。作為對(duì)這個(gè)接口的補(bǔ)充,這個(gè)服務(wù)端點(diǎn)實(shí)現(xiàn)類可能實(shí)現(xiàn) ServiceLifecycle 接口來(lái)管理服務(wù)的生命周期(請(qǐng)參閱 圖 1)。這個(gè)接口的聲明在 清單 3中給出。



      清單 3. 服務(wù)生命周期聲明
      Public interface ServiceLifecycle{
      void init (Object context) throws ServiceException;
      void destroy();
      }

      這個(gè)接口使得 JAX-RPC 運(yùn)行時(shí)系統(tǒng)能管理 Web 服務(wù)示例的生命周期。(如果這個(gè)服務(wù)實(shí)現(xiàn)是一個(gè) servlet,那么這個(gè)運(yùn)行時(shí)系統(tǒng)就是一個(gè) servlet 容器。)這個(gè)運(yùn)行時(shí)系統(tǒng)負(fù)責(zé)裝載服務(wù)端點(diǎn)類以及服務(wù)端點(diǎn)類的實(shí)例化。實(shí)例化之后,它將調(diào)用 ServiceLifecycle.init() 方法來(lái)初始化服務(wù)示例。 ServiceLifecycle.init() 認(rèn)為運(yùn)行時(shí)上下文 ServiceContext 是一個(gè)參數(shù)。我將在后面的題名為 服務(wù)上下文的部分里更加的在細(xì)節(jié)上討論運(yùn)行時(shí)上下文這個(gè)問題。

      您開發(fā)一個(gè)服務(wù)端點(diǎn)類時(shí),您必須確保這個(gè)端點(diǎn)不維護(hù)任何屬于客戶機(jī)的狀態(tài)。這個(gè)運(yùn)行時(shí)系統(tǒng)可以把多個(gè)對(duì)該服務(wù)端點(diǎn)接口的客戶機(jī)調(diào)用分派到對(duì)于這個(gè)單一實(shí)例。并且注意這些服務(wù)端點(diǎn)示例可能被運(yùn)行時(shí)程序合用以提高性能。

      在運(yùn)行時(shí)系統(tǒng)把端點(diǎn)從客戶服務(wù)里除去時(shí),這個(gè)運(yùn)行時(shí)系統(tǒng)必須調(diào)用 ServiceLifecycle.destroy() 方法。這有助于服務(wù)類實(shí)例放棄它正在使用的資源。





      回頁(yè)首


      異常處理

      您可以看到 JAX-RPC 規(guī)范試圖在應(yīng)用程序級(jí)和運(yùn)行系統(tǒng)級(jí)處理 Web 服務(wù)運(yùn)行時(shí)的異常,這是基于服務(wù)端點(diǎn)接口的標(biāo)準(zhǔn)設(shè)計(jì)方法以及它對(duì) wsdl.fault 元素的映射。

      這個(gè)特定于服務(wù)的異常是在 wsdl.fault 元素中聲明的,這些異常類型是由 java.lang.Exception 類派生的。 清單 4 中的 wsdl.operation 聲明包括特定的 wsdl.fault 元素。



      清單 4. wsdl.operation 聲明
      <message name="AuthorNotFoundException">
      <part name="Author" type="xsd:string" />
      </message>
      <portType name ="BookSearch">
      <operation name="getBooksByAuthor" >
      <input message="tns:getAuthorName">
      <output message="tns:getBookList">
      <fault name=" AuthorNotFoundException" message=" tns: AuthorNotFoundException">
      </operation>
      </portType>

      清單 5中,您可以看到 JAX-RPC 規(guī)范怎樣創(chuàng)建它的服務(wù)端點(diǎn)來(lái)處理特定于服務(wù)的 JAVA 異常。



      清單 5. 處理特定于服務(wù)的 JAVA 異常
      Public interface BookSearch implements java.rmi.Remote{
      Public Books[] getBooksByAuthor(String authorName) throws java.rmi.RemoteException,
      com.acme.AuthorNotFoundException;
      }

      清單 6包括作為結(jié)果創(chuàng)建的 JAVA 異常類



      清單 6. Java 異常類
      public class AuthorNotFoundException extends java.lang.Exception{
      ...........
      public AuthorNotFoundException(String Author ){
      .....
      }
      public getAuthor(){...}
      }





      回頁(yè)首


      服務(wù)端點(diǎn)上下文

      JAX-PPC 允許運(yùn)行時(shí)系統(tǒng)靈活地管理上下文信息(注意, ServiceLifecycle.init() 方法希望得到 Object 類型的上下文)。每一個(gè)運(yùn)行時(shí)環(huán)境可以維護(hù)它自己獨(dú)特的上下文信息。例如,基于 servlet 的運(yùn)行時(shí)系統(tǒng)維護(hù)一個(gè) ServletEndpointContext 對(duì)象。EJB 2.1 規(guī)范定義了 EJB SessionContext 。

      作 為一個(gè)例子,我們來(lái)探究一個(gè)基于 servlet 的運(yùn)行時(shí)系統(tǒng),然后看一下它是怎樣管理上下文信息的。這個(gè) servlet 端點(diǎn)上下文包括的信息有用戶主體、消息上下文、基于 http 的用戶會(huì)話信息以及 servlet 上下文。這個(gè)規(guī)范要求服務(wù)運(yùn)行時(shí)在所有對(duì)服務(wù)端點(diǎn)實(shí)例的遠(yuǎn)程方法調(diào)用之間維護(hù)全部這些信息。您可以從下面的清單 7 中的服務(wù)上下文接口看到,這是一個(gè)有價(jià)值的信息,一個(gè)服務(wù)可以通過(guò)多種途徑利用它:

      • HTTP 會(huì)話信息幫助客戶機(jī)維護(hù)和服務(wù)器的 HTTP 會(huì)話。這是可以任選的功能部件。
      • 用戶主體(如果運(yùn)行時(shí)系統(tǒng)已經(jīng)驗(yàn)證了這個(gè)用戶)幫助服務(wù)開發(fā)者驗(yàn)證用戶來(lái)得到特定的運(yùn)行時(shí)操作。
      • 另外一個(gè)很好的由這個(gè)接口提供的功能是它對(duì) SOAP 信息上下文傳播的支持。這幫助服務(wù)實(shí)現(xiàn)者從請(qǐng)求處理程序鏈中獲得 SOAP 信息上下文,然后處理該上下文并將其與響應(yīng)處理程序鏈關(guān)聯(lián)。

      簡(jiǎn)單的說(shuō),這個(gè)接口提供了關(guān)于調(diào)用程序、消息、當(dāng)前環(huán)境的細(xì)節(jié)的動(dòng)態(tài)運(yùn)行時(shí)信息。

      清單 7告訴您怎樣擴(kuò)展您的服務(wù)實(shí)現(xiàn)類來(lái)支持生命周期管理以及怎樣使用服務(wù)上下文。



      清單 7. 服務(wù)上下文接口
      Public interface BookSearchServiceImpl implements java.rmi.Remote, javax.xml.rpc.server. 
      ServiceLifecycle {
      public void init(Object context) throws ServiceException{
      ServletEndpointConext sC = (ServletEndpointConext)context;
      Java.security.Principal userPrinciple = sC. getUserPrincipal();
      HttpSession session = null;
      Try{
      session = sC.getHttpSession();
      }catch(JAXRPCException e){ // Not an HTTP based
      //endpoint
      }
      MessageContext ctx = sC.getMessageContext();
      }
      public void destroy(){
      }
      public Books[] searchForBooks(String authorName)
      throws java.rmi.RemoteException, com.acme.InvalidAuthor{
      return null;
      }
      }





      回頁(yè)首


      消息處理程序

      現(xiàn)在我們來(lái)考慮一下 JAX-RPC 規(guī)范的最強(qiáng)大的功能, 消息處理程序。 消息處理程序向 Web 服務(wù)端點(diǎn)(客戶機(jī)和服務(wù)器)提供了附加的消息處理功能,作為對(duì)基本服務(wù)實(shí)現(xiàn)邏輯的擴(kuò)展。處理程序可以處理加密和解密、日志記錄和審計(jì)等。當(dāng)前的 JAX-RPC 運(yùn)行時(shí)系統(tǒng)僅僅定義了 SOAP 消息處理程序,但是它可以很靈活的定義其他處理程序,而且不需要任何消息處理模型。



      圖 2. 服務(wù)和處理程序調(diào)用模型
      Service and handler invocation model

      JAX-RPC 處理程序 API 定義了三個(gè)基本的方法,還有兩個(gè)生命周期方法,表示在清單 8 中。



      清單 8. 處理程序方法
      public class Handler{
      handleRequest(MessageContext context)
      handleResponse(MessageContext context)
      handleFaults(MessageContext context)
      init(HandlerInfo info);
      destroy();
      ...........
      }

      一個(gè)處理程序應(yīng)該被作為無(wú)狀態(tài)的實(shí)例實(shí)現(xiàn)。通過(guò)提供初始化的接口( Handler.init (HandlerInfo info) ),運(yùn)行時(shí)系統(tǒng)可以把所要求的上下文信息傳遞給處理程序。這將幫助處理程序獲得特定于容器的增值功能的訪問權(quán),包括認(rèn)證機(jī)制,事務(wù)處理,日志記錄的框架等。

      處理程序?qū)崿F(xiàn)和 JSR 109


      在 為 J2EE 容器開發(fā) JAX-RPC 處理程序之前,您必須向 J2EE 容器供應(yīng)商咨詢。根據(jù)實(shí)現(xiàn)企業(yè) Web 服務(wù)(Implementing Enterprise Web Services)規(guī)范(JSR109),處理程序在應(yīng)用程序執(zhí)行上下文中運(yùn)行,因此只能支持有限的功能。為了更好地理解這個(gè)因容器產(chǎn)生的限制,請(qǐng)考慮一 下有關(guān)安全性的情況:您可能不會(huì)寫 JAX-RPC 的處理程序來(lái)支持 WS-Security 在應(yīng)用程序?qū)舆M(jìn)行認(rèn)證和授權(quán)。這個(gè)決定應(yīng)該在應(yīng)用程序執(zhí)行之前作出。請(qǐng)參閱您的 J2EE 容器供應(yīng)商文檔中關(guān)于 Web 服務(wù)的內(nèi)容,以獲得更多信息。要了解更多關(guān)于 JSR109 的信息,請(qǐng)參閱下面的 參考資料。

      您可以隨意地從 API 提供的缺省處理程序派生出新的處理程序,也可以從 SOAP 消息處理程序( SOAPMessageContext 作為一個(gè)參數(shù))或者普通處理程序來(lái)派生出新的處理程序。處理程序可以修改傳遞到自身的消息。因?yàn)槌鲇诎踩缘脑?,這些處理程序是很靈活的,所以大多數(shù)現(xiàn) 在可用的框架將在運(yùn)行時(shí)系統(tǒng)的控制下管理它們。例如,在一個(gè) J2EE 的容器里,處理程序可能是 J2EE 容器的一部分。因此,您應(yīng)該去查找您的應(yīng)用程序服務(wù)器(運(yùn)行時(shí))供應(yīng)商文檔來(lái)找到更多關(guān)于和您正在使用的產(chǎn)品一起被提供的內(nèi)置處理程序信息。這些內(nèi)置處理 程序可能是為 WS-Security、WS-Transaction 或日志記錄等原因設(shè)計(jì)的。盡管您能編寫自己的 JAX-RPC 處理程序,應(yīng)用程序服務(wù)器提供商也能夠根據(jù)配置和安全策略決定是否允許一個(gè)新的處理程序存在。

      處理程序鏈

      處理程序鏈表示一個(gè)有序的處理程序清單。這個(gè)分組有助于您定義和該處理程序調(diào)用模型相關(guān)聯(lián)的策略。這些策略的示例包括調(diào)用順序、調(diào)用風(fēng)格(例如一個(gè)單向的調(diào)用只調(diào)用 handleRequest() ;它不會(huì)調(diào)用 handleResponse() )等。另外一個(gè)您可以在處理程序鏈上設(shè)置的的策略:處理程序鏈可以根據(jù) SOAP 頭最外層的元素的 qname 調(diào)用處理程序。您可以通過(guò) Handler.init() 方法傳遞一個(gè) HandlerInfo 對(duì)象來(lái)將這個(gè)關(guān)聯(lián)配置到處理程序。只有當(dāng)前正在處理的處理程序返回 true 時(shí),處理程序鏈才繼續(xù)處理這個(gè)處理程序。

      您可以通過(guò)指定動(dòng)作者( 角色;請(qǐng)參閱 SOAP 1.1 規(guī)范以了解更多細(xì)節(jié);您可以在下面的 參考資料部分找到一個(gè)相關(guān)的鏈接)的 URI 來(lái)將處理程序鏈和 SOAP 動(dòng)作者相關(guān)聯(lián)。缺省情況下,處理程序鏈總是一直與特定的 SOAP 動(dòng)作者 next 相關(guān)聯(lián)。正如 WSDL 端口限定名所表明的,處理程序鏈?zhǔn)窃诿糠?wù)端點(diǎn)的基礎(chǔ)上注冊(cè)的。

      清單 9顯示了一個(gè)能訪問 SOAP 消息頭的樣本實(shí)現(xiàn)。



      清單 9. 樣本處理程序
      Public class AcmeSOAPHeaderHandler extends GenericHandler{
      Public Boolean handleRequest(MessageContext ctx){
      try{
      SOAPMessageContext mc = (SOAPMessageContext)ctx;
      SOAPMessage msg = mc.getMessage();
      SOAPPart sp = msg.getSOAPPart();
      SOAPEnvelop se = sp.getEnvelop();
      SOAPHeader header= se.getHeader();
      // Now we can process the header
      if (everything fine )
      return true; // chain handlers
      //continue processing
      else{
      //Return false results in chaining to stop
      return false;
      }
      }catch(Exception ex){
      }
      }
      }





      回頁(yè)首


      服務(wù)客戶機(jī)和服務(wù)上下文

      客戶機(jī) JAX-RPC 的亮點(diǎn)之一就在于它能把上下文信息和端點(diǎn)的遠(yuǎn)程方法調(diào)用關(guān)聯(lián)起來(lái)。注意,JAX-RPC 規(guī)范并不強(qiáng)求上下文信息的語(yǔ)義。用戶可以根據(jù) WSDL 綁定中 SOAP 頭定義的顯式定義它;也可以根據(jù) WS-Security 之類的標(biāo)準(zhǔn)定義它;或者通過(guò)使用特定于綁定的細(xì)節(jié)(比如 HTTP 請(qǐng)求頭)來(lái)定義它。

      這個(gè)運(yùn)行時(shí)上下文信息可以由容器或者客戶機(jī)來(lái)設(shè)定。容器管理的上下文管理被稱作 隱式上下文管理,而客戶機(jī)管理的管理被稱作 顯式上下文管理。

      在這里使用 隱式一詞是因?yàn)樵陔[式上下文管理中,客戶機(jī)或服務(wù)器上都不需要進(jìn)行編程以支持上下文傳播,這種支持是由運(yùn)行時(shí)引擎提供的。這種上下文信息的示例包括安全和事務(wù)信息。

      顯式服務(wù)上下文的表現(xiàn)形式是作為追加于服務(wù)方法調(diào)用的附加參數(shù)。當(dāng)從 JAVA 參數(shù)映射到 WSDL 時(shí)這可能會(huì)引發(fā)問題,因?yàn)檫@些增加的元素將映射到 WSDL 頭。 清單 10 通過(guò)端點(diǎn) JAVA 接口表示了一個(gè) WSDL 定義及它的 soap:header 信息和顯式的服務(wù)上下文表示。



      清單 10. WSDL 定義的端點(diǎn) JAVA 接口
      public interface BookSerachService implements java.rmi.Remote{
      public Books[] searchForBooks(String authorName, StringHolder context)
      throws RemoteException;
      }

      清單 10中,您能看到上下文被加到了方法參數(shù)上。

      JAX-RPC 規(guī)范不強(qiáng)制處理服務(wù)上下文的服務(wù)器端模型。定義處理程序來(lái)進(jìn)行服務(wù)上下文是由容器提供商(針對(duì)隱式或顯式上下文管理)和程序員(針對(duì)顯式上下文管理)決定的。您能看到,這使得上下文路由和設(shè)置報(bào)頭消息處理器變得靈活。





      回頁(yè)首


      帶附件的 SOAP

      JAX-RPC 規(guī)范 API 在遠(yuǎn)程過(guò)程調(diào)用和/或返回值時(shí)支持 MIME 編碼的內(nèi)容的使用。這是以帶附件的 SOAP 標(biāo)準(zhǔn)為基礎(chǔ)的(請(qǐng)參閱 參考資料)。 帶附件的 SOAP 消息是通過(guò)使用 MIME multipart/related 類型建立的。根部件是初始的 SOAP 消息,MIME 內(nèi)容被作為消息的另外部件添加。這些 SOAP 部件可能包含對(duì) MIME 部件的引用。也要注意每一個(gè) MIME 部件包含內(nèi)容的 ID 或內(nèi)容定位信息來(lái)唯一地標(biāo)識(shí) MIME 部件。請(qǐng)參閱 圖 3,它顯示了一條樣本 MIME 消息。



      圖3. SOAP 消息包
       soap 消息包

      JAVA 服務(wù)端點(diǎn)接口中的遠(yuǎn)程方法可能使用幾個(gè) JAVA 類型中的一個(gè)來(lái)表示 MIME 編碼的內(nèi)容。

      • JAX-RPC 規(guī)范提供了一個(gè) JAVA 類的集合,它是直接到 MIME 類型的映射。示例包括:
        • Image/gif 映射到 java.awt.image
        • text/plain 映射到 java.lang.string
        • text/xml 映射到 javax.xml.transform.Source

        請(qǐng)參閱 JAX-RPC 規(guī)范的 7.5 節(jié),那里有完整的映射清單(您可以在 參考資料里找到一個(gè)到這個(gè)規(guī)范的鏈接。)

      • javax.activation.DataHandler 可以映射任何 MIME 類型。

      JAX-RPC 運(yùn)行時(shí)系統(tǒng)通過(guò)以下幾點(diǎn)決定 MIME 部件的 MIME 類型。

      • 使用 WSDL 中 mime.content 元素定義的 MIME 類型
      • SOAP 消息中 MIME 部件的 Content-Type




      回頁(yè)首


      運(yùn)行時(shí)服務(wù)

      這里有幾個(gè)必須由 JAX-RPC 運(yùn)行時(shí)基礎(chǔ)架構(gòu)支持的確定的要求。我將在這里討論最重要的兩個(gè)。

      安全性

      JAX-RPC 運(yùn)行時(shí)系統(tǒng)必須支持最基本的 HTTP 認(rèn)證??蛻魴C(jī)發(fā)送用戶名和密碼到 HTTP 服務(wù)器,它們?cè)谀抢锉或?yàn)證(HTTP 服務(wù)器被認(rèn)為是 JAX-RPC 運(yùn)行時(shí)系統(tǒng)的一部分)。所有其他的安全機(jī)制(數(shù)字證書、SSL、WS-Security 等)都是由客戶機(jī)和服務(wù)器運(yùn)行時(shí)系統(tǒng)所提供的增值功能。這些可以用 JAX-RPC 處理程序和服務(wù)傳播來(lái)處理。想了解更多細(xì)節(jié),您可以參閱系統(tǒng)文檔來(lái)了解關(guān)于您的特定運(yùn)行時(shí)更多細(xì)節(jié)。

      會(huì)話管理

      這個(gè)要求使客戶機(jī)能參與和服務(wù)端點(diǎn)的會(huì)話。JAX-RPC 的運(yùn)行時(shí)系統(tǒng)至少應(yīng)該支持下面中的一個(gè):

      • 基于 Cookie 的會(huì)話管理
      • URL 重寫
      • SSL 會(huì)話

      服務(wù)器初始化會(huì)話管理進(jìn)程。您可以通過(guò)設(shè)置 session.maintain 屬性為 true 來(lái)表明服務(wù)器就緒以支持會(huì)話。要了解更多具體如何做的細(xì)節(jié),請(qǐng)參閱樣本。

      JAX-RPC 會(huì)話管理中的一個(gè)最明顯的遺漏是對(duì) SOAP 基于頭的會(huì)話相關(guān)性的要求,目前大多數(shù)工具包都支持此會(huì)話相關(guān)性。一旦您已經(jīng)定義了會(huì)話管理的標(biāo)準(zhǔn)方式,并且各方已經(jīng)在 WS-I 和其他標(biāo)準(zhǔn)上達(dá)成一致,那么您就可以認(rèn)為規(guī)范的下一個(gè)版本將會(huì)要求這一點(diǎn)。





      回頁(yè)首


      JAX-RPC 客戶機(jī)調(diào)用模型



      圖 4. 客戶機(jī)端 JAX-RPC
      服務(wù)器端 jax-rpc

      這里是三個(gè)不同的從客戶機(jī)調(diào)用服務(wù)端點(diǎn)的的模型,如 圖 4所示。它們獨(dú)立于任何特定于服務(wù)實(shí)現(xiàn)的模型。我將依次討論每一個(gè)模型的細(xì)節(jié)。

      • 基于存根的模型(靜態(tài)存根)您有兩種方法可以創(chuàng)建服務(wù)存根:
        • 來(lái)自 JAVA 服務(wù)端點(diǎn)接口
        • 來(lái)自服務(wù)的 WSDL 描述

        您可以從 WSDL(用 WSDL2JAVA)或從服務(wù)端點(diǎn)接口生成一個(gè)存根類。一個(gè)生成了的存根類是實(shí)現(xiàn) javax.xml.rpc.stub 和服務(wù)端點(diǎn)接口所必需的。這個(gè)存根接口通過(guò)設(shè)置諸如端點(diǎn)地址、會(huì)話、用戶名、密碼這樣的屬性來(lái)提供 API 以配置存根。

      • 動(dòng)態(tài)代理。和上面所討論的靜態(tài)存根相反的是,運(yùn)行時(shí)客戶機(jī)使用 javax.xml.rpc.Service 接口來(lái)創(chuàng)建動(dòng)態(tài)服務(wù)代理存根客戶??蛻魴C(jī)能夠 推算出關(guān)于 WSDL 和它要調(diào)用的服務(wù)的信息。它使用 ServiceFactory 類來(lái)創(chuàng)建服務(wù)獲取代理。
      • DII(動(dòng)態(tài)調(diào)用接口)。 這個(gè)軟件模式省卻了客戶提前了解服務(wù)的確切名字和參數(shù)的需要。DII 客戶機(jī)可以使用能查找服務(wù)信息的服務(wù)代理程序在運(yùn)行時(shí)發(fā)現(xiàn)這個(gè)信息。服務(wù)發(fā)現(xiàn)中的靈活性使運(yùn)行時(shí)系統(tǒng)能使用服務(wù)代理程序,服務(wù)代理程序能夠采用各種服務(wù)發(fā) 現(xiàn)機(jī)制(如 ebXML、注冊(cè)表、UDDI等)。

      如果您正在為 J2EE 開發(fā),您應(yīng)該記住下面的特定于 J2EE 的 JAX-RPC 要求:

      • 服務(wù)應(yīng)該實(shí)現(xiàn) javax.naming.referenceable 和/或 java.io.serlializable 接口來(lái)支持注冊(cè)和查找。
      • 組件供應(yīng)商必須在部署描述符中聲明所有的服務(wù)引用。




      回頁(yè)首


      結(jié)束語(yǔ)

      到現(xiàn)在為止,我已經(jīng)討論了 JAX-RPC 的大部分功能,您可以用這些功能來(lái)生成互操作性的 Web 服務(wù)。關(guān)于這個(gè)標(biāo)準(zhǔn)的這個(gè)介紹性系列文章將使您能夠開發(fā)出具有最大程度互操作性的 Web 服務(wù)。正如我早些時(shí)候提到過(guò)的,有很多不同的 JAX-RPC 運(yùn)行時(shí)引擎的實(shí)現(xiàn)可供使用,還有不同質(zhì)量級(jí)別的服務(wù)功能(來(lái)支持 J2EE)可供使用;因此,您總是應(yīng)該咨詢您的應(yīng)用程序容器提供商來(lái)了解更多關(guān)于對(duì) JAX-RPC 支持程度的信息。現(xiàn)在,沒有哪個(gè)單獨(dú)的 JAX-RPC 運(yùn)行時(shí)系統(tǒng)可以提供本系列中討論的所有功能。我確信將有這個(gè)規(guī)范的修正版來(lái)支持最近的 SOAP 和 WSDL 規(guī)范(兩個(gè)規(guī)范現(xiàn)在的版本都達(dá)到了 1.2);JAX-RPC 也可以采用 JAXB(Java XML Binding,JAVA XML 綁定,JSR31)作為互操作性類型映射。請(qǐng)密切注視這個(gè)規(guī)范,因?yàn)?Web 服務(wù)發(fā)展能支持越來(lái)越多的服務(wù)概要和 SOAP 頭擴(kuò)展。



      參考資料



      關(guān)于作者

      作者相片

      Joshy Joseph 是一個(gè)在 IBM OGSA 開發(fā)小組中工作的軟件工程師。他編程時(shí)主要喜歡使用 Web 服務(wù)、語(yǔ)義 Web、REST 及網(wǎng)格計(jì)算這樣的新興技術(shù),以及基于UML、AOP 和 XP 的編程模型。您可以通過(guò) joshy@us.ibm.com和他聯(lián)系。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多