程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> J2EE 1.4平台和Web服務

J2EE 1.4平台和Web服務

編輯:關於JAVA

本文是J2EE Web服務開發系列文章的第七篇,在本系列文章的前面各主題中,著重介紹了在J2EE1.3平台下使用各種技術或者工具進行Web服務開發。從本文開始,將介紹J2EE1.4平台下的Web服務開發。

本文首先介紹了J2EE1.4平台中Web服務的構架,然後分別介紹了J2EE1.4平台中Web服務的最新規范和最新技術,接下來介紹了開發Web服務使用的API以及J2EE Web服務開發步驟,最後介紹了Web服務的開發工具。

J2EE1.4 Web服務構架

J2EE1.4的主題是Web服務,在J2EE1.4平台下:

允許J2EE應用組件暴露為基於SOAP/HTTP的Web服務;

和原有的Web服務進行整合;

Web服務的關鍵技術:JAX-RPC;

J2EE1.4下的Web服務框架:Web services for J2EE。

J2EE1.4平台升級的新增加的技術大部分和Web服務相關。在J2EE1.4平台下,開發、部署、發現Web服務變得非常方便。盡管J2EE1.4平台對Web服務方便提供了升級,但是:

Web服務僅僅是J2EE平台中一種使用服務的通道,所以不需要改變J2EE的構架,並且原有的J2EE組件可以非常容易地暴露為Web服務;

J2EE平台的優點仍然訵eb 服務適用:可擴展性、可靠性、開放性。

J2EE1.4Web服務構架如圖1所示。

在圖1中,灰色的代表J2EE1.4平台中新增加的技術,白色的代表了原有的技術。在圖1的構架圖中,Web服務的客戶端可以是Applet或者標准的Java客戶端,當然也可以是運行在Servlet或者EJB容器中的組件;客戶端可以通過JAX-RPC以HTTP/SSL協議來訪問Web服務。Web服務的服務端點運行在Servlet或者EJB容器中,它以JAX-RPC和SAAJ作為運行環境。

J2EE1.4中Web服務技術

J2EE1.4提供了Web服務總框架,在這個總的框架下,包含了以下的技術和框架:

Web services for J2EE

JAX-RPC

SAAJ

JAXR

EJB2.1

Connector Architecture1.5

下面分別介紹這些技術或框架。

Web services for J2EE

Web services for J2EE是J2EE平台下Web服務總的構架規范,它義了在 J2EE 1.3 或 J2EE 1.4 應用程序服務器中如何支持 Web 服務。具體地說,Web Services for J2EE 定義了客戶端模型、服務端模型、部署模型WSDL綁定和安全相關規范,從而使 Web 服務客戶機和實現可以從一個 J2EE 供應商實現移植到另一個 J2EE 供應商實現。Web Services for J2EE 基於 JAX-RPC(JSR101)進行構建,以提供客戶機編程模型。該客戶機模型允許 Web 服務客戶機(Java 的或非 Java 的,在 J2EE 之中或在 J2EE 之外)訪問部署在支持 JSR109 的 J2EE 應用程序服務器中的 Web 服務。它還允許 J2EE 組件通過使用 J2EE 編程模型調用 Web 服務(Java 的或非 Java 的,在 J2EE 之中或在 J2EE 之外)。

在此框架下,服務端可以有兩種選擇:

基於Servlet的服務端點:通過JAX-RPC實現,由Servlet容器提供運行環境;

基於無狀態會話Bean的服務端點:必須遵循EJB2.1規范,由EJB容器提供運行環境。

JAX-RPC

JAX-RPC是J2EE1.4平台中Web服務的核心技術,那麼什麼是JAX-RPC ?

是一種遠程調用基於,類似於RMI;

規定了JAX-RPC的運行環境;

定義了XML數據類型到Java 類型的映射方法;

定義了WSDL到Java之間的映射;

定義了JAX-RPC客戶端編程模型(Stub接口、動態代理、動態調用);

定義了基於Servlet的服務端點模型;

