與.NET平臺相比,Sun公司的標準定義的J2EE體系結構有很少可以討論的空間,因為就沒有什么可討論的。如果一個人注意某個具體開發商的產品,如IBM公司的WebSphere,那么就會看到其技術的最大的一部分是WebSphere專用的。比較所有開發商對J2EE的具體改進,已經超出了本文的范圍,在我的經驗中,大多數對J2EE作為一個平臺感興趣的公司對該標準的可移值性感興趣。任何對可移值性感興趣的人都會需要將他們自己局限于Sun公司所定義的標準。
J2EE體系結構可以被分為5部分:
Java語言系統
客戶端程序設計模型
中間層基礎結構
程序員企業級API
非程序員可見API
最后一部分,非程序員可見API,包括定義了如何將其他產品插入到J2EE中的API,如連接器API,以及J2EE模型中被最近的改進有效替代的API,如JTA(Java Transaction API)。由于從比較微軟和Sun公司計劃的角度來說,非程序員可見API并不重要,因此在筆者的概述中將不涉及這些方面 (就如同筆者在.NET平臺概述中并沒有涉及功能相當的API一樣)。
Java語言系統
在高層次上,Java語言系統看起來與.NET Framework類似。在這兩種情況中,源代碼都是被翻譯成一種中間語言。但是,在.NET平臺中,這種中間語言是MSIL,而在Java系統中,是Java Byte Code。在這兩種情況中,中間語言被帶入到運行環境中。在Framework中,運行環境是Common Language Runtime。對于Java,運行環境是Java虛擬機(Java Virtual Machine)。總體而言,Common Language Runtime和Java虛擬機有類似的功能,并且在技術進步方面,都無可置疑地在發展和彼此交互躍進。
這兩種系統之間最重要的區別與源代碼到中間語言的翻譯有關。在.NET平臺中,中間語言設計用來適應各種語言的需求。在Java中,中間語言設計用來滿足Java的需求。雖然從理論上,從除Java外的語言生成Java Byte Code是可能的,但是實際上這還沒有在任何一種商業產品中證明。
客戶端程序設計模型
J2EE客戶端程序設計模型重點集中在與瀏覽器的交互上。客戶端程序設計模型有3部分:Java Applets,Java Servlets和Java Server Pages。
Java Applets用來對在瀏覽器內運行的Java代碼進行打包。在.NET平臺空間中,這在功能上與ActiveX相當。在筆者的經驗中,applets或ActiveX組件使用的相對較少。電子商務體系結構一般都是以向表示層發出請求的瀏覽器為基礎,然后表示層使用HTML頁面進行響應。這種系統并沒有使用ActiveX或Java Applets,因此筆者在本白皮書中并沒有討論這些技術的任何一種。
處理HTTP請求和HTML響應的重要技術是Java Servlets 和Java Server Pages 。這兩種技術與微軟空間中的ASP.NET(Active Server Pages)類似。
.NET平臺與Java表示層中間的主要區別在于處理不同的客戶端功能的方式。Java表示層沿用了以前的Microsoft ASP (pre .NET)模型,它使得表示層程序員的責任是決定最終的目的瀏覽器(或其他瘦客戶端系統),瘦客戶端系統的功能,以及如何生成HTML來充分發揮瘦客戶端系統的優勢。
中間層基礎結構
對于J2EE,中間層基礎結構是Enterprise Java Beans (EJB)。該規范的當前版本是2.0,可以從網上獲得 。與J2EE相當的.NET平臺是COM+。
在EJB和COM+之間,體系結構的差別非常少。這兩種體系結構本質上是從MTS(Microsoft Transaction Server)派生出來的,是由微軟公司在1996年引入的最初的面向組件的中間層基礎結構。由MTS最先引入,然后合并到EJB和COM+中的重要想法包括:
通過組件示例的共享所實現的高可伸縮性
以中間層為中心的安全性
自動事務處理邊界管理
EJB加入了一種新的體系結構想法,一項自動管理組件狀態的技術。這項技術被稱為entity beans(實體豆)。雖然這種想法具有吸引力,但是當前的實施卻依賴于獨立于數據庫緩存的中間層數據緩存。很不幸的是,在這兩種緩存之間沒有保持一致性的機制。這意味著對實體豆的任何使用都會帶來數據庫損壞的高風險。在緩存一致性問題解決之前,在最佳試驗技術方面,必須得不斷考慮實體豆技術。
要連接EJB和COM+的深入比較,請參閱筆者最近的著作 。
程序員企業級API
我們調用Java Enterprise API 時的最重要部分如下:
Java Database Connection (JDBC,Java數據庫連接) 2.0 ?C 是用于從Java中訪問關系型數據庫的API 。這與.NET平臺空間中的ADO.NET相當。
Java Naming and Directory Interface (JNDI,Java命名與目錄接口) ?C 是用于從Java中訪問企業名稱與目錄服務的信息的API 。這與.NET平臺空間中的Active Directory Services Interface (ADSI,活動目錄服務接口)有點類似。
Java Message Service (JMS,Java消息服務) 1.0 ?C 是用于異步工作流的Java API 。這在功能上與Microsoft Message Queue API相當,這個API已經被排隊組件所替代。