大概五年前,微軟發(fā)布了.NET Framework,這是Java/J2EE和.NET平臺上最流行的幾個(gè)“專(zhuān)家級”產(chǎn)品之一。從那以來(lái),我一直在講Java/.NET的協(xié)調性。無(wú)論我在哪里講,都有一個(gè)出現頻率極高的問(wèn)題(來(lái)自我的朋友,參會(huì )人員,咨詢(xún)客戶(hù)等等)。
問(wèn):說(shuō)實(shí)話(huà),我不會(huì )傳出去的。你最喜歡哪一個(gè)?是Java還是.NET?
我并不偏好哪一個(gè),兩個(gè)我都同樣喜歡。說(shuō)實(shí)話(huà)這個(gè)答案不太容易令人信服。所以我通常用得最多的回答是下面這個(gè)。
答:看情況。
我們的業(yè)界已經(jīng)被深深地分成了兩邊,核心問(wèn)題是:“你使用哪種平臺?你是Java開(kāi)發(fā)者,還是.NET開(kāi)發(fā)者?”從這個(gè)問(wèn)題的相關(guān)討論來(lái)看,有人可能會(huì )認為這是目前最主要的話(huà)題,其中往往伴隨著(zhù)激烈的爭吵和辯論。暫且不管傳統的“征用權”與“皇權侵略”的爭論,以及那些主流媒體認為與伊拉克和東北非的動(dòng)蕩同樣重要的各種文章。如果計算其中情感的力量,世界上最重要的問(wèn)題莫過(guò)于你編程時(shí)主要使用Eclipse還是Visual Studio。
諷刺而有趣的是這些爭論毫無(wú)重點(diǎn)。Java和.NET雖然有些方面存在沖突,實(shí)際上它們是兩種截然不同的平臺,存在各自的優(yōu)點(diǎn)和缺點(diǎn)。兩種平臺都是從各自所在的社區和文化中開(kāi)發(fā)(或產(chǎn)生)出來(lái)的,因此它們通常針對不同的問(wèn)題,使用不同的方法和實(shí)現手段。
而且近年來(lái)它們本身已經(jīng)開(kāi)始出現分歧。以前的各種會(huì )議上,我可以說(shuō),人們選擇Java或者.NET更多是出于文化因素,“任何你通過(guò)其中一個(gè)可以做到的事,都可以通過(guò)另一個(gè)在同樣的工作量下實(shí)現”?,F在不是這樣了。以前說(shuō).NET1.0/1.1與Java相當是可以的,而現在它們已經(jīng)開(kāi)始不同的發(fā)展方向,實(shí)現它們獨有的創(chuàng )新和用戶(hù)群的反饋。Java社區目前致力于各種語(yǔ)言與平臺之間的合作,比如說(shuō)與微軟最新版本.NET3.0,兩個(gè)截然不同的平臺間進(jìn)行的標準統一。于是關(guān)于Java和.NET的問(wèn)題開(kāi)始有微妙的轉變,人們不再問(wèn)“你喜歡哪個(gè)平臺?”,而開(kāi)始問(wèn)一個(gè)更有趣而且有力的問(wèn)題:“我怎樣才能把兩個(gè)平臺結合使用?”
完全列出可用的將兩個(gè)豐富的平臺進(jìn)行整合的方法超出了本文的范圍。我們可以來(lái)看幾個(gè)比較吸引人的方式,并且在理念和代碼上體會(huì )一下。
關(guān)于Java/.NET的協(xié)調性,最常用的例子大概就是廣泛使用的WebService,通常使用Windows表示層編程框架(WPF)或WinForms界面,結合Windows分布式編程框架(WCF)將數據實(shí)際傳送到另一端以某種Java容器形式保存的Java WebService,可能是WebLogic,WebSphere,Spring,Tomcat,等等。搭建WebService的酸甜苦辣有許多文章進(jìn)行了描寫(xiě),所以在此不必多費筆墨。但如果將WebService作為CORBA或.NET遠程控制(或者說(shuō)分布式對象技術(shù))的擴展,會(huì )大量消耗額外的工作和精力。使用恰當的服務(wù),能夠創(chuàng )建比希望換掉的分布式對象工具更松散的耦合,尤其是能夠更輕松地突破我們所討論的技術(shù)壁壘。WCF和JAX-WS的核心觀(guān)念都是“傳輸消息,而非對象”,只有表面層的一些API使它們看上去比較像RMI或.NET遠程控制。因此在搭建WebService時(shí)可以利用它們良好的協(xié)調性。本方案最明顯的優(yōu)點(diǎn)是每種技術(shù)都集中于它所專(zhuān)長(cháng)的部分。前端界面使用平臺獨有的技術(shù),因此可以發(fā)揮全部性能;而后端使用的開(kāi)發(fā)平臺則因性能和可測量性著(zhù)稱(chēng)。
自從SQL Server 2005發(fā)布以來(lái),一種新的消息處理方式誕生了,這就是SQLServer服務(wù)代理,用于搭建基于消息的通訊程序。這種方式基于SQLServer的數據引擎實(shí)現(服務(wù)代理中的隊列均為高效數據表,頂層以簡(jiǎn)單的外殼包裝),并且具有足夠的強壯性,能夠用于事務(wù)型和有序傳輸保證。服務(wù)代理為開(kāi)發(fā)人員提供強制消息平臺,尤其是在那些已經(jīng)有數據庫的數據中心里。然而使用Java訪(fǎng)問(wèn)SQLServer服務(wù)代理和訪(fǎng)問(wèn)其它JDBC數據庫同樣簡(jiǎn)單。Java應用程序,——無(wú)論是客戶(hù)端程序,還是服務(wù)器處理引擎,——都可以通過(guò)微軟SQLServer 2005 JDBC驅動(dòng)(可以在MSDN上免費下載)訪(fǎng)問(wèn)服務(wù)代理,或者向服務(wù)代理程序發(fā)送信息,以及必要的時(shí)候接收來(lái)自服務(wù)代理的信息。
在本示例中,一個(gè)虛擬的公寓大樓需要在網(wǎng)上生成維護人員的工作順序,以便住戶(hù)不必打電話(huà)要求辦公室來(lái)安排傳票(從而花費辦公室人員三倍的寶貴時(shí)間來(lái)填寫(xiě)紙質(zhì)表格;事實(shí)上辦公室人員很討厭對住戶(hù)的要求視而不見(jiàn))。
因此,解決方案提供者構建了一個(gè)簡(jiǎn)單而輕便的網(wǎng)絡(luò )系統,其中只有兩個(gè)JSP頁(yè)面:一個(gè)供住戶(hù)將傳票放入服務(wù)中,另一個(gè)供維護人員收集傳票并瀏覽。系統的目的很簡(jiǎn)單,第一個(gè)頁(yè)面收集傳票信息,包括問(wèn)題描述,公寓本身,住戶(hù)姓名和電話(huà)等,然后將信息排入ServiceBroker的隊列中,等待維護部門(mén)訪(fǎng)問(wèn)第二個(gè)JSP頁(yè)面來(lái)獲取待處理的任務(wù)列表。
至于實(shí)現方式,從Java的角度來(lái)說(shuō),使用ServiceBroker和使用其它以JDBC為驅動(dòng)的數據庫并沒(méi)有很大區別。要把消息送入隊列中,只需要一個(gè)對SQL Server實(shí)例的JDBC調用,就像傳統方式寫(xiě)一個(gè)INSERT或者UPDATE語(yǔ)句一樣:

