作者: 朱先忠編譯出處: 天極網
摘要本文將介紹如何實現你的ASP.NET應用程式與J2EE應用程式伺服器之間的交互以及怎樣使得調用EJB與調用XML Web服務一樣地容易。
簡介
今天,許多大型組織發現他們自己正在擁有和使用由.NET技術和J2EE技術混合組成的開發團隊和發布伺服器。為了平衡透過J2EE應用程式伺服器發送的企業質量,公司的商業邏輯經常以企業JavaBean(EJB)的形式發佈於J2EE應用程式伺服器上。另一方面,為了滿足日益變化的商業發展的要求,多數開發者比較喜歡在具有高度生產性能的Visual Studio.NET開發環境下實現描述邏輯。當你需要把.NET描述層連接到J2EE商業邏輯層時,挑戰就產生了。
讓我們來看看Visual MainWin for J2EE怎麼幫助你面臨和克服-從Visual Studio.NET中,用C#或Visual Basic.NET來實現ASP.NET描述層然後再調用以EJB形式實現的商業邏輯層-這一挑戰性開發的。請放心,你將不需要糾纏於EJB API編碼就能做這一點。借助於Visual MainWin for J2EE,兩個層-ASP.NET前端和EJB後台-都能夠以一個純粹的J2EE應用程序的形式運行於你的J2EE應用程序伺服器上,並進行性能優化和實現一致的基於J2EE的安全性。
要實作從Visual Studio .NET呼叫EJB,你必須安裝Visual MainWin for J2EE的企業版本。當然,你可以從mainsoft.com網站上下載它的評估版本進行試驗性分析。
範例分析
本文的股票投資(StocksPortfolio)範例-它向你展示怎樣使用一個ASP.NET Web層和一個J2EE商業層來建立應用程式-被安裝和建檔於Visual MainWin for J2EE。本範例實現了一個簡單的ASP.NET網頁-使用者使用之來管理他們的股票投資-和一個ASP.NET Web服務-它用於提供虛構的股票行情。本範例也使用了一個會話EJB-為你的J2EE應用程式伺服器所用以實現買賣股票的邏輯。
圖1.運行於JBoss應用程式伺服器上的StocksPortfolio應用程式
把EJB加入到你的.NET環境
從Visual Studio.NET呼叫一個EJB跟呼叫一個Web服務一樣簡單。在你的解決方案資源管理器中,右鍵"References",然後選擇"Add EJB Reference",即出現一新的僅可用於Visual MainWin for J2EE工程的參考類型,它很類似於標準的Visual Studio . NETIDE下的Web參考(見圖2)。
圖2.新增EJB參考
為新增一個EJB參考到你的Visual MainWin for J2EE工程,你只需要一個Java檔案(JAR)檔案-它實作了該EJB或包含它的本機和遠端介面。 Visual MainWin能夠查詢應用程式伺服器有關所有發佈在它上面的EJB的資訊並在一個對話框中顯示對應於您的JAR定義的EJB。你只需要選擇你想要使用的特定EJB(可能多個)即可(見圖3)。
圖3.新增EJB參考對話框
你也可以在一個遠端應用程式伺服器上消費該EJB,只要它與你的工程相關的本機應用程式伺服器是一樣的型別。這可能是一個Windows,Linux,Unix,主框架或任何其它支援J2EE的伺服器。為了消費一個發佈於一個遠端伺服器上的EJB,請點擊"Advanced"來展開該對話框(見圖4)。
圖4.進階模式的新增EJB參考對話方塊
輸入JNDI URL到遠端J2EE應用程式伺服器中,然後點擊"Fetch From Server"。 Visual MainWin將列出所有的發佈於遠端伺服器上的EJB和對應於你的JAR檔案的EJB。該操作與本地EJB是一致的。
選擇你想要消費的EJB(可能多個),點擊OK。一個新的EJB參考資料夾即產生於你的解決方案資源管理器瀏覽器中,如圖5所示。此資料夾包含每一個剛新增上去的EJB參考的基於伺服器的參考,類似於Web參考結點。另外,也產生一個包裝類別來簡化你的EJB呼叫編碼。在後面部分我們將討論該包裝類別。
圖5.顯示有EJB參考的解決方案資源管理器資料夾
從.NET中呼叫EJB方法
當你新增一個EJB參考到你的工程時,系統會自動產生一個.NET(C#或VB.NET)類,它描述了一個簡單的到該EJB的介面。該類別包括要求創建該EJB和調用它的方法的J2EE編碼。這個.NET類別透過它自己的公共方法暴露了該EJB遠端介面的方法。要呼叫你的EJB的商業方法,你只需簡單地建立一個該包裝類別的實例並呼叫適當的包裝類別方法。
以下是從你的.NET工程呼叫一個EJB方法的程式碼範例:
//建立StockTrader EJB的一個實例.
localhost.StockTraderEJB trader = new localhost.StockTraderEJB();
// 購買使用者在股票名稱文字方塊中定義的股票,
//所購買的股份數對應於股份數文字方塊中的數字
trader.buy(tbStockName.Text, Int32.Parse(tbNumOfShares.Text));
深入分析
在上面產生的包裝類別的靜態建構器中執行被請求的J2EE呼叫以建立該EJB的home物件。然後,在一個預設的建構器中,它使用home物件來建立該EJB物件。這個EJB物件是以一個包裝類別成員的形式儲存的,透過它來呼叫商業EJB方法。
以下是建立該StockTrader EJB的包裝類別的部分程式碼:
private static trading.StockTraderHome home;
private trading.StockTraderEJB ejbObj;
static StockTraderEJB() {
// 建立一個Java命名(JNDI)上下文
Context context;
context = vmw.j2ee.J2EEUtils.CreateContext(null, null);
object homeObj;
//從JNDI伺服器取得home對象
homeObj = context.lookup("ejb/StockTrader");
home = ((trading.StockTraderHome)(homeObj));
}
//預設的建構器:建立一個新的EJB實例
public StockTraderEJB() {
this.ejbObj = home.create();
}
這個包裝類別透過它的公共方法暴露該EJB遠端介面的方法。然後,每個這些方法透過EJB物件呼叫你的EJB的相應的商業方法。下面的程式碼向你顯示股票商的EJB包裝器中的方法:
public virtual void buy(string arg_0, int arg_1) {
this.ejbObj.buy(arg_0, arg_1);
}
public virtual void sell(string arg_0, int arg_1) {
this.ejbObj.sell(arg_0, arg_1);
}
Visual MainWin也負責在Java和.NET之間對應資料類型。例如,如果你的EJB的方法之一以參數形式收到一個java.lang.calendar對象,那麼,你將使用一個.NET System.DateTime對象參數來呼叫這個方法並把它映射到一個java.lang. calendar對像上。隨後,如果你的EJB方法回傳一個java.lang.class,你將會收到一個System.Type物件作為代替。
調試問題
即使Visual MainWin對開發工作進行了簡化處理,你仍然可能需要調試你的多級的、混合的ASP.NET/EJB應用程式。 Visual MainWin偵錯器可讓你從Visual Studio .NET IDE內部偵錯你的混合應用程式。你可以穿過語言邊界在你的C#或VB.NET程式碼中設定中斷,單步調試EJB Java程式碼和調試你的全部應用程式。而且,因為調試需要出現於任何問題發生的地方,所以,Visual MainWin調試器能夠依附到你的J2EE應用程式伺服器,而不管它是運行於Linux,Unix還是其它框架之上,只要它能運行在調試模式就行。
圖6.使用Visual MainWin調試器來調試EJB原始碼
Visual MainWin為你創建的應用程式是一個標準的J2EE servlet應用程式-它能夠透過J2EE應用程式伺服器主管控制台進行發布和管理,就像任何其它J2EE servlet應用程式一樣。因此,你的ASP.NET描述層和你的EJB商業邏輯層都能依靠一樣的J2EE安全基礎結構。你的混合的ASP.NET/EJB應用程式能依靠一個透過使用J2EE servlet認證的一致的安全模型,而你的應用程式伺服器使用者和角色定義也能透過平衡基於角色的授權機制來確保安全性。
總結
1. 本文討論了遠端物件和介面。透過Visual MainWin進行本地物件消費也是可能的。為了發布一個使用本地物件的應用程序,你必須建立一個企業檔案(EAR)檔案-它既包括你的應用程式的WAR檔案又包括本地EJB的JAR檔案。
2. 雖然Visual MainWin能夠把大多數的.NET類型映射到Java類型,它卻不能進行集合類型的映射-因為這種映射可能導致一種性能損失。因此,你可以選擇從你的.NET程式碼中處理Java集合類型或你自己執行這樣的轉換。
3. Visual MainWin允許你消費會話bean和非事務性實體beans。事務性實體bean不能被透明地消費,因此你必須手工編碼J2EE事務呼叫。然而,在大多數情況中事務性實體bean可以透過會話bean進行訪問,因此你不大可能需要這樣做。