小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

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

2003 年 1 月 01 日

在 這個(gè)系列的第一篇文章里, Joshy Joseph 討論了 JAX-RPC 標(biāo)準(zhǔn)的一個(gè)重要方面:它的類(lèi)型映射系統(tǒng)。既然知道了 JAX-RPC 怎樣把 XML 類(lèi)型映射成 Java 類(lèi)型,您就可以認(rèn)真地研究這個(gè)規(guī)范,包括它的異常處理機(jī)制和潛在的運(yùn)行時(shí)服務(wù)了。讀完本文后,您就可以開(kāi)始構(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)開(kāi)始將這個(gè)包作為核心 API 在 JAVA 平臺(tái)上構(gòu)建互操作 Web 服務(wù)。在本系列中,我會(huì)引導(dǎo)讓您一步一步地了解這個(gè)標(biāo)準(zhǔn)提供的主要功能,并使用樣本代碼作為全程指導(dǎo)。

本系列的第一部分中,我描述了 WSDL/XML 類(lèi)型和 JAVA 類(lèi)型之間的互相映射。我解釋了 JAX-RPC 標(biāo)準(zhǔn)怎樣定義該功能,以及關(guān)于如何設(shè)計(jì)互操作類(lèi)型系統(tǒng)的一些要點(diǎn)。在某種程度上,這個(gè)類(lèi)型映射標(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ī)范包括下列主題:

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

正 如我在本系列的第 1 部分談到的那樣,我討論了 JAX-RPC 的類(lèi)型映射系統(tǒng)的重要方面?,F(xiàn)在我將探究一下規(guī)范中剩余部分的重點(diǎn)。正如我在第一部分所做的那樣,我將用一段代碼(來(lái)自為 ACME 售書(shū)商所做的樣本 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)(具體的)類(lèi)和一個(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)類(lèi)是通過(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 類(lèi)型。用這種方法,這個(gè)規(guī)范為 Java 平臺(tái)和它對(duì)應(yīng)的 XML 類(lèi)型保證了一個(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 類(lèi)作為接口方法的自變量。(請(qǐng)參閱這個(gè)系列的第 1 部分,您可得到關(guān)于 HolderSOAPElement 類(lèi)的更多信息。)

清單 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 值的類(lèi)型和數(shù)組不應(yīng)該存有遠(yuǎn)程引用。

一些服務(wù)提供商(如 WASP)有支持遠(yuǎn)程對(duì)象引用的實(shí)現(xiàn)。可是為這些實(shí)現(xiàn)寫(xiě)的代碼可能在運(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)類(lèi)型

服務(wù)端點(diǎn)實(shí)現(xiàn)類(lèi)型是由服務(wù)端點(diǎn)接口派生出來(lái)的。作為對(duì)這個(gè)接口的補(bǔ)充,這個(gè)服務(wù)端點(diǎn)實(shí)現(xiàn)類(lèi)可能實(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)類(lèi)以及服務(wù)端點(diǎn)類(lèi)的實(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è)問(wèn)題。

您開(kāi)發(fā)一個(gè)服務(wù)端點(diǎn)類(lèi)時(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ù)類(lèi)實(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 元素中聲明的,這些異常類(lèi)型是由 java.lang.Exception 類(lèi)派生的。 清單 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 異常類(lèi)



清單 6. Java 異常類(lèi)
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 類(lèi)型的上下文)。每一個(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ù)開(kāi)發(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)來(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)可以把所要求的上下文信息傳遞給處理程序。這將幫助處理程序獲得特定于容器的增值功能的訪問(wèn)權(quán),包括認(rèn)證機(jī)制,事務(wù)處理,日志記錄的框架等。

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


在 為 J2EE 容器開(kāi)發(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ì)寫(xiě) 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ì)的。盡管您能編寫(xiě)自己的 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è)能訪問(wèn) 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 之類(lèi)的標(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ā)問(wèn)題,因?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 類(lèi)型建立的。根部件是初始的 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 類(lèi)型中的一個(gè)來(lái)表示 MIME 編碼的內(nèi)容。

  • JAX-RPC 規(guī)范提供了一個(gè) JAVA 類(lèi)的集合,它是直接到 MIME 類(lèi)型的映射。示例包括:
    • 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 類(lèi)型。

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

  • 使用 WSDL 中 mime.content 元素定義的 MIME 類(lèi)型
  • 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)證。客戶機(jī)發(fā)送用戶名和密碼到 HTTP 服務(wù)器,它們?cè)谀抢锉或?yàn)證(HTTP 服務(wù)器被認(rèn)為是 JAX-RPC 運(yùn)行時(shí)系統(tǒng)的一部分)。所有其他的安全機(jī)制(數(shù)字證書(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 重寫(xiě)
  • 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è)存根類(lèi)。一個(gè)生成了的存根類(lèi)是實(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)來(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 開(kāi)發(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è)介紹性系列文章將使您能夠開(kāi)發(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 支持程度的信息?,F(xiàn)在,沒(méi)有哪個(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)作為互操作性類(lèi)型映射。請(qǐng)密切注視這個(gè)規(guī)范,因?yàn)?Web 服務(wù)發(fā)展能支持越來(lái)越多的服務(wù)概要和 SOAP 頭擴(kuò)展。



參考資料



關(guān)于作者

作者相片

Joshy Joseph 是一個(gè)在 IBM OGSA 開(kāi)發(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)買(mǎi)等信息,謹(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)論公約

    類(lèi)似文章 更多