當(dāng)前位置:工程項目OA系統(tǒng) > 泛普各地 > 上海OA系統(tǒng) > 上海OA快博
EJB 2.1中實現(xiàn)Web Service
EJB 2.1中實現(xiàn)Web Service
EJB2.1(Enterprise JavaBeans 2.1)正式推薦版本已經(jīng)出臺,它產(chǎn)生的動力主要是Enterprise JavaBeans對支持Web Service的需求,同時也是因為Microsoft .NET的發(fā)布,它對J2EE或者說對Java技術(shù)來說已經(jīng)構(gòu)成了巨大威脅。在新版本的EJB2.1中,主要的變化主要集中在基于SOAP和WSDL的Web Service上。EJB已經(jīng)成為一種新的Web Service平臺。它對Web Service的支持主要體現(xiàn)在三個新的Web Service API上:分別是JAX-RPC(Java API for XML-RPC,它基本上是通過SOAP實現(xiàn)的Java RMI,為RPC格式的SOAP消息提供遠(yuǎn)端接口)、SAAJ(SOAP API with Attachments for Java,它模仿SOAP消息的結(jié)構(gòu),同時也有功能有限的消息分發(fā)能力)和JAXM(Java API for XML Messaging,它類似于JMS,提供發(fā)送和接收SOAP消息的消息架構(gòu)),利用它們可以實現(xiàn)與其它類型的Web Service進(jìn)行通訊,而且還允許無序的會話Bean和消息驅(qū)動的Bean來作為Web Service使用,使它們能夠被任何與 SOAP1.1兼容的客戶端所訪問。例如:使用SOAP,我們就可以從其它平臺Web Service來調(diào)用無序的會話Bean的方法,象微軟的.NET,Perl,Apache Axix和其他的語言和平臺。EJB2.1中新的Web Service功能能夠提供一種前所未有的跨平臺互操作性,它主要是建立在兩個嶄新的J2EE SOAP工具包JAX-RPC和JAXM。
Web Service代表了分布式計算的最新潮流,可能是自1995年Java的出現(xiàn)和1998年XML出現(xiàn)以來最重要的技術(shù)了。其實,給Web Service下一個準(zhǔn)確的定義是很難的,因為Web Service并不是任何特殊技術(shù)或者平臺所特有的,Web Service是一種網(wǎng)絡(luò)應(yīng)用程序,以XML形式的文檔,使用SOAP和WSDL進(jìn)行信息交換。要更好地理解這句話的含義,你必須先理解SOAP和WSDL,下面是有關(guān)這方面的定義:
SOAP:簡單對象訪問協(xié)議(Simple Object Access Protocol),是在W3C的支持下,由Microsoft,IBM和其他公司開發(fā)的,基于XML格式的一種協(xié)議,它是可伸縮和可擴(kuò)展的,不象以前的DCE RPC, CORBA IIOP, Java RMI-JRMP以及DCOM,它已經(jīng)被幾乎所有的開發(fā)廠商所認(rèn)可和接受。
WSDL:Web服務(wù)描述語言(Web Service Description Language),也是在W3C的支持下,由Microsoft,IBM和其他公司開發(fā)的,XML格式的語言,用來對Web Service進(jìn)行描述,包括期望的消息格式類型、所使用的Internet協(xié)議和Web Service的Internet地址。
其實,Web Service代表了一種新的分布式對象技術(shù),它和CORBA IIOP和Java RMI很相似,但也有許多差異,最大的差異應(yīng)該就是真正的平臺無關(guān)性。盡管Java RMI和CORBA IIOP都聲稱自己是平臺無關(guān)的,但實際上,它們都需要它們自己的平臺。要使用Java RMI,你需要一個Java虛擬機(jī)和Java編程語言,對使用其它語言的開發(fā)者如Visual Basic或C++來說,Java RMI并不是平臺無關(guān)的。CORBA IIOP也是有局限性的,IIOP協(xié)議通常需要一個特定的架構(gòu)如CORBA ORB,也只有少數(shù)幾個廠商支持CORBA。另一方面,Web Service著重描述信息交換的協(xié)議,而不是著重描述對這些協(xié)議的實現(xiàn),換句話說,你可以用任何語言,在任何平臺上,以任何你自己喜歡的方式來創(chuàng)建Web Service。
Web Service另外一個好處就是,不象其它的分布式對象體系,它建立在現(xiàn)有的技術(shù)架構(gòu)的基礎(chǔ)之上,因此大多說廠商很容易實現(xiàn)。SOAP和WSDL都是基于XML的,而XML已經(jīng)被廣泛支持,XML解析器在幾乎每一種開發(fā)語言中都有,因此,處理SOAP消息和WSDL文檔的基礎(chǔ)已經(jīng)存在了。此外,Web Service消息通常是通過TCP/IP進(jìn)行交換的,也已經(jīng)被幾乎所有的平臺和語言所支持。
JAX-RPC和EJB
JAX-RPC(Java API for XML-RPC)實質(zhì)上就是通過SOAP訪問的Java RMI。它和“本地的”Java RMI (Java RMI-JRMP)和Java RMI-IIOP很象,但是它是以SOAP作為通訊協(xié)議。要實現(xiàn)JAX-RPC,最低要求是必須對通過HTTP訪問的SOAP支持RPC編碼,但是,我們?nèi)匀豢梢蕴峁ζ渌幋a方式、消息格式和Internet協(xié)議的支持。JAX-RPC能夠被用來從會話、實體和消息驅(qū)動的Bean來調(diào)用Web Service的操作。JAX-RPC能夠用來訪問其它平臺的Web Service。例如:一個無序的會話Bean可能會使用JAX-RPC來調(diào)用.NET Web Service的方法。如下圖所示:
每個EJB開發(fā)商都會提供自己對JAX-RPC的實現(xiàn),但它們之間的差別是很小的,主要是因為所有的實現(xiàn)都必須遵照J(rèn)AX-RPC規(guī)范,JAX-RPC能夠當(dāng)作客戶端API來訪問其它的Web Service,但是,它同時也是一個被稱作“EndPoint接口”的新型企業(yè)Bean接口。當(dāng)JAX-RPC當(dāng)作客戶端API的時候,會話、實體或者消息驅(qū)動的Bean能夠使用它與其它平臺的Web Service交換消息。JAX-RPC定義了三種編程模型:Generated Stub、Dynamic Proxy和DII(Dynamic Invocation Interface),我們在EJB環(huán)境中常用的Generated Stub模型。
如果使用JAX-RPC去訪問Web Service,那么,這個Web Service必須發(fā)行一個WSDL文檔,EJB開發(fā)商提供的JAX-RPC工具包產(chǎn)生Java RMI接口和實現(xiàn)WSDL文檔所描述的Web Service操作的Stub,一旦Stub和接口創(chuàng)建出來之后,我們就可以把它們與企業(yè)Bean的JNDI ENC(Environment Naming Context)進(jìn)行綁定,然后與 Web Service進(jìn)行通信。
WSDL把訪問Web Service的接口描述成“端口”,每個端口有一個或者多個“操作”,端口和操作的概念和Java的接口和方法類似。實際上,JAX-RPC定義了WSDL和Java RMI之間的映射關(guān)系,它產(chǎn)生來自端口的遠(yuǎn)端接口,并帶有響應(yīng)端口操作的方法。例如:一個WSDL文檔可能描述一個被稱作“BookPrice”、并帶有單個操作getBoolPrice的端口,下面就是BookPrice WSDL文檔的一些簡單代碼:
<?xml version="1.0"?>
<definitions name="BookPrice"
targetNamespace="http://lucky.myrice.com/GetBookPrice"
xmlns:tns="http://lucky.myrice.com/GetBookPrice"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<!-- 描述參數(shù)和返回值的message元素 -->
<message name="IsbnMessage">
<part name="isbn" type="xsd:string" />
</message>
<message name="PriceMessage">
<part name="price" type="xsd:float" />
</message>
<!-- 描述Web Service抽象接口的portType元素 -->
<portType name="BookPrice">
<operation name="getBookPrice">
<input name="isbn" message="tns:IsbnMessage"/>
<output name="price" message="tns:PriceMessage"/>
</operation>
</portType>
<!-- 在這里進(jìn)行綁定 -->
<!-- service元素告訴我們Web Service的地址 -->
<service name="BookPriceService">
<port name="BookPrice" binding="tns:BookPrice_Binding">
<soap:address location="http://lucky.myrice.com/BookPrice" />
</port>
</service>
</definitions>
在部署的時候,JAX-RPC
Stub生成工具會把WSDL端口轉(zhuǎn)換成遠(yuǎn)程接口和Stub,端口和服務(wù)Stub可能是下面的樣子:
public Interface BookPriceService extends
javax.xml.rpc.Service{
public BookPrice getBookPrice( ) throws RemoteException;
}
public Interface BookPrice extends java.rmi.Remote
{
public float getBookPrice(String isbn)
throws RemoteException;
}
這里只是一個簡單的例子,這個服務(wù)只有一個端口,而實際上一個服務(wù)會有多個端口,每個端口有相應(yīng)的接口和Stub。一旦接口和Stub產(chǎn)生并被綁定到JNDI
ENC之后,它們就可以在運行期調(diào)用Web Service的“操作”了,在下面的無序會話Bean里,BookCatalog EJB利用JAX-RPC從.NET
Web Webvices查找一本書的批發(fā)價格。
public class BookCatalog implements javax.ejb.SessionBean
{
...
public float getWholeSalePrice(String isbn) {
try {
InitialContext jndiContext = new InitialContext (
);
BookPriceService service =
jndiContext.lookup("java:comp/env/service/BookPriceService");
BookPrice bookPrice_port =
service.getBookPrice();
float price = bookPrice_port.getBookPrice( isbn
);
return price;
catch(RemoteException re){
}catch(ServiceException se){
}catch(NamingException ne){
}
}
...
}
當(dāng)調(diào)用getBookPrice()方法時,JAX-RPC Stub向.NET Web
Service發(fā)送SOAP信息,Stub產(chǎn)生的SOAP信息可能會是下面的樣子:
<?xml version='1.0' ?>
<env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xyz='http://lucky.myrice.com/BookPrice"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<Body>
<xyz:getBookPrice>
<isbn xsi:type="string">1565928695
</xyz:getBookPrice>
</Body>
</env:Envelope>
.NET Erb
Services處理SOAP信息,并把結(jié)果返回到Stub,Stub分析結(jié)果,最后向客戶端發(fā)送最終結(jié)果。
JAX-RPC Stub中的方法可以有參數(shù),參數(shù)類型可以是基本數(shù)據(jù)類型,如int,long等;基本包裝類型,如java.lang.Interger,java.lang.Long等;數(shù)組;Java標(biāo)準(zhǔn)類型,如String,Date等;也可以是自定義對象類型。自定義對象必須符合JAX-RPC規(guī)范的規(guī)則。
除了產(chǎn)生Stub外,JAX-RPC也支持動態(tài)代理服務(wù),除了它的遠(yuǎn)程接口和Stub的實現(xiàn)是在運行時動態(tài)產(chǎn)生的之外,動態(tài)代理服務(wù)的作用和Stub一樣。下面的例子就是JAX-RPC產(chǎn)生動態(tài)Stub的:
public class BookCatalog implements javax.ejb.SessionBean
{
...
public float getWholeSalePrice(String isbn) {
try {
InitialContext jndiContext = new InitialContext ( );
javax.xml.rpc.Service service =
jndiContext.lookup("java:comp/env/service/DynamicService");
BookPrice bookPrice_port = service.getPort(BookPrice.class);
float price = bookPrice_port.getBookPrice( isbn );
return price;
catch(RemoteException re){}
catch(ServiceException se){}
catch(NamingException ne){}
}
...
}
在運行時,getPort()方法自動把BookPrice接口映射到WSDL文檔里定義的相應(yīng)端口,然后產(chǎn)生Stub實現(xiàn)接口的工作。
JAX-RPC還支持名為DII(Dynamic Invocation Interface)的動態(tài)API,DII允許開發(fā)人員在運行時調(diào)用SOAP方法。如果你使用過CORBA Dynamic Invocation Interface的話,那你對JAX-RPC DII一定很容易理解。JAX-RPC DII類似于Java的反射(Reflection),它允許你以方法的形式得到一個代表Web Service操作的對象的參考,調(diào)用那個方法,就無需再訪問Service Factory或者再使用Stub和遠(yuǎn)端接口。下面的例子就是企業(yè)Bean訪問BookPrice端口的getBookPrice()操作:
public class BookCatalog implements javax.ejb.SessionBean
{
...
public float getWholeSalePrice(String isbn) {
try {
InitialContext jndiContext = new InitialContext ( );
javax.xml.rpc.Service service =
jndiContext.lookup("java:comp/env/service/DynamicService");
QName port = new QName("http://lucky.myrice.com/GetBookPrice ","BookPrice");
QName operation = new QName("http://lucky.myrice.com/GetBookPrice",
"getBookPrice");
Call callObject = service.createCall(port, operation);
Object [] args = new Object[1]; args[0] = isbn;
Float price = (Float) callObject.invoke( args );
return price.floatValue();
}
catch(JAXRPCException se){}
catch(NamingException ne){}
}
}
...
}
實際上,你可以在運行期配置參數(shù)、類型、編碼等,你能用WSDL配置的所有信息都可以用DII動態(tài)配置。
JAX-RPC另外還是一個稱為終端接口(Endpoint Interface)的新型組件,這個新接口允許我們把無序的會話Bean作為Web Service來實現(xiàn),這個終端接口簡化了javax.rmi.Remote接口的實現(xiàn),并且遵守JAX-RPC規(guī)范中的規(guī)則。把一個無序的會話Bean作為Web Service來實現(xiàn)是非常簡單的:只需定義Bean類和遠(yuǎn)端接口,然后使用開發(fā)商的提供的工具來實現(xiàn)。一旦建立了Web Service,它的方法就能夠被任何SOAP兼容的、來自任何語言和平臺的工具包來調(diào)用,比如:.NET,Perl,Apache Axis,C,C++等等。如下圖所示:
由于JAX-RPC僅僅是Java RMI的另外一種形式,因此,利用它訪問企業(yè)Bean是很自然的,我們以前已經(jīng)利用RMI-IIOP和RMI訪問過。利用JAX-RPC與EJB進(jìn)行通信意味著EJB可以當(dāng)作Web Service來使用,至少無序的Bean是可以的。EJB2.1允許我們利用JAX-RPC,但只能是應(yīng)用于無序的Bean,這主要是因為SOAP是一種無序的消息協(xié)議,它沒有對象識別的概念,因此它不能應(yīng)用在有序的和實體的Bean中。
EJB2.1為無序的Bean定義了一個新的Web Service終端(EndPoint)接口,Web Service界的人使用“終端”來稱呼發(fā)送和接收SOAP信息的任何東西。在EJB中,終端就是一個無序的會話Bean,它可以通過SOAP來訪問,并且遵照J(rèn)AX-RPC規(guī)范中定義的從Java-to-WSDL到Java-to-SOAP的映射規(guī)則。使用JAX-RPC最為EJB終端的基礎(chǔ)是順理成章的,因為JAX-RPC規(guī)范中定義了SOAP消息和Java方法調(diào)用以及從Java遠(yuǎn)程接口產(chǎn)生WSDL文檔的詳細(xì)規(guī)則。
不象EJB開發(fā)者已經(jīng)很熟悉的遠(yuǎn)端和本地接口,終端接口并沒有繼承EJB對象類型,如EJBObject或EJBLocalObject。相反,終端接口直接繼承了javax.ejb.Remote接口。例如:在上面的例子中的BookPrice的Web Service能夠很輕易實現(xiàn)為EJB中的終端。下面的代碼說明了一個BookPrice的終端接口,和實現(xiàn)為Web Service的無序會話Bean的部分列表。
public interface BookPrice extends javax.rmi.Remote
{
public String getBookPrice(String isbn) throws javax.rmi.RemoteException;
}
public class BookPriceWS implements BookPrice,
javax.ejb.SessionBean {
public float getBookPrice(String isbn){
Connection con = null;
Statement stmt = null;
ResultSet rs;
try {
DataSource ds = jdniEnc.lookup("java:comp/env/jdbc/DataSource");
con = ds.getConneciton();
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT wholesale FROM CATALOG WHERE isbn = '"
+isbn+"'");
if(rs.next()){
float price = rs.getFloat("wholesale");
return price;
}else{
return 0;
}
}
catch (SQLException se) {
file://處理異常
}
}
...
}
終端接口比遠(yuǎn)程和本地接口一個很明顯的好處就是它不會帶來象EJBObject或者EJBLocalObect無用方法等形式的額外負(fù)擔(dān),此外,終端接口沒有包括home接口,SOAP不支持按引用傳值。因此,你不能要求一個Web
Services接口(home 接口)按引用傳遞到另外一個遠(yuǎn)端接口,更進(jìn)一步講,你不能創(chuàng)建或移除一個Web Service。
當(dāng)我們把一個無序會話 Bean開發(fā)成Web Service時,首先定義一個終端接口,然后利用它產(chǎn)生JAX-RPC的客戶端Stub和WSDL文檔或者如果你產(chǎn)生JAX-RPC客戶端Stub,無需做任何改變,你可以把它包裝成J2EE客戶端JAR,利用它去訪問無序會話Bean,利用SOAP做通訊協(xié)議。如果你從終端接口產(chǎn)生WSDL文檔,其它的SOAP工具包也能夠使用這個文檔去訪問你的無序Bean。WSDL和SOAP是Web Service的基礎(chǔ),因此,為EJB Web Services發(fā)布WSDL可以實現(xiàn)與其它平臺的交互。
SAAJ
SAAJ(SOAP with Attachments API for Java)是一個基于API的SOAP工具包,它定義了SOAP Messages with Attachments (SwA)和SOAP用的MIME信息格式。Java開發(fā)人員能夠利用SAAJ來創(chuàng)建、讀取或者修改SOAP信息。這個API包含許多類和接口,用來定義SOAP元素(Envelope, Body, Header, Fault等),XML名稱空間,屬性,文字節(jié)點以及MIME附件。你可以使用SAAJ操作簡單的、沒有附件的XML格式的SOAP信息,也可以操作更加復(fù)雜的、帶Mime附件的SOAP信息。SAAJ可以與JAX-RPC結(jié)合使用,但也可以單獨使用,它有自己的、通過HTTP1.1實現(xiàn)的請求/應(yīng)答方式的消息機(jī)制。
SAAJ是基于Abstract Factory模式的。SAAJ是類型的抽象集合,每一種類型的對象都是由SAAJ集合中另外的對象產(chǎn)生的。在Abstract Factory的SAAJ實現(xiàn)中,MessageFactory類是根,它負(fù)責(zé)創(chuàng)建自己的實例,反過來創(chuàng)建SOAPMessage,SOAPMessage包含SOAPPart,它代表SOAP文檔、0個和多個AttachmentPart(代表附件的對象,如GIF,PDF等)。SOAPPart包含SOAPEnvelope、SOAPBody、SOAPHeader和其它類型的對象。
要迅速了解SAAJ,我們先用XML格式建立一個簡單的SOAP信息,如下所示:
<?xml version='1.0' ?>
<env:Envelope
xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:book='http://lucky.myrice.com/BookPrice'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
<env:Body>
<book:getBookPrice>
<isbn xsi:type='string'>1565928695
</book:getBookPrice>
</env:Body>
</env:Envelope>
而下面是用SAAJ創(chuàng)建的例子:
import javax.xml.soap.*;
public class Example_1 {
public static void main(String [] args) throws SOAPException{
MessageFactory msgFactory =
MessageFactory.newInstance();
SOAPMessage message = msgFactory.createMessage();
SOAPPart soap = message.getSOAPPart();
SOAPEnvelope envelope = soap.getEnvelope();
envelope.getHeader().detachNode();
SOAPBody body = envelope.getBody();
SOAPElement getBookPrice = body.addChildElement(
"getBookPrice","book",
"http://lucky.myrice.com/BookPrice");
getBookPrice.setEncodingStyle(SOAPConstants.URI_NS_SOAP_ENCODING);
SOAPElement isbn = getBookPrice.addChildElement("isbn");
isbn.addNamespaceDeclaration("xsi",
"http://www.w3.org/2001/XMLSchema-instance");
Name xsiType = envelope.createName("type","xsi",
"http://www.w3.org/2001/XMLSchema-instance");
isbn.addAttribute(xsiType,"string");
isbn.addTextNode("1565928695");
message.writeTo(System.out);
}
}
如果我們對比上面的例子,就會發(fā)現(xiàn)SAAJ定義了SwA消息格式的準(zhǔn)確結(jié)構(gòu),SOAP消息的屬性和SAAJ類型之間可以發(fā)現(xiàn)是一一對應(yīng)的關(guān)系:Envelope對應(yīng)SOAPEnvelope;Body對應(yīng)SOAPBody;getBoolPrice對應(yīng)SOAPBodyElement;isbn對應(yīng)SOAPElement(Text)等。
當(dāng)然,上面的例子是很簡單的,它并沒有包含任何附件,SwA中的附件通常是二進(jìn)制或者是其它的非XML格式的文件,它通常被SOAP文檔引用。SAAJ靠JAF( Java Activation Framework)添加附件,并處理對象和數(shù)據(jù)流之間的相互轉(zhuǎn)換。下面的這段示例代碼利用SAAJ向SOAP附加一個PDF文件。
MessageFactory msgFactory =
MessageFactory.newInstance();
SOAPMessage message = msgFactory.createMessage();
AttachmentPart pdfAttach = message.createAttachmentPart();
FileDataSource file = new FileDataSource("TestSAAJAttachment.pdf");
DataHandler pdfDH = new DataHandler(file);
pdfAttach.setDataHandler(pdfDH);
要成功處理附件,我們必須先理解JAF,JAF是處理MIME數(shù)據(jù)的極好框架,但它也有自己的局限性,大部分局限性與使用DataContentHandler類型有關(guān)。藏在JAF的局限性后面的細(xì)節(jié)問題是很復(fù)雜的,但我們可以使用JAF
DataSource類型來克服大部分的局限性,就象例子中的javax.activation.FileDataSource那樣。
SAAJ是一個用途廣泛的API,可以讓我們在幾乎任何的應(yīng)用中創(chuàng)建SwA消息,在某些情況下,我們可以與JAX-RPC一起在文字消息和SOAP消息中使用SAAJ,但也可以與其它的API如JavaMail,JMS,JAXM一起使用。如果Java應(yīng)用已經(jīng)創(chuàng)建了SwA消息,它仍可以使用SAAJ把這個消息轉(zhuǎn)換成二進(jìn)制流,然后與使用其它API的Web Services進(jìn)行交換信息。
JAXM 和 EJB
JAXM (Java API for XML Messaging)是和(Java Message Service)類似的SOAP消息API,就象JMS是一種通過面向消息的中間件來發(fā)送和接收消息的API一樣,JAXM是一種通過Web Service來發(fā)送和接收消息的API。
JAXM是面向文檔的,它把SOAP消息以XML格式的文檔來進(jìn)行傳送的。JAXM客戶端都是使用SAAJ(SOAP with Attachments API for Java)來裝配、接收和使用SOAP消息的,SAAJ模仿SOAP消息的實際XML結(jié)構(gòu),這種機(jī)制與JAX-RPC是有很大區(qū)別的,JAX-RPC使用方法調(diào)用的語法,把SOAP消息隱藏到了Java RMI代理的后面。使用JAX-RPC,你 所看到的是僅僅由方法、參數(shù)、返回值組成的遠(yuǎn)端接口,而使用JAXM,你直接處理SOAP協(xié)議。象JAX-RPC一樣,JAXM必須與SOAP兼容的Web Service交換SOAP信息。例如:一個企業(yè)Bean可能使用JAXM與用Perl寫的Web Service交換SOAP信息。EJB2.1開發(fā)者能夠以JAXM作為一種新的消息驅(qū)動Bean的基礎(chǔ),我們稱它為基于JAXM的消息驅(qū)動Bean(JAXM-MDB)。JAXM-MDB使用的是SOAP消息,但扮演的是Web Service的角色。JAXM-MDB能夠?qū)崿F(xiàn)單向的異步接口,就象基于JMS的消息驅(qū)動的Bean,也可以實現(xiàn)請求/應(yīng)答式的同步接口。
JAX-RPC和JAXM都允許企業(yè)Bean訪問不同平臺上的Web Service,也可以作為用無序和消息驅(qū)動Bean建立的Web Service的基礎(chǔ)。但是,由于缺乏廠商的支持,JAXM的使用前景并不是很樂觀。
- 1上海OA提升企業(yè)競爭力
- 2把.Net整合進(jìn)其他平臺
- 3頂級IT企業(yè)的世界大戰(zhàn):Web Services 驚世未了緣
- 4e信 知識生產(chǎn)新生態(tài)
- 5美政府吸取911教訓(xùn)將眼光投向Web服務(wù)
- 6上海OA的三種策略(尤克強(qiáng))
- 7Amazon和Google開辟Web service新紀(jì)元
- 8Web服務(wù),等待全民公決
- 9IBM的Web Services戰(zhàn)略
- 10Web服務(wù)會對黑客的Dos攻擊提供幫助
- 11網(wǎng)絡(luò)信息獲取的應(yīng)用:競爭情報獲取(BY AMT 路海明)
- 12上海OA導(dǎo)入策略分析(By AMT 夏敬華)
- 13麥肯錫高層管理論叢-超越最佳務(wù)實作法:知識策略
- 14泛普軟件移動OA創(chuàng)新了業(yè)界全新“企業(yè)OA辦公模式”
- 15上海OA日趨重要
- 16泛普軟件在打造中國第一企業(yè)云在線協(xié)同管理平臺
- 17OA辦公軟件系統(tǒng)中任務(wù)管理是企業(yè)老板最關(guān)心的功能
- 18Perspective:關(guān)于網(wǎng)絡(luò)服務(wù)的5大謊言
- 19Web服務(wù):重塑服務(wù)型經(jīng)濟(jì)
- 20如何搭上Web服務(wù)這班車?
- 21Web Service管理的集大成者
- 22IBM發(fā)布新軟件,強(qiáng)化Web服務(wù)安全性
- 23鋼鐵行業(yè)電子商務(wù)各具特色
- 24上海OA和信息管理之間的聯(lián)系和區(qū)別(By AMT 宋亮)
- 252014年下半年國內(nèi)OA辦公軟件市場誰將是“老大”?
- 26傳統(tǒng)OA辦公軟件廠商即將面臨的威脅
- 27客戶支持中心的上海OA(By AMT 宋亮)
- 28[理論] 上海OA的“平衡”性分析及其實施的七個支柱(夏敬華)
- 29跨越信息訪問的鴻溝!(by AMT方厚政 )
- 30“網(wǎng)絡(luò)服務(wù)”巨頭競爭誰輸誰贏:惠普SUN表現(xiàn)欠佳
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓
版權(quán)所有:泛普軟件 渝ICP備14008431號-2 渝公網(wǎng)安備50011202501700號 咨詢電話:400-8352-114