獲取消息的方式更為直接,使用SQL Server的RECEIVE關(guān)鍵字:

或許會(huì )有許多人提出疑問(wèn),這里為何使用SQLServer服務(wù)代理,而不使用對Java更加友好的JMS實(shí)現方式,比如開(kāi)源的ActiveMQ或商業(yè)的SonicMQ。要回答這個(gè)問(wèn)題,可能會(huì )回到以往Java/.NET兼容性問(wèn)題中常用的答案上:“我們這樣做是迫不得已?!备姓f(shuō)服力的答案是:為了“會(huì )話(huà)”。ServiceBroker提供了JMS標準中前所未有的會(huì )話(huà)功能。與事務(wù)型消息傳遞相類(lèi)似,會(huì )話(huà)表現為往返傳遞的一系列信息,每個(gè)會(huì )話(huà)都有唯一的標識符。本質(zhì)上而言,這是連續RPC調用和獨立的單獨路徑信息的結合。它提供了消息通訊系統中通常難以具備的可靠性和健壯性。在我們上面的虛擬示例中,會(huì )話(huà)的使用有些隨意,它在長(cháng)時(shí)間運行的商業(yè)流程中也同樣可以非常強大。上面代碼中的標識符conversationId在每個(gè)ServiceBroker實(shí)例中是唯一的,標識本次用戶(hù)交互中消息的集合(本例中只有一個(gè))。
另一個(gè)可能出現的問(wèn)題是為何使用JSP來(lái)編寫(xiě)網(wǎng)頁(yè)界面,而不使用ASP.NET;對于非Windows平臺而言,這仍然是個(gè)“迫不得已”的選擇。但JSP有其獨到之處,就是用于生成美觀(guān)界面的豐富的工具和預編譯組件。如果我們討論所有的Java/Web space工具,比如Struts, Seam, WebWork, JSF, Google WebToolkit等等,都使Web開(kāi)發(fā)體驗與傳統ASP.NET的拖放方式截然不同。(對不熟練的Web開(kāi)發(fā)人員,拖放方式或許很適用,但熟練者都有自己喜歡的方式,并且覺(jué)得ASP.NET的設計與他們的方式相沖突。)關(guān)于SQL Server服務(wù)代理更詳細的討論,請見(jiàn)勃切明與蘇利文的《SQLServer 2005開(kāi)發(fā)人員指南》。關(guān)于Servlet和JSP更詳細的討論,請見(jiàn)杰森?弗克納和凱文?瓊斯的《JavaServlet與JSP》。關(guān)于JDBC更詳細的討論,請見(jiàn)費舍爾、艾利斯和布魯斯的《JDBC教程與API參考,第三版》。
狂熱的開(kāi)源分子聽(tīng)到這一方案可能有些難以接受。毫無(wú)疑問(wèn),在過(guò)去10年中,微軟的Office提供了世界上最流行的辦公室生產(chǎn)效率軟件系列。世界上被安裝次數最多的軟件可能就是Office,其次是Windows本身。
近年來(lái),Java社區在討論富客戶(hù)端程序,拋棄以往的點(diǎn)擊、等待、閱讀的網(wǎng)絡(luò )模式,尋求更具有交互性的用戶(hù)體驗。AJAX實(shí)現了其中的部分功能,代價(jià)是需要編寫(xiě)大量額外的腳本代碼以應對不同的瀏覽器或瀏覽器版本(而有些瀏覽器禁止使用AJAX)。Java社區中有人將Eclipse富客戶(hù)端平臺視為解決法寶,有人推崇JavaWebStart, 或者Adobe Flex等等。
最好的富客戶(hù)端應該基于終端用戶(hù)機器上已經(jīng)安裝的軟件。因為Office是安裝范圍最廣的,尤其是在企業(yè)范圍內的機器,何不利用Office的優(yōu)秀擴展接口,將Office用作富客戶(hù)端,在后端使用Java?
為了出版Office對象模型和使用方法相關(guān)的書(shū)籍,文章,教程和參考文檔,我們不知道已經(jīng)砍伐了多少森林。算上.NET和未使用的COM,Office接口非常復雜,在此列舉也沒(méi)有意義。本文將集中于Office擴展模型之一,智能標簽,以及使用XML定義文件來(lái)識別Office文檔中詞匯(通常是在Excel和Word中使用,不過(guò)PowerPoint和Access也可以使用)并提供下拉菜單供用戶(hù)跳轉到某個(gè)網(wǎng)站的智能標簽列表。
在這種情況下,虛擬環(huán)境很簡(jiǎn)單:一家在線(xiàn)電子經(jīng)銷(xiāo)商發(fā)現他們的在線(xiàn)寵物商店非?;鸨ㄋ麄兘K于解決了通過(guò)與世界各地的寵物商店談判后水路郵遞寵物的問(wèn)題),而他們使用SpringJPetStore范例編寫(xiě)的首頁(yè)現在需要處理各種復雜的計算,遵守公司內財務(wù)人員和市場(chǎng)人員提出的商業(yè)規則。簡(jiǎn)單的訂單都留給首頁(yè)處理,但復雜一些的訂單將由銷(xiāo)售人員通過(guò)面談或電話(huà)完成。
復雜的計算法則需要復雜的處理語(yǔ)言來(lái)實(shí)現,而這正是Excel的用武之地——財務(wù)人員和市場(chǎng)人員都可以在Excel中使用公式語(yǔ)言來(lái)自己編寫(xiě)法則,——我們要做的下一步是將Excel中的數據表格顯示為Spring前端首頁(yè)。此時(shí)第一步只需要從Excel文檔中識別出訂單和產(chǎn)品號,然后顯示出智能標簽將銷(xiāo)售人員指向Spring編寫(xiě)的網(wǎng)站中準確的頁(yè)面。(進(jìn)一步的改進(jìn)可以在保存數據表格時(shí)自動(dòng)下訂單,或者在試圖銷(xiāo)售沒(méi)有庫存的寵物時(shí)彈出警告信息等。)