定義了SOAP消息Handler框架;

提供了復雜Java數據庫類型映射的擴展框架。

JAX-RPC的構架如圖2所示。

JAX-RPC的客戶端可以是基於J2SE、J2EE或者J2ME的運行環境,服務端是Servlet或者EJB容器。WSDL不僅描述了Web服務,同時在JAX-RPC客戶端調用服務端的端點時起了重要的作用。

JAX-RPC的互操作性如圖3所示。服務端和客戶端通過SOAP來進行通信,SOAP以HTTP作為底層的傳輸協議。

SAAJ

SAAJ從JAXM1.0劃分出來,原JAXM1.0被劃分為JAXM1.1和SAAJ1.1。SAAJ包含了創建和讀取遵循SOAP1.1規范的以及帶附件的SOAP消息的API,也包含了發送和接收請求/響應模型的SOAP消息。

SAAJ不僅可以被JAX-RPC使用,也可以被JAXM等Web服務技術使用。它是一組通用的、處理SOAP消息的API。JAXM、JAX-RPC和SAAJ的關系如圖4所示。

JAXR

JAXR是和服務注冊、發布相關的標准API。由於當前Web服務注冊提供者比較多,要想在J2EE平台中使用這些注冊服務,為每個注冊服務都開發一個單獨的API,顯然是不現實的,JAXR為注冊服務進行了多層抽象,使得在J2EE平台中操作當今的或者將來的Web服務注冊中心成為可能。JAXR支持三種注冊服務類型:JAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository等)。

JAXR規范為JAXR的實現定義了有兩種級別的支持,分別是:

Level0:用於支持UDDI注冊;

Level1:用於支持ebXML注冊。

JAXR的互操作性如圖5所示。

從圖中可以看出,通過JAXR API,注冊浏覽器、J2EE組件和桌面應用可以訪問UDDI、ebXML等注冊服務中心。

需要注意的是,JAXR並不是一個新的注冊規范,它只是訪問原有的注冊中心的一個編程接口。

EJB2.1

EJB2.1規范對Web服務提供了支持,定義了無狀態會話Bean可以作為Web服務端點模型。這樣,在J2EE平台中,有兩種Web服務端點:基於Servlet的和基於無狀態會話Bean的。

用EJB作為Web服務端點,同樣可以像Servlet作為服務端點一樣使用消息Handler。

在EJB2.1規范下,消息驅動Bean不是必須實現javax.jms.MessageListener接口。這樣,除了開發JMS的消息驅動Bean外,還可以開發出自定義的消息驅動Bean,如com.mycompany.EmailListener。結合連接器的支持,可以開發出javax.xml.messaging. OnewayListener之類的消息驅動Bean來提供Web服務支持。

Connector Architecture1.5

在舊有的連接器結構中,只支持從J2EE組件內部到企業資源層(EIS)單向的調用,而資源層無法直接調用J2EE組件。在新的連接器規范中,可以從企業資源層中直接調用J2EE組件。這樣,我們可以通過連接器來把EJB等組件向外暴露為Web服務端點,從而支持Web服務。

JAXM

首先需要聲明的是,JAXM不是J2EE平台中的一部分,它只是一個可選的開發包。通過JAXM發送和接收基於SOAP的消息,它定義了兩種發送和接收消息的模型:

請求-響應(request-resposne),它是一種點對點的消息發送模型,消息發送端發送了消息後將阻塞等待服務端的相應,這種方式的好處是編程簡單,缺點是無法取保消息到達服務端。

單向(one-way),這種方式需要使用JAXM消息提供者,一端發送的消息通過消息提供者再轉發到接收端;當接收端對消息響應時,同樣首先通過JAXM消息提供者,再由消息提供者發送到原來的發送端。這種方式是消息通信是異步的,優點是可以保證消息被可靠發送到服務端,缺點是編程變得復雜。

JAXM兩種消息發送模型如圖6所示。

在J2EE1.4平台中,EJB2.1消息驅動Bean可以接收JMS消息或者JAXM SOAP消息。

