国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Web Service 和 J2EE

2019-11-18 12:54:12
字體:
供稿:網(wǎng)友

  在前面的文章中,我們已經(jīng)把握了如何開發(fā)、配置和使用簡單的 Web service。我們也了解了一些高級的Web service概念,這其中包括狀態(tài)Web service、遠程調(diào)用和Web service 安全。本文中我們將開始研究Web service是如何在J2EE環(huán)境中工作的。
  理解Web Services和J2EE 集成原理
  當今,許多應(yīng)用將三層業(yè)務(wù)邏輯作為標準的J2EE組件來實現(xiàn)。將這些組件用于SOAP Web service幾乎使它們被普遍應(yīng)用,同時這也提供了一種集成這些組件的簡單機制。J2EE的標準組件體系結(jié)構(gòu)使得這個過程變得相對輕易。
  本文中,我們將解釋如何使J2EE組件以Web service的形式發(fā)布,同時也會演示如何應(yīng)用java Message Service (JMS)可靠地發(fā)送SOAP報文。我們將主要討論EnterPRise Java Beans(EJBs),這是因為EJBs是業(yè)務(wù)邏輯實現(xiàn)中使用最為廣泛的J2EE組件,當然所有演示過的方法也適用于其他的J2EE組件,例如JDBC數(shù)據(jù)源和JMS隊列。
  標準的J2EE處理
  我們首先來概括一下有關(guān)J2EE平臺的一些重要事實。傳統(tǒng)上來說,J2EE客戶端應(yīng)用程序使用JNDI查找服務(wù)器方的J2EE組件。例如,客戶端應(yīng)用程序查找JNDI中的EJB引用并收到一個EJB客戶端代理。客戶端在后面將使用這個代理來訪問EJB組件。所有的J2EE通信在正常情況下都發(fā)生在RMI上。
   Web Service 和 J2EE(圖一)
  圖 1:標準的JNDI使用
  J2EE - 基本方法
  有兩種通過SOAP訪問J2EE資源的方法。我們首先來看看最顯而易見的方法,這種方法可以在EJB四周創(chuàng)建Web service wrapper。該方法非凡適合于這樣的情況:Web service應(yīng)用不直接映射到單獨EJB并且還需要J2EE 組件的附加信息。我們在第二個例子中將介紹一種以較少代碼實現(xiàn)透明集成的方法。這種方法的主要目標就是將現(xiàn)有的J2EE應(yīng)用盡可能迅速的以Web service的形式動態(tài)發(fā)布。這種方法答應(yīng)我們無須編寫或者修改任何代碼就可以高效的訪問現(xiàn)有的基于SOAP的J2EE應(yīng)用。
  簡單的股票報價EJB Wrapper 演示樣本
  在這個演示樣本中,我們將介紹EJB wrapper Web service 方法,該方法可以訪問簡單的無狀態(tài)session bean:股票報價EJB。該方法雖然很簡單但是卻在許多SOAP框架中得到了廣泛應(yīng)用。各種實現(xiàn)之間只存在一些細微的區(qū)別,這些實現(xiàn)通常會與開發(fā)流程的自動化水平相吻合。這種方法要求所實現(xiàn)的Web service包含一個或者多個現(xiàn)有的J2EE 組件。而這個wrapper起到SOAP與 RMI之間的橋梁作用。客戶端將SOAP請求到這個wrapper,然后由wrapper把請求轉(zhuǎn)換成適合EJB 組件的RMI 請求。我們非凡推薦將該方法主要用于諸如無狀態(tài)Bean之類的無狀態(tài)J2EE資源。為了用該方法來訪問有狀態(tài)的資源,您將需要設(shè)置額外的生命周期服務(wù)來正確地刪除孤立的有狀態(tài)資源。
  我們首先需要執(zhí)行一些簡單的安裝和配置步驟。
  注重:假如您還沒有下載用來創(chuàng)建指導(dǎo)實例的軟件,請參考30分鐘創(chuàng)建WebService。您還需要下載演示樣本的源代碼demo sources。 這里我們假設(shè)您已經(jīng)把這個文件拷貝到c:/wasp_demo目錄。指導(dǎo)實例中所提到的所有Java源代碼都可以在解壓縮文件demo sources后得到的src子目錄中找到。它們位于com.systinet.demos.包中。同樣,演示樣本中的所有腳本程序都位于bin子目錄。盡管您并不需要下載和使用該軟件來理解這些文章,但是我們還是強烈推薦您這樣做。
  額外的安裝步驟:我們將在J2EE環(huán)境中使用Sun J2EE 1.3。(您可以從Sun的 Java website下載所需的軟件)。在安裝完J2EE 1.3 RI之后,您需要配置WASP Web service 運行時間以便使用Sun J2EE RI。這里提到的配置可以通過修改WASP Advanced高級安裝的Bin子目錄中的 env.bat腳本程序來實現(xiàn)。首先將下面一行變?yōu)樽⑨?在該行開始之處添加rem):
  set INSTALLATION_TYPE=standalone
  然后刪除同一文件中的下面一行的注釋:
  set INSTALLATION_TYPE=j2ee
  您需要修改位于c:/wasp_demo/bin Directory的env.bat文件。請為環(huán)境變量J2EE_HOME,WASP_HOME和WASP_DEMO設(shè)定正確的取值。
  
  一旦您完成了上面提到的安裝和配置步驟,請通過使用startJ2EE 和 startserver啟動J2EE 服務(wù)器并運行WASP Web service。
  
  下一步,運行deploy_j2ee 來編譯Java源代碼并配置我們在演示樣本使用的EJBs。
  
  注:在配置EJB之后,您需要重新啟動J2EE 服務(wù)器。
  
  假如您查看com.systinet.demos.stock包中的Java源代碼,就會發(fā)現(xiàn)StockQuote,StockQuoteHome類 和StockQuoteBean 類使用一個簡單getQuote方法實現(xiàn)了一個相當簡單的無狀態(tài)session bean。我們已經(jīng)通過調(diào)用deploy 腳本程序?qū)@個EJB進行了配置。您要確保使用J2EE的治理工具對所有的EJBs進行了正確配置。調(diào)用演示樣本bin目錄下的J2EEAdmin程序?qū)又卫砉ぞ摺?
  
  現(xiàn)在我們來集中關(guān)注圖2中wrapper Web service 的實現(xiàn)。它實現(xiàn)了方法getQuote,該方法包含一個簡單的EJB 調(diào)用。首先,它從JNDI得到EJB的有效引用并創(chuàng)建一個EJB實例。然后它將在EJB上調(diào)用方法 getQuote,然后刪除該EJB。最后,調(diào)用結(jié)果返回到Web service 客戶端。在下面的代碼中您可以看到這些步驟:
  
  package com.systinet.demos.stock;
  import javax.naming.InitialContext;
  import javax.naming.Context;
  import javax.naming.NamingException;
  import java.rmi.RemoteException;
  public class StockQuoteService {
  public double getQuote(String symbol) throws Exception {
    // get the JNDI initial context
    System.err.println("Getting J2EE initial context");
    Context jndiContext = new InitialContext();
    // lookup the EJB home
    System.err.println("Looking up EJB Home");
    Object homeRef = jndiContext.lookup("Stock");
    StockQuoteHome home =
    (StockQuoteHome)javax.rmi.PortableRemoteObject.narrow(
    homeRef, StockQuoteHome.class);
    // create the EJB instance
    System.err.println("Creating EJB");
    StockQuote ejb = home.create();
    // call the getQuote method
    System.err.println("Calling getQuote");
    double quote = ejb.getQuote("SUNW");
    System.err.println("SUNW "+quote);
    // remove the EJB
    System.err.println("Removing EJB");
    ejb.remove();
    return quote;
  }
  
  }
  圖 2:簡單的 Web service EJB wrapper (StockQuoteService.java)
   現(xiàn)在我們可以通過運行deploy_service 腳本程序來配置EJB wrapper Web services。然后,運行run_wrapper 腳本程序來啟動Web service 客戶端。客戶端將會通過wrapper Web service來調(diào)用EJB。
  注:為了說明wrapper方法的基本原來,我們盡可能使這個演示樣本簡單。然而,實際中的應(yīng)用通常會復(fù)雜一些。wrapper 服務(wù)常用于集成多個EJBs的功能和其他的J2EE資源。在這些情況下,wrapper服務(wù)通常會顯現(xiàn)不同的編程接口而不是原始的beans。
  透明的J2EE 集成integration
  訪問J2EE資源的另一方法就是使用透明的集成框架。這里,透明是指我們沒有必要來編寫一個wrapper服務(wù)或者改變最初的J2EE代碼。假如您希望SOAP客戶端利用現(xiàn)有的J2EE資源或者通過因特網(wǎng)訪問J2EE資源,這種方法就非常有用了。
  下面所描述的透明的J2EE 集成框架將充分利用JNDI框架的優(yōu)勢,這種優(yōu)勢提供了一種訪問J2EE資源的抽象機制。正如我們先前所說的,在J2EE的正常流程中,J2EE客戶端將調(diào)用JNDI的lookup方法,而客戶端的JNDI提供者把這個請求通過RMI傳遞給J2EE服務(wù)器中的JNDI服務(wù)。JNDI給客戶端返回一個 J2EE代理。客戶端使用這個代理,通過RMI遠程調(diào)用J2EE資源。在這個示例中,我們所使用的客戶端JNDI的提供者支持SOAP而不支持RMI。正如您在圖3中所看到的,當客戶端使用這個提供者發(fā)布一個JNDI請求時,該請求將通過SOAP發(fā)送到JNDI web service。 這個JNDI web service將在應(yīng)用程序服務(wù)器JNDI中進行實際的查找并獲得J2EE代理。然后JNDI web service將一個基于SOAP的客戶端遠程引用返回給J2EE代理。客戶端應(yīng)用程序此時就能夠使用這個遠程引用來調(diào)用J2EE資源。每一種方法調(diào)用都將通過SOAP傳遞給J2EE代理。J2EE代理會把請求重新定向到實際的J2EE資源。您可能會注重到J2EE資源或者客戶端代碼都不需要進行修改。只需在客戶端實施一個配置更改而已,即指向基于SOAP的JNDI提供者。
  Web Service 和 J2EE(圖二)
  圖 3: Web service有權(quán)使用JNDI
  注:大多數(shù)Web service運行時間服務(wù)器和應(yīng)用程序服務(wù)器是在相同的上下文環(huán)境中運轉(zhuǎn)。因此,調(diào)用重定向方法將會非常迅速,并且不會降低性能。
  這種方法也適用于非Java的客戶端。因為JNDI Web service是一種標準的Web service,任何的SOAP客戶端都能夠充分利用它的透明調(diào)用框架。例如, Microsoft Visual Basic 客戶端可以調(diào)用JNDI Web service上的方法查詢并且獲得所請求的J2EE資源的Web service代理。
  對于在Web service運行時間創(chuàng)建的所有組件,JNDI Web service將執(zhí)行自動遠程碎片賬集。當客戶端應(yīng)用程序顯式丟棄遠程組件時,根據(jù)相關(guān)請求,這些組件中的大多數(shù)也會被丟棄。但是在松散連接條件下的Web services并不能保證做到適當刪除。這就是LifeCycle服務(wù)需要跟蹤并治理所有動態(tài)創(chuàng)建資源的原因。這種方法的主要優(yōu)勢就

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 彩票| 城口县| 东山县| 稷山县| 香格里拉县| 日照市| 桂平市| 宁明县| 晋中市| 东海县| 衡东县| 仁化县| 翁源县| 乳山市| 莫力| 郯城县| 友谊县| 卓尼县| 渭南市| 石门县| 张北县| 惠安县| 仁怀市| 贡山| 林甸县| 洪雅县| 威信县| 呼图壁县| 闵行区| 固原市| 周至县| 礼泉县| 象山县| 法库县| 达尔| 交城县| 将乐县| 伊春市| 府谷县| 阜康市| 博爱县|