用簡(jiǎn)單的XML文件實(shí)現這些,要比使用Java和.NET代碼更加實(shí)用。幸好URL天性靈活,智能列表標簽不必介意URL所指向的網(wǎng)站其實(shí)是用Spring編寫(xiě)的。如下所示的智能標簽會(huì )每天刷新,隨時(shí)顯示出新的商品ID。(“看啊,孩子們,我們現在有雪貂的庫存!”)

簡(jiǎn)單來(lái)說(shuō),我們需要建立兩個(gè)智能標簽。一個(gè)用來(lái)識別產(chǎn)品ID(FL-DSH-01等等),另一個(gè)用來(lái)識別項目ID(EST-16, EST-17等等). 我們只需要在URL中使用ID值來(lái)替換{TEXT}占位符并訪(fǎng)問(wèn)網(wǎng)站。這里的ID編碼很復雜,但
智能標簽的能力遠遠超出這個(gè)簡(jiǎn)單的例子所展現的。Visual Studio Tools for OfficeAPI可以讓.NET開(kāi)發(fā)人員在所需要的智能標簽后面編寫(xiě)任意形式的代碼,所以在激活智能標簽時(shí)向JPetStore引擎進(jìn)行遠程調用(使用WebService調用或其它商業(yè)工具,例如JNBridge或者ZeroC’s ICE)來(lái)獲取當前庫存量等操作也完全可以實(shí)現。
智能標簽并不是Office整合能力的極限。文檔表格可以通過(guò)自定義為任何Java系統充當用戶(hù)界面,Excel的公式語(yǔ)言可以通過(guò)自定義公式進(jìn)行擴展(當然可以通過(guò)本地JVM使用JavaAPI或者遠程調用Java系統),等等。而且方式不止一種——必要的時(shí)候,Word和Excel都可以裝入EclipseRCP,或者說(shuō),任何一個(gè)COM自動(dòng)對象都可以這樣使用,而Word和Excel本身的功能仍然完整保留。
當然,以上并非全部可用方案,只是最近幾次討論和客戶(hù)會(huì )談中想到的一些。其它方案還有:
越來(lái)越多的開(kāi)發(fā)人員開(kāi)始意識到結合使用.NET和Java的優(yōu)勢,因此越來(lái)越多的方案將得到實(shí)施。Java和.NET社區都在進(jìn)行更多的創(chuàng )新,因此雙方都會(huì )更加開(kāi)放而誠懇地考慮如何更好地解決客戶(hù)的問(wèn)題。畢竟最后不論你喜歡哪種技術(shù),我們的目的都是一個(gè):為客戶(hù)提供解決方案。
Ted Neward是Neward &Associate公司的主要負責人,該公司是致力于使用Java、.NET、XML及其它必要工具的企業(yè)系統的咨詢(xún)公司。他從1991年起開(kāi)始使用C++,從1997年起開(kāi)始使用Java,從2000年起開(kāi)始使用.NET。他兼任PluralSight的.NET講師,獨立教授Java,在世界Java和.NET社區中的各種會(huì )議上發(fā)言,為MSDN、InfoQ和TheServerSide撰寫(xiě)文章,并著(zhù)有《果殼中的C#》,《SSCLI本質(zhì)》與《有效的企業(yè)級Java》等書(shū)籍。這些信息記錄于網(wǎng)站http://www.tedneward.com。
需要注意,本文的讀者通常對兩種技術(shù)中的一個(gè)比較熟悉,而不是都熟悉。因此,下面將列出兩種平臺的主要構成。這里并不是要對每種組件進(jìn)行介紹,或者進(jìn)行詳細的列舉。讀者可以通過(guò)文末的參考文獻尋找更多信息。
Java:
.NET:
聯(lián)系客服