在以下的情況下,可以優先考慮使用JAXM,而不是JAX-RPC:

要發送面向文檔的數據;

要發送大量的、粗粒度的、復雜的流數據;

需要使用異步數據交換模型;

需要確保每個發送的數據都在對方接收。

JAXM互操作模型如圖7所示。

開發Web服務的JAVA API

下面介紹在JAVA環境下開發Web服務要使用的API,這裡只列出了J2EE標准的開發包和可選的開發包。

J2EE Web服務框架中核心API:

J2EE 1.4 (JSR 151)

JAX-RPC (JSR 101)

JAXR

SAAJ

EJB 2.1

和處理SOAP消息相關的API:

JAXM:發送接收異步的SOAP消息;

SAAJ:處理帶附件的SOAP消息;

JAX-RPC:是J2EEWeb服務關鍵API,它定義了SOAP消息Handler API,;

JMS:別忘了,JAVA消息服務API也可以發送SOAP消息。

和WSDL相關的API:

Java API for WSDL:見JSR110;

JAX-RPC:定義了java和WSDL之間的映射。

和UDDI相關的API:

JAXR:Web服務注冊的高層API。

和ebXML相關的API:

ebXML消息服務:提供ebXML消息支持的JAXM(JSR67);

ebXML注冊:JAXR

CPP/CPA:Java API for ebXML CPP/CPA (JSR 157)

和XML文檔管理相關的API:

JAXP (Java API for XML processing, JSR 05),用於解析XML文檔,可以在這個API下使用可插入的解析器,如DOM;

JAXB (Java API for XML data-binding, JSR31),XML文檔處理的高層API,用於XML文檔模型和Java對象之間的綁定;

Streaming API for XML (JSR 173),基於迭代器(Iterator)的Pull-parsing API。

和XML安全相關的API:

XML Digital Signature (JSR 105)

XML Encryption (JSR 106)

XML Trust Service (JSR 104)

Secure Assertion Markup Language,(SAML, JSR 155)

WS-Security (JSR 183)

其它和Web服務相關的API:

XML Transactioning API for Java (JSR 156), Java API for OASIS BTP;

Java Process Component API (JSR 159);

Web Services for J2ME (JSR 172),為J2ME設備提供發送、接收SOAP消息的支持;

Web Services Metadata for J2EE (JSR 181),基於Web services的Metadata。

除了上面列舉的API外,還有其它一些組織公司開發的API,比如Apache、IBM、BEA、Oracle等組織和公司,都為Web服務開發提供了許多API,在這裡就不再列舉了。

J2EE Web服務開發步驟

下面來討論Web服務的開發步驟,在這裡只是概述性的,在後面的文章中我們將結合這個開發步驟來進行具體實踐。

定義Web服務;

實現Web服務;

創建可以部署的包;

在J2EE平台中部署Web服務;

發布Web服務,把Web服務綁定到注冊中心(Service Registry);

對客戶端的請求提供服務。

下面分別介紹這些開發步驟的具體工作。

定義Web服務

第一步就是定義Web服務,Web服務可以使用WSDL(Web服務描述語言)定義,也可以使用Java接口定義。在定義時,可以使用Top-down的方式,也可以使用Buttom-up的方式,具體采用哪種方式,取決於是否已經有將要暴露為Web服務的J2EE組件。如果已經有J2EE組件,那麼可以使用Buttom-up的方式,在這種情況下,通過一些工具從J2EE組件生成WSDL描述;在Top-down的方式下,先創建WSDL,然後進行具體的實現。當然使用這兩種方式也不是絕對的,在某些情況下,Web服務設計人員可能要把新定義的WSDL映射到原有的J2EE組件上,這樣就出現了Top-down和Buttom-up中間的解決方案。

在定義Web服務時,同時需要定義出Web服務的端點接口(Endpoint Interface),服務端點接口是一個由JAX-RPC規范指定的Java接口,這個接口必須擴展javax.rmi.Remote接口。不論是使用Servlet作為服務端點,還是使用無狀態會話Bean作為服務端點,都必須按照規范定義這個接口。這個接口可以使用Java編程語言編寫,也可以使用一些工具從WSDL中生成,如Apache axis提供的WSDL2Java工具就可以從WSDL生成Web服務端點接口。如果是無狀態會話Bean,那麼服務接口將在Bean的部署描述符中使用<service-endpoint>元素指定,具體方法請參考本系列文章下一篇。例程1是一個服務接口定義的例子。

例程1 定義服務接口

public interface EchoService extends Remote
{
   /**
   *返回用戶提供的信息。
   */
   public String echo (String name) throws RemoteException;
}

實現Web服務

在實現服務時,有三個工作需要做:

1、選擇一種具體的服務端點實現,也就是使用Servlet作為服務端點還是使用無狀態會話Bean作為服務端點。

2、實現在服務接口中定義的業務邏輯,在這個階段,可以使用一些工具生成Web服務運行時需要的框架,如使用axis中的WSDL2Java,Sun提供的wscompile等。

3、創建部署描述符,在部署描述符中指定具體的endpoint的實現。

如果使用Servlet作為服務端點,那麼實現類代碼看起來應該如例程2所示。

例程2 Servlet作為服務端點

public class EchoServlet implements EchoService
{
public String echo (String name)
{
      //業務邏輯具體實現。
  return "Hello:"+name;
}
}

如果使用無狀態會話Bean作為服務端點,那麼實現類代碼看起來應該如例程3所示。

例程3 使用無狀態會話Bean作為服務端點

public class EchoBean implements javax.ejb.SessionBean
{
public String echo (String name)
{
  //業務邏輯具體實現。
  return "Hello:"+name;
}
...//其它EJB方法。
}

在實現了Web服務後,對於EJB組件,需要在EJB部署描述符中指定它的服務端點接口,如例程4所示。

例程4 編寫和組件相關的部署描述符

<session>
    <display-name>EchoServiceEJB</display-name>
    <ejb-name>EchoServiceEJB</ejb-name>
    <service-endpoint>com.hellking.webservice.EchoService</service-endpoint>
    <ejb-class>com.hellking.webservice.EchoServiceBean</ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Container</transaction-type>
</session>

可以看出,使用無狀態會話Bean作為Web服務端點,可以不開發HOME接口和Remote(Locale)接口,只需要指定服務端點接口。

創建可部署的包

接下來的任務就是創建可以部署的包,Web services for J2EE規定了打包的法則,在打包後的應用中可能包含以下的內容:

Web服務部署描述,指定了Web服務的運行特性,描述文件為webservices.xml,它是J2EE平台中Web服務的標准描述,就像EJB中的ejb-jar.xml描述符一樣;

WSDL描述,用於描述Web服務;

到其它J2EE組件的引用,比如那個組件實現了這個Web服務;

J2EE組件的標准描述。

webservices.xml部分部署描述符如例程5所示。

例程5 webservices.xml部分部署描述符

<!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN"
"http://www.ibm.com/standards/xml/webservices/j2ee/j2ee_web_services_1_0.dtd">
<webservices>
  <description>desc</description>
  <webservice-description>
   <webservice-description-name>EchoServiceEJB</webservice-description-name>
   <wsdl-file>META-INF/MyEchoService.wsdl</wsdl-file>
   <jaxrpc-mapping-file>META-INF/mapping.xml</jaxrpc-mapping-file>
   <port-component>
    <description>port component description</description>
    <port-component-name>EchoServicePort</port-component-name>
    <wsdl-port>
     <namespaceURI>urn:Echo</namespaceURI>
     <localpart>EchoServicePort</localpart>
    </wsdl-port>
    <service-endpoint-interface>com.hellking.webservice.EchoService
    </service-endpoint-interface>
    <service-impl-bean>
     <ejb-link>EchoServiceEJB</ejb-link>
    </service-impl-bean>
   </port-component>
  </webservice-description>
</webservices>

在J2EE平台中部署Web服務

Web服務的部署任務在不同的應用服務器環境下方式也不一樣,它取決於應用服務器提供的工具。部署時可能將產生和應用服務器廠商特有的部署描述符,這些特有的部署描述符一般都通過應用服務器廠商提供的工具自動生成。

發布Web服務

部署好Web服務後,可以通過JAXR編程發布,也可以使用注冊中心提供的工具進行發布,IBM、Microsoft等都提供了UDDI注冊工具。

對客戶端的請求提供服務

客戶端可以通過UDDI來發現Web服務,然後進一步調用。在調用時,可以使用JAX-RPC,也可以使用其它編程語言或者調用框架。在使用JAX-RPC時,可以使用JAX-RPC生成的Stub來進行,也可以使用動態調用機制或者動態代理等。另外,客戶端也可以把Web服務綁定到服務器的JNDI名稱空間中,然後在JNDI名稱空間中查找這個服務,進一步調用。

如果把Web服務綁定到JNDI名稱空間中,那麼調用示例代碼如例程6所示。

例程6 調用Web服務

Public class MyTestBean implements SessionBean{
public void getHello(...) {
Context ctx = new InitialContext();
EchoService es =(EchoService) ctx.lookup("java:comp/env/service/EchoService");
EchoServiceProvider sqp =es.getEchoServicePort();
String hello= sqp.echoHello("hellking");
...
}
}

Web服務開發工具

現在有眾多的公司、組織提供了Web服務開發工具和運行環境,下面分別簡單的介紹。

SUN公司提供的工具

Sun提供了Java Web Services Developer Pack(Java WSDP),它JWSDP最新的版本是JWSDP1.2,包含了:

JAXP、JAXB、JAXP、SAAJ、JAX-RPC、JAXR運行庫、開發實例,它上支持最新的Web服務標准;

Java WSDP Registry Server (UDDI server),一個用於發布和查詢Web服務的工具。

JWSDP1.2既是開發工具,也是Web服務運行環境。

你可以通過 下載獲得 JWSDP 最新版本。

另外,在Sun發布的J2EESDK1.4Beta2中,對Web服務最新的技術提供了全面的支持,可以通過它來學習J2EE平台中Web服務的最新技術。

你可以通過 下載獲得 J2EESDK1.4Beta2。

IBM 公司提供的工具

IBM公司提供了大量的Web服務開發工具和運行環境。最常使用的有WSDK,它帶有一個輕量級的Websphere服務器,通過它可以方便地創建和Websphere服務器兼容的Web服務。你可以從IBM官方網站下載WSDK最新版本。

BEA公司提供的工具

BEA為Web服務提供了WorkShop作為開發工具,在WorkShop中可以使用JWS規范非常快捷地開發Web服務,WorkShop和Weblogic服務器是緊密集成的,WorkShop中開發的Web服務可以方便地部署到Weblogic服務器上運行。你可以從BEA公司官方網站下載Weblogic開發版和Workshop的試用版。

APACHE組織提供的工具

Apache最新的Web服務開發工具是axis,它是Apache SOAP 項目的替代者。Axis同時也是一個Web服務的運行環境,它可以插入到任務J2EE兼容的Web服務器下運行,通過axis,可以快速構建和JAX-RPC兼容的Web服務。

你可以在 http://ws.apache.org/axis/上獲得axis的最新版本。

總結

通過上面對J2EE1.4Web服務的講解,相信讀者對J2EE1.4平台下的Web服務構架、Web服務相關的技術以及Web服務開發有了一個比較全面的了解。如果你只能記一句話,請記住:JAX-RPC是J2EE1.4平台中WEB服務的關鍵技術,Web services for J2EE是J2EE平台下Web服務總的構架規范。

下一步

現在已經對J2EE1.4平台下Web服務構架和技術有了初步的了解,下一步就是介紹在J2EE1.4平台下使用EJB2.1規范開發一個Web服務。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved