国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Jini,J2EE和Web服務(wù)
作者: Kathy Sierra 和Bert Bates, Head First Java, 2nd Edition的作者
翻譯:kelvincheng
寫于:06/15/2005
版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
原文地址:
http://www.onjava.com/pub/a/onjava/2003/08/27/cocktails.html
中文地址:
http://www.matrix.org.cn/resource/article/43/43781_Jini_J2EE.html
關(guān)鍵詞: Jini J2EE Web
編輯說明:Kathy Sierra 和Bert Bates是O’Reilly的Head First系列的后臺(tái)智囊。他們第一次寫這篇文章是在2003年Head First Java發(fā)行的那時(shí)候。這本書變得十分流行,我們現(xiàn)在仍然收到訂單。如此多的訂單讓我們決定重新帶給讀者,這就導(dǎo)致Head First Java,2nd Edition的發(fā)行。所以如果第一次發(fā)行的時(shí)候你沒趕上,現(xiàn)在就讓Kathy和Bert告訴你如何與Java初學(xué)者交談。
這些都是可以預(yù)測到的:當(dāng)你在一個(gè)宴會(huì)中,喝著次等的馬提尼酒,不可避免的就會(huì)談到分布式編程。怎么辦?放松點(diǎn),因?yàn)樵谶@里我們會(huì)解決3種最有意思的分布式編程,就在用完的餐巾上畫圖,你可以用來提高你的 whuffie. (不知道 whuffie是什么? 讀讀 Richard Koman's interview with Cory Doctorow.)
但是首先,萬一你真的現(xiàn)在就在某個(gè)宴會(huì)上,我們首先從幾個(gè)即使你不懂Java也可以使用的短語。然后,對于那些確實(shí)知道一些Java技術(shù)的人,我們會(huì)談得更深入一點(diǎn)。
“什么是動(dòng)態(tài)發(fā)現(xiàn)?你知道,它的含義就是在網(wǎng)絡(luò)上,盡管客戶端和服務(wù)事先對對方一無所知,但能動(dòng)態(tài)地發(fā)現(xiàn)對方。這所有都是基于IP廣播的?!?div style="height:15px;">
“什么是自動(dòng)診斷網(wǎng)絡(luò) (self-healing network) 呢?它指Jini網(wǎng)絡(luò)總是能夠反映當(dāng)前所有可用的服務(wù)的狀態(tài)--就像這樣:‘OK,這個(gè)服務(wù)起來了,那個(gè)服務(wù)當(dāng)?shù)袅恕瘺]有任何人的管理!”
當(dāng)然,大多數(shù)路由器禁止了IP廣播,所以你不準(zhǔn)備在web上用Jini。但是Jini是為本地網(wǎng)絡(luò)的工作,或者本地網(wǎng)絡(luò)的集合而設(shè)計(jì)的,所以這并不是個(gè)大問題。
“J2EE最酷的東西是提供商獨(dú)立,你可以專心于你的商業(yè)邏輯,將那些重?fù)?dān)交給廠商。你可以在你特殊的商業(yè)規(guī)則上工作,把那些安全,事務(wù),并行,持久化,甚至網(wǎng)絡(luò)代碼實(shí)現(xiàn)的任務(wù)交給服務(wù)器。而你只需要去學(xué)一個(gè)API,你可以重新部署你的J2EE程序給所有廠商的與J2EE兼容的服務(wù)器。所以現(xiàn)在廠商必須改變以前那種將你鎖起來,并且你必須乞求廠商添加新的功能以解決bugs的方式?!?div style="height:15px;">
“Web服務(wù)中酷的東西是…嗯,OK,也許現(xiàn)在的情況Web services沒有什么真正酷的東西。但是會(huì)變的,就在不久的未來,當(dāng)所有標(biāo)準(zhǔn)都提出,工具成熟了,以及….”
“但是如果要說Web 服務(wù)酷,這也許因?yàn)槟憧梢圆捎媚阋延械纳虡I(yè)程序,甚至舊的程序,讓他們通過XML那樣的接口暴露在Web上??蛻舳送ㄟ^可互操作的方式發(fā)送一個(gè)XML信息(通過一種叫SOAP的格式)給服務(wù)?!?div style="height:15px;">
“安全和事務(wù)是現(xiàn)在Web服務(wù)的兩個(gè)明顯的缺陷,這意味著所有人必須加入自己的解決方案。在Web上沒有足夠的事務(wù)管理設(shè)置,而你所擁有的唯一的安全是互動(dòng)驗(yàn)證 (mutual authentication) 的Https?!?div style="height:15px;">
“Jini和J2EE都是Java技術(shù)。通過J2EE,就像規(guī)格說明說的那樣:“哦,你不需要擔(dān)心你這個(gè)小程序員去解決那些巨大的困難的東西。廠商會(huì)考慮這些問題,而你可專注于自己的特殊領(lǐng)域的需要(比如,如何賣出更多的婦女內(nèi)衣)。但是,通過Jini,就好像規(guī)格說明說的那樣:‘你必須靠自己,別指望其他人使用許多基礎(chǔ)設(shè)施來救你。這是貧乏而又簡陋的,寶貝,但你可以做最令人驚訝和體面的事情。當(dāng)你在那時(shí),檢驗(yàn)一下JavaSpaces?!?div style="height:15px;">“Web服務(wù)不是針對于java的技術(shù),但是java可以讓其更容易的使用,特別是如果你去使用J2EE 1.4。不,你說的對。J2EE 1.4還沒發(fā)布,但是會(huì)在今年年底發(fā)布,你將在2004年初見到許多廠商支持。”
(在我們繼續(xù)下去之前,先提出一些免責(zé)聲明:首先,如果你對于這篇文章的高級含義有任何問題,重新讀一下標(biāo)題。對于這些內(nèi)容我們有酒吧侍應(yīng)的牌照,我們不會(huì)告訴你什么是錯(cuò)的,但是你也不會(huì)試圖去了解整個(gè)故事。每個(gè)主題都需要相應(yīng)的一本書(但如果我們不說出任意一本書來,這是很可恨的。比如,Head First EJB,或是哪一本呢?)讓我們僅僅通過雞尾酒會(huì)的觀點(diǎn)來看這個(gè)問題并不是你想來操縱你的下個(gè)結(jié)構(gòu)。(我們知道你知道這些,但對于那些可能會(huì)誤解這篇文章是篇嚴(yán)肅的技術(shù)論文的人,我感到有必要談?wù)勎覀兊腶**es).)[原文如此]
所以現(xiàn)在是時(shí)候進(jìn)入下一個(gè)層次了。我們將首先開始看看什么是服務(wù),而且更重要的是如何向別人顯現(xiàn)你自己。換種說法,你如何將你的服務(wù)告訴你潛在的客戶呢?
通過Jini,J2EE,和Web service,目的是讓客戶去訪問服務(wù)。什么是服務(wù)呢?你所能做的事就是將消息從一個(gè)軟件傳遞給另一軟件(也許包含人工指向,也許也不包含)。你也許有一個(gè)為基因匹配進(jìn)行大規(guī)模計(jì)算的服務(wù)?;蛘咭粋€(gè)玩簡陋的Go游戲的服務(wù)?;蛘咭粋€(gè)讓你買演唱會(huì)門票的程序?;蛘哳A(yù)定異國熱帶風(fēng)情的巡游。或者甚至將你的文字傳遞給一臺(tái)高容量(high-volume)打印機(jī)。換種說法,服務(wù)就是所有像軟件一樣開始但是結(jié)果并不一定留存在軟件中的東西。
你也許有個(gè)服務(wù)來移動(dòng)攝像機(jī),利用打印機(jī)打印,撥電話。沒關(guān)系?;蛘咧辽?zèng)]關(guān)系。主要目標(biāo)之一,就像OO的任何情況下的目標(biāo)一樣,盡可能減少耦合,—此例中,即客戶端和服務(wù)器端之間的耦合。換種說法就是我們要讓那些參與者(客戶端和服務(wù)端)盡可能地少了解對方。
但是讓我們說說你有一個(gè)服務(wù)…現(xiàn)在怎么辦?客戶端如何找到你?如果他們找到你,他們怎么知道你的服務(wù)可以干什么?換種說法,他們?nèi)绾沃浪麄冋{(diào)用你的服務(wù)的方法?這樣,你必須將你自己暴露給客戶,我們的3種技術(shù)在這方面稍有不同。不考慮我們在討論Jini,J2EE,或者Web服務(wù),可是必須在某個(gè)地方有個(gè)接口。這個(gè)接口說明了你可以做的東西。
服務(wù)接口
作為一個(gè)服務(wù)開發(fā)人員,你必須告訴人們你的服務(wù)可以做什么。或者說,你必須聲明你的服務(wù)的方法。這包括聲明客戶端傳遞給你的方法什么(參數(shù))以及服務(wù)返回什么(返回類型)。
上面這個(gè)接口是為一個(gè)叫Advice的服務(wù)。它具有一個(gè)方法,getAdvice()。你可以調(diào)用這個(gè)方法,得到一個(gè)字符串,里面包含極好的有用的隨機(jī)選擇的建議。(我們選擇不在我們假的小類似于UML的圖中顯示返回類型。這是非常小的事)。
對于Jini和EJB(Enterprise JavaBeans---J2EE的核心和靈魂),接口通常是Remote。一個(gè)Remote的接口通常意味著開發(fā)者寫一個(gè)基于java.rmi.Remote的擴(kuò)展java接口。耶,Remote所有方法(意思是Remote接口中的所有方法)必須聲明一個(gè)java.rmi.RemoteException的異常。一個(gè)強(qiáng)制性的異常(checked exception),告訴客戶端:“事情變得很糟糕,小心準(zhǔn)備?!?div style="height:15px;">
對于Web Services,接口被定義在一個(gè)WSDL中(讀作“wizdle”,與“fizdle”押韻)----一種特殊格式的XML文檔。所以總括來說,你可以在隨意的談話中說以下這段話:
“可以說,在Jini和EJB中,你通過java接口暴露你自己,但是在Web服務(wù)中,你通過XML接口暴露你自己?!?div style="height:15px;">(準(zhǔn)確地說,如果你是一個(gè)java開發(fā)者,你通過寫一個(gè)java接口來創(chuàng)建WSDL,按那個(gè)在你的開發(fā)工具中神奇的紅色按鈕,將你的java接口變成XML WSDL。這就夠了,像他們說的,這超過了一個(gè)雞尾酒會(huì)談話的范圍。)
OK,現(xiàn)在我們有了服務(wù),有了暴露我們服務(wù)的接口?,F(xiàn)在呢?客戶端如何知道這個(gè)接口?他們?nèi)绾握嬲〉眠@個(gè)接口,他們還需要和我們服務(wù)交流些什么呢?這要看服務(wù)的類型。這3種類型是不同的。你訪問Jini,J2EE和Web服務(wù)將有少許不同,文章的其他部分將著重于一些細(xì)節(jié)和主要不同之處。
首先,讓我們從一些Java的Remote Method Invocation(RMI)的背景開始。這是大部分的java分布式技術(shù)的主干,Jini和EJB都基于此。事實(shí)上,自從所有分布式技術(shù)在概念上如RMI的技術(shù)上運(yùn)行時(shí),你在這里了解的東西將幫助你弄清楚整個(gè)分布式的世界,Java或者非Java的。
通過RMI,你寫你的服務(wù)并將此變成為Remote對象。讓其成為Remote僅是小菜一碟---寫分布式接口,創(chuàng)建Remote類來實(shí)現(xiàn)它。
創(chuàng)建Remote接口
1.        擴(kuò)展 java.rmi.Remote
2.        為每個(gè)方法聲明java.rmi.RemoteException
1.        public interface Advice
2.        extends java.rmi.Remote {
3.
4.           String getAdvice() throws
5.           java.rmi.RemoteException;
6.
7.        }
創(chuàng)建Remote類
1.        實(shí)現(xiàn)你的Remote接口
2.        為接口方法寫真正的商業(yè)邏輯
1.        public class AdviceImplementation implements Advice {
2.
3.           public String getAdvice() {
4.
5.           // monumentally important
6.            business logic here
7.
8.          }
9.
10.        }
(OK,所以代碼對于雞尾酒會(huì)有點(diǎn)多,因?yàn)樵谶@都是初學(xué)者….)
所有東西的關(guān)鍵:The Stub
當(dāng)你已經(jīng)有了接口和類,你通過RMI編譯器(rmic)運(yùn)行你的類,RMI編譯器已在J2SE中(如果你已經(jīng)有javac,你就有rmic了)。那個(gè)程序建立了stub這個(gè)你可以幾乎在所有現(xiàn)代分布式編程模型中發(fā)現(xiàn)的東西。Stub僅是客戶端的助手,通過像服務(wù)那樣實(shí)現(xiàn)遠(yuǎn)程接口來扮演遠(yuǎn)程對象的角色。但是事實(shí)上,Stub僅是一個(gè)取得方法調(diào)用,打包,并通過網(wǎng)線傳遞給真正的遠(yuǎn)程對象的小對象。或者說, stub知道如何打電話回家并叫真正的服務(wù)去做真正的工作。
Stub所有方法都是虛假的。他們是方法,有一大堆代碼,包括用于服務(wù)聯(lián)系的網(wǎng)絡(luò)和I/O內(nèi)容。但是他們并不是真正的商業(yè)代碼。所以對于Advice服務(wù), stub有g(shù)etAdvice()方法,但是這個(gè)方法僅僅從客戶的請求傳遞給在服務(wù)器上真正的AdviceImplementation。
那邊,客戶端假裝他在調(diào)用遠(yuǎn)程對象,但是我們知道由于遠(yuǎn)程對象運(yùn)行于不同的JVM堆中這并不真正發(fā)生。
(是的,在服務(wù)器端依然有些東西接受來自客戶的Socket連接,解包方法調(diào)用,打包并裝載返回值等等。但是我們并不準(zhǔn)備在這篇文章中談?wù)撨@些。那是個(gè)更微不足道的過程,因?yàn)槟悴恍枰獡?dān)心傳遞功能給客戶。所以在服務(wù)器上Stub的功能有同伴,但是你并不需要擔(dān)心這個(gè)。)
RMI基本結(jié)構(gòu)
籍由RMI,遠(yuǎn)程對象是一個(gè)服務(wù)。
暴露RMI
如果你有個(gè)客戶端,你想通過遠(yuǎn)程服務(wù)(或者說遠(yuǎn)程對象)做些東西,你必須有遠(yuǎn)程服務(wù)的接口(在編譯時(shí)和運(yùn)行時(shí)),而且你必須有stub對象(運(yùn)行時(shí))。記住,是Stub真正知道如何傳遞你的方法調(diào)用給遠(yuǎn)程對象(并傳遞回返回值),所以你可不能沒有它。很多時(shí)候,你將從服務(wù)開發(fā)者那得到接口和stub .class文件。
但是有個(gè)更酷的方式運(yùn)行時(shí)取得stub類而不需要在運(yùn)行前取得,那就是通過一個(gè)叫動(dòng)態(tài)代碼下載(Dynamic code downloading)的進(jìn)程。這是你在java中可以使用的最強(qiáng)大的東西之一,而且也不難。但是,你也可以以守舊的方式從開發(fā)者的Email中取得stub類文件,或者從別人那里下載到你的電腦。
查找服務(wù)(例如擁有stub,這樣你可以調(diào)服務(wù)中的商業(yè)方法)
在RMI中,你通過RMI登記(附在J2SE中)查找到stub。RMI登記就像一本小的電話簿,你找到名字,然后就得到stub。記得當(dāng)stub對象過來的時(shí)候是串行化的。這意味著在其來到客戶端時(shí)要使其反串行化。同時(shí)為了讓其工作,the stub類必須在當(dāng)前的classpath中或者可以用動(dòng)態(tài)代碼下載來找到。這是java基本知識---一個(gè)實(shí)例不能在沒有其類時(shí)反串行化。
發(fā)現(xiàn)查找服務(wù)(RMI Registry)
通過RMI,你必須知道the stub在哪里?你必須為RMI Registry知道IP地址和TCP端口號(同時(shí)也恰好是遠(yuǎn)程對象/服務(wù)所在的服務(wù)器那里)。事實(shí)上我們大概并不一定要知道端口號,因?yàn)橛心J(rèn)的端口號,但是如果服務(wù)部署人員更改了,你則需要知道??蛻舳酥蛔隽撕唵蔚膯涡械牟檎?,利用靜態(tài)方法(java.rmi.Naming.lookup()),這時(shí)奇跡發(fā)生了,它有了一個(gè)即時(shí)的反串行化的stub。對象知道如何打電話回家了。
現(xiàn)在我們已經(jīng)注意RMI,這部分將會(huì)更有意義。Jini就像是Extreme RMI。我們這里用Extreme這個(gè)詞是指其運(yùn)動(dòng)含義,而不是XP中的意思。
動(dòng)態(tài)發(fā)現(xiàn):服務(wù)和查找服務(wù)如何發(fā)現(xiàn)對方
這是普通的RMI與Jini差別最多的地方。在RMI中,客戶端必須知道很多東西,服務(wù)必須通過RMI Registry清楚地登記(用邏輯名稱),注冊必須在與服務(wù)的同個(gè)機(jī)器中。
但是通過Jini,所有東西僅是在那兒,在某處。沒有人知道除了接口外的其他東西。這里有句話關(guān)于這個(gè)的,我們發(fā)現(xiàn)這放在這個(gè)對話中的戰(zhàn)略時(shí)刻相當(dāng)有意義。
“通過Jini,服務(wù)通常嘗試去發(fā)現(xiàn)查找服務(wù),客戶端也通常發(fā)現(xiàn)查找服務(wù),而查找服務(wù)通常在讓服務(wù)和客戶端知道他們(查找服務(wù))就在這。所有都是自動(dòng)的。”
雖然在Jini中你也可以將整個(gè)服務(wù)發(fā)送給客戶端本身,而不是讓服務(wù)變成服務(wù)器上100%的遠(yuǎn)程對象,但是基本的Jini結(jié)構(gòu)采用RMI。當(dāng)客戶端要求服務(wù)的參考時(shí),將取得遠(yuǎn)程對象的stub(如果服務(wù)被實(shí)現(xiàn)為一個(gè)遠(yuǎn)程對象),或者重新得到整個(gè)該死的服務(wù),在上面進(jìn)行簡單的舊的本地調(diào)用。事實(shí)上,通過Jini,客戶端甚至可以一個(gè)混合體或者“智能代理”(公開說這句話會(huì)有特別的聲望)。--那樣,一個(gè)非遠(yuǎn)程java對象包含一個(gè)遠(yuǎn)程對象的stub(就好像,實(shí)例變量)。那樣,客戶端直接對服務(wù)進(jìn)行本地調(diào)用,但是服務(wù)本身可能會(huì)將其跳轉(zhuǎn),讓遠(yuǎn)程調(diào)用到其他地方?!爸悄艽怼笨梢酝ㄟ^在客戶端做某些工作提高在客戶端和服務(wù)上的表現(xiàn)。
Jini架構(gòu)
Jini和其他所有分布式技術(shù)(普通的RMI,EJB和Web services)有另外一個(gè)主要不同點(diǎn)是Jini利用分布式租約幫助建立自愈網(wǎng)絡(luò)。如果Jini服務(wù)是遠(yuǎn)程的,例如,他給客戶端一個(gè)租約并說:“這是你的租約。如果你不更新它,我將假設(shè)你已經(jīng)離開,我將停止你在這里代表的任何資源。”最新的網(wǎng)絡(luò)如何保持依賴于這些租約的時(shí)長。例如,一個(gè)兩小時(shí)的租約將意味著客戶端可能斷開將近兩個(gè)小時(shí),而你(服務(wù))卻不知道。多么浪費(fèi)!另一方面,一個(gè)一秒鐘的租約意味著最近的網(wǎng)絡(luò),但是所有人花費(fèi)其所有的周期和帶寬去更新租約!所以那是筆交易,這依賴于服務(wù)的類型以及其他服務(wù)質(zhì)量問題。
自愈型網(wǎng)絡(luò)另一個(gè)很酷的東西是:既然Jini查找服務(wù)是一個(gè)Jini服務(wù),查找服務(wù)給Jini服務(wù)一個(gè)租約。所以在這種情況下,Jini服務(wù)對于Jini查找服務(wù)是個(gè)客戶。那樣,當(dāng)一個(gè)普通客戶端(或者說,一個(gè)本身不是Jini服務(wù)的客戶端,而是想用Jini服務(wù)的程序)來查找一個(gè)服務(wù),比如打印機(jī),如果服務(wù)沒有通過查找服務(wù)更新客戶端將不視其為“可用”。此外,租約時(shí)間越短,就越是最近的網(wǎng)絡(luò)的寫照,越不可能會(huì)令到一個(gè)客戶選擇一個(gè)不再可用的服務(wù)。
Jini暴露
如果你是一個(gè)客戶端,你想從Jini服務(wù)中取得某些東西,你必須有對于這個(gè)服務(wù)的接口。不想RMI,Jini具有更靈活性,因?yàn)槟愠私涌谕獠恍枰榔渌麞|西。你并不需要知道注冊的名字或者Service的位置。只要你知道接口以及你在一個(gè)可以發(fā)現(xiàn)查找服務(wù)的網(wǎng)絡(luò),你就可以工作了。
今天,幸運(yùn)的是開發(fā)者給你接口。但是有少量的接口到處漂浮,變成某種標(biāo)準(zhǔn),包括Bill Venner的名聲不好的ServiceUI.
發(fā)現(xiàn)服務(wù)類
不像RMI,在Jini中你將不可以選擇是否使用動(dòng)態(tài)代碼下載。你幾乎被迫使用它。(你也可以不使用它,但是這違背了Jini的本來目的。)通過Jini,你不需要知道網(wǎng)絡(luò)中內(nèi)容的位置,你也不需要知道誰建立這個(gè)服務(wù)。記著,所有你要的只是接口,而且在很多情況下,你需要擔(dān)心的你需要去實(shí)現(xiàn)服務(wù)的接口(也許是個(gè)stub,也許是真正的服務(wù),或者集合體…)。
記著,在RMI中,你在客戶端中需要的類通常是Stub類,而不是服務(wù)本身。在Jini中,如果服務(wù)被實(shí)現(xiàn)為遠(yuǎn)程對象,或者是真實(shí)的服務(wù),你調(diào)用方法的應(yīng)該在stub中---例如,一個(gè)實(shí)現(xiàn)了接口并真正工作的類就在客戶端本地。
查找服務(wù)
通過Jini,你使用Jini 查找服務(wù)(lookup service),而不是RMI Registry。Jini查找服務(wù)更靈活和強(qiáng)大,而且它可以像服務(wù)對象那樣提供信息給你,哪個(gè),是或者不是遠(yuǎn)程對象stub,這依賴于服務(wù)是否是個(gè)服務(wù)器上的遠(yuǎn)程對象或者是轉(zhuǎn)載在客戶端上的非遠(yuǎn)程對象。最好的東西是你不需要知道查找服務(wù)在哪!在RMI中,你必須知道遠(yuǎn)程服務(wù)的IP地址和端口號來找到服務(wù)stub所在的RMI Registry。而在Jini中,你僅知道大概在某處,在那兒的網(wǎng)絡(luò)上有不少于一個(gè)的查找服務(wù),通過IP廣播達(dá)到。
這就是Jini。但是Jini是個(gè)瘋狂的邊緣,這里沒有人知道任何東西,而你就在你自己的模型上,J2EE正好是相反的東西。
J2EE的主要思想就是服務(wù)器(通過容器)給你一堆額外的服務(wù),否則這些服務(wù)你也許要自己寫,或者將不同的部分拼湊起來,或者從私人廠商那購買。我們現(xiàn)在談?wù)摰氖蔷扌偷姆?wù),像事務(wù)管理,并行管理,安全,資源/生命周期管理,查找服務(wù),持久化,信息服務(wù)等等。
那樣,你開始專注于你的自己的商業(yè)規(guī)則,而不是重新去做那些繁瑣的重復(fù)的事情。其他應(yīng)用服務(wù)器已經(jīng)存在了一段時(shí)間了---如CICS和TUXEDO都是經(jīng)典的例子。但是在那種環(huán)境下你必須學(xué)私有的API,你被廠商鎖住了。J2EE是企業(yè)級商業(yè)中間層的標(biāo)準(zhǔn),所以你僅僅需要學(xué)一個(gè)API,無需考慮你要選擇的服務(wù)器。其中最好的就是你可以部署你的應(yīng)用到任何符合J2EE標(biāo)準(zhǔn)的服務(wù)器,所以你可以對廠商的枷鎖說拜拜了。
當(dāng)然,事實(shí)上由于各種原因,將J2EE程序部署在不同的服務(wù)器上并不容易。但是你可以。而且如果你有足夠的錢換掉你現(xiàn)在的提供商,知道這個(gè)不更好?更好的是,讓廠商知道你可以這樣做。
首先,澄清一下J2EE和EJB的不同:J2EE是一個(gè)為可運(yùn)行EJB的服務(wù)器設(shè)立的規(guī)范。但是J2EE服務(wù)器同樣要支持servlets和JSP。你可以認(rèn)為J2EE就像一個(gè)整合的服務(wù)器—將servlet和支持JSP的Web服務(wù)器以及EJB服務(wù)器整合在一起的服務(wù)器。在J2EE領(lǐng)域,我們叫它子服務(wù)容器。所以我們在J2EE服務(wù)器中擁有Web容器和EJB容器。因?yàn)閎eans比servlets和JSP更吸引人,我們在這里專注于EJB方面。同時(shí)在EJB的世界,服務(wù)就是bean。
EJB有樣很酷的東西就是基于組件的開發(fā)模型。你建立可重用組件,這些組件是可以在部署時(shí)定制而不需要改動(dòng)java代碼。組件比java類更易用,所以他是下一個(gè)層次的重用。你利用XML文件來部署你的組件(例如beans),而這些文件說明服務(wù)器應(yīng)該如何處理bean,所以你可以配置安全,事務(wù),資源使用等等,都聲明在XML文件中,你只需要在開發(fā)工具中按幾個(gè)按鈕即可。(如果你真的想,你當(dāng)然可以直接編寫XML文件。但是現(xiàn)在的工具十分好,而你并不需要去做那些工作。)
J2EE架構(gòu)
J2EE和普通RMI一個(gè)很大不同之處就是服務(wù)器必須介入客戶的調(diào)用和服務(wù)(例如bean)的被調(diào)用中。如果客戶端遠(yuǎn)程調(diào)用已開放的bean方法,服務(wù)器會(huì)介入并讓其隱蔽的過多的bean與客戶端直接聯(lián)系。例如,假如客戶端扮演特定的顧客調(diào)用bean中的getAddress()方法。首先,服務(wù)器必須驗(yàn)證客戶端是否經(jīng)授權(quán)去調(diào)用這個(gè)方法,但是假設(shè)客戶通過了安全檢查,現(xiàn)在服務(wù)器必須去做其他東西讓bean準(zhǔn)備好去接受調(diào)用。如果bean返回客戶的地址,比方bean會(huì)重新去數(shù)據(jù)庫記錄中取得客戶的資料。這需要變成事務(wù)的一部分,而其他客戶也許準(zhǔn)備好使用這個(gè)客戶,還有….
J2EE的解決方案是讓bean成為非遠(yuǎn)程對象,被遠(yuǎn)程對象保護(hù)。所以即使bean真的是服務(wù)(或者說,這里含有客戶想調(diào)用的商業(yè)邏輯服務(wù)方法),而bean在RMI方式中并非是遠(yuǎn)程的。但是客戶依然和RMI副本以及遠(yuǎn)程對象相互作用;就像和EJB相互作用那樣,遠(yuǎn)程對象更像是bean的保鏢。遠(yuǎn)程對象(在J2EE中叫做EJB對象)接受客戶端遠(yuǎn)程調(diào)用(例如,客戶端在stub上的調(diào)用),并同時(shí)讓服務(wù)器加入來決定如何,何時(shí)和調(diào)用是否到達(dá)bean。
J2EE暴露
通過EJB,在RMI規(guī)劃圖(除了服務(wù)外)中加入另一層。EJBObject是遠(yuǎn)程對象,但不像RMI中,EJBObject并不是個(gè)服務(wù)。所以那樣現(xiàn)在這里對于服務(wù)有兩個(gè)幫手,而不像普通的RMI那樣子有一個(gè)(stub)。你的服務(wù)接口依然是遠(yuǎn)程接口,而不是直接實(shí)現(xiàn)java.rmi.Remote,你的服務(wù)接口實(shí)現(xiàn)EJBObject---一個(gè)本身擴(kuò)展自java.rmi.Remote的接口。盡管bean不含有相同的方法,注意bean如何不擴(kuò)展服務(wù)接口(Advice)。(不要過于拘謹(jǐn)擔(dān)心,絕大多數(shù)注重EJB的開發(fā)工具確認(rèn)bean和服務(wù)接口會(huì)匹配。)
找尋服務(wù)接口
通過J2EE,你通常與客戶端開發(fā)者同在一個(gè)企業(yè)工作,則你可發(fā)Email給他接口,或者你可以在內(nèi)部的知識庫中公布。無論如何,重要的是,就像RMI和Jini,客戶端必須在編譯時(shí)有此接口。
同樣,對stub類 ,你可以選擇提前給客戶端或者用動(dòng)態(tài)代碼下載。但是這種情況下動(dòng)態(tài)代碼下載依賴于你特定的J2EE服務(wù)器,也許不可行,所以你也許會(huì)被困于自行將stub類傳遞給客戶端的情況。大多數(shù)J2EE服務(wù)器為你部署bean準(zhǔn)備了小而精的客戶JAR。
找到服務(wù)
警告:我們在這節(jié)擴(kuò)展了雞尾酒會(huì)知識的限制,所以這段人們就會(huì)說:”哇噢,在你寫到這之前我都跟得上你。。?!边@不是我的錯(cuò),是我們的。所以這里如果你想掠過,你可以直接跳入Web服務(wù),別人也不會(huì)知道。盡管如此,如果你是單身而且想找對象,你若想要到對方的號碼,你就要注意這部分啦。
這與RMI的工作很像,除了查找服務(wù)現(xiàn)在是JNDI而不是RMI Registry或者Jini查找服務(wù)。JNDI是一個(gè)工作在名字和目錄服務(wù)(Naming and Directory services)范圍中的接口,需要J2EE支持??蛻舳嗽赽ean的邏輯名上查找并取得個(gè)stub,就像RMI中。
這里有些東西我們忘記談到了。
在EJB中,客戶端不可直接要求JNDI取得遠(yuǎn)程對象(the EJBObject)的stub?;蛘哒f,客戶端不可通過JNDI的服務(wù)方法取得stub。在JNDI中,客戶只能取得bean的Home。Home僅是bean的工廠;其生命的主要目的管理對EJBObjects的引用?;蛘哒f,Home給你EJBObject的stub---你可以藉此調(diào)用服務(wù)方法。但是Home本身是遠(yuǎn)程對象,所以當(dāng)客戶想調(diào)用bean中的服務(wù)方法時(shí),必須跳過許多額外的步驟,而直接通過RMI則不需要。
1.        進(jìn)行JNDI對bean的邏輯名(不管bean部署者如何稱呼它)進(jìn)行查找。
2.        客戶取得遠(yuǎn)程對象的stub。
3.        客戶調(diào)用Homestub的遠(yuǎn)程方法,請求服務(wù)本身的stub。他不可能引用真正服務(wù)――the bean――但是客戶端可以有最接近的方式:bean的保衛(wèi)的副本,the EJBObject――實(shí)現(xiàn)bean服務(wù)接口的遠(yuǎn)程對象。
對于整個(gè)EJB規(guī)劃有所放棄――從EJB2.0(最新版本J2EE的一部分)開始不是所有的客戶接口必須遠(yuǎn)程?;蛘哒f,the Home和 EJBObject對象可以在客戶端而不是RMI遠(yuǎn)程對象。這意味著客戶和bean運(yùn)行在相同的JVM中!覺得太過于分布式了,是嗎?不是的,因?yàn)槟闶チ俗钣袃r(jià)值的東西――位置獨(dú)立。如果你將客戶端和bean放在一起,的確可以由于減少了副本變成遠(yuǎn)程對象的過程,取得性能提高,但是你放棄了將你所謂的分布式程序的某些部分移到你的網(wǎng)絡(luò)的其他節(jié)點(diǎn)的機(jī)會(huì)。這是強(qiáng)迫的,甚至是命令式的原因來用本地Home和EJBObjects,但是必須通過持久實(shí)體bean實(shí)現(xiàn),所以你僅僅在十分特別的情況下考慮它。眼下,總之當(dāng)你是一位J2EE設(shè)計(jì)者,你可以在你的休息時(shí)間考慮其細(xì)微之處。)
現(xiàn)在我們已經(jīng)領(lǐng)會(huì)到RMI,Jini和J2EE,我們都認(rèn)為他們是比Web Services更好,整潔,適量,新鮮的技術(shù)。事實(shí)上我們并不過多的討論Web服務(wù),因?yàn)樵赪eb服務(wù)領(lǐng)域粗糙且不清晰。但我們也會(huì)討論下,讓你度過喝東西的時(shí)間。
Java RMI,Jini,J2EE和EJB都是完全的java技術(shù),而Web服務(wù)不是。Web服務(wù)取得你現(xiàn)有的程序(即使有些種類是建立針對于部署為Web Service的新建的程序,但是比較少。),將他們暴露在Web上。大部分時(shí)候,是在企業(yè)內(nèi)部網(wǎng)中。即使Amazon和Google提供Web services讓你可往你的站點(diǎn)添加Google或者Amazon的功能,但現(xiàn)在很少有機(jī)會(huì)你可以找到在網(wǎng)絡(luò)上供公共訪問的Web服務(wù)。我們都認(rèn)為那是特殊情況。
今天,大多數(shù)Web服務(wù)的案例是用于他們自己商業(yè)程序間的綜合。但是理想的情況是以B2B以及C2B(Business-to-Business and Consumer-to-Business)的方式有大量的WebService共同工作,而不需要了解關(guān)于除了商業(yè)領(lǐng)域外其他程序的預(yù)先知識。
例如,最經(jīng)典*的例子是:你由于成為最新的銷售冠軍進(jìn)行多個(gè)城市的巡回演講,“這不僅僅是移動(dòng)”但是你要去的下一個(gè)站電量停電,而現(xiàn)在你的整個(gè)計(jì)劃都是都要改變。所以你使用你的手提電腦的程序,讓其幫你做好這些事情。它更改機(jī)票,預(yù)約好酒店并租了汽車。當(dāng)然你可以去很多個(gè)網(wǎng)站輪流更改那些,那會(huì)是痛苦的,但是記著你在一個(gè)網(wǎng)吧,你可以做更好的事。
(*“經(jīng)典”在這里形容“web服務(wù)”是矛盾修飾法。我們可以更改這個(gè)故事,比如是一個(gè)旅行銷售員。)
Web服務(wù)存在的缺陷是它不可以沿著你過去寫企業(yè)程序的方式進(jìn)行,因?yàn)槭聞?wù)和安全只是基本的加入你的公開的web中。對于Web沒有事務(wù)管理,而J2EE服務(wù)器中有。同樣沒有任何部分管理安全。所有這些問題集合起來就是你不可以知道誰或什么將訪問你的web 服務(wù)。這樣將web 服務(wù)暴露會(huì)令到服務(wù)于客戶端不需要緊密地聯(lián)系(例如要求客戶端和服務(wù)使用相同的編程語言)。
在某些方面,Web services允諾是具有一些特性,就像Jini中,通過一定程度上的動(dòng)態(tài)發(fā)現(xiàn)。事實(shí)上既難設(shè)計(jì)出來也難完成。但是這些情況每天都在改變。記著,這是互聯(lián)網(wǎng)時(shí)代。
Web服務(wù)架構(gòu)
這張圖片比以前的圖片更高層,所以這里包括了其他的所有成員包括了不同類型的stub(Web服務(wù)有他們自己的stub),更多借口和更多進(jìn)行XML處理的部分。
RMI驅(qū)動(dòng)的技術(shù)和Web服務(wù)最大的不同在于其他大都基于java方法調(diào)用。對stub的調(diào)用依然是java方法調(diào)用。當(dāng)然,stub建立socket和流,并用特定的協(xié)議來傳遞方法調(diào)用(通常是RMI-IIOP,另一個(gè)令人印象深刻的縮寫),當(dāng)時(shí)一旦其經(jīng)過服務(wù)所在的服務(wù)器后,就會(huì)變成普通的方法調(diào)用,調(diào)用遠(yuǎn)程服務(wù)對象。
在Web services中,利用SOAP協(xié)議以及XML來發(fā)送消息。SOAP就是消息的信封,消息和事實(shí)上客戶端要求服務(wù)器執(zhí)行的“方法”調(diào)用沒有區(qū)別。(雖然在我們談?wù)搄ava中的web services時(shí),其的確轉(zhuǎn)換乘真正的含有參數(shù)和返回值的java對象的方法調(diào)用,但我們在這里用泛義的“方法”。)
Web 服務(wù)中的大部分繁重的工作是在所有地方進(jìn)行的XML處理工作,而其解析XML是十分慢的。這意味著性能是個(gè)很大的問題(你可加上其他web服務(wù)的問題例如沒有事務(wù)支持,很少安全)。但是,XML最美之處在于其與平臺(tái),編程語言以及其他的東西無關(guān)。這僅僅是包含標(biāo)簽的文本。所以在web 服務(wù)中具有協(xié)同和整合所有東西的潛力。
你通過常規(guī)的java服務(wù)接口來暴露RMI,Jini和EJB服務(wù)。而你要通過叫WSDL(跟我讀:”wizdle”)的XML界面來暴露Web服務(wù)。WSDL描述服務(wù)并告訴客戶端去哪找到服務(wù)。但是WSDL如何暴露自己可以有很多種方法。
例如有一種叫做UDDI的用于Web services的注冊/查找服務(wù),這里你同樣可以公布WSDL。但是因?yàn)閣eb服務(wù)通常在內(nèi)部網(wǎng)進(jìn)行,UDDI并沒有很多大的用處,但是如果當(dāng)Web 服務(wù)走出那里,情況將有所變化。
所以Web服務(wù)和其他java 分布式技術(shù)很大的不同之處在于通過web服務(wù)技術(shù),客戶端不需要重新得到真正的對象。如果你得到WSDL,你也取得足夠的信息去建立你自己的SOAP消息,向WSDL描述的Web服務(wù)提一連串的問題。
記著,在Jini和EJB中,通常只有stub知道遠(yuǎn)程服務(wù)的IP地址和TCP端口。Java接口通常聲明方法,而不是服務(wù)的位置。但是通過WSDL,將會(huì)完全不同。在java中,WSDL更像一個(gè)java接口。WSDL不僅包括方法的說明(名字,參數(shù),返回值,等等),還包括網(wǎng)絡(luò)位置。
J2EE 1.4和Web服務(wù)
J2EE1.4將在2003年底發(fā)布(譯者注:文章寫得比較早,那時(shí)最新的版本是J2EE1.3)添加對Web服務(wù)支持,方便正在用J2EE并想將J2EE程序變成web服務(wù)端點(diǎn)(現(xiàn)在我們認(rèn)為真正的服務(wù)為端點(diǎn))的開發(fā)者。通過J2EE1.4,你將不需要寫WSDL的XML,更好的是你不需要將引入的XML消息(SOAP)變成java調(diào)用,反之亦然。你現(xiàn)在也可以做那些事情,通過JAXP(J2EE1.3的一部分)和JAX-RPC(已提供,但是在1.4未提供前現(xiàn)在并不是J2EE的一部分)API,但是通過J2EE1.4所有的東西都加入到系統(tǒng)中,開發(fā)工具會(huì)更無縫的結(jié)合他們成為各種各樣你自己的web-service相關(guān)API。
今日快照
好,讓我們來看看他們。Jini不再是唯一的專業(yè)名詞了,利用J2EE和Web services已經(jīng)應(yīng)用到很多領(lǐng)域了。J2EE的確包含事務(wù),安全和其他的東西,而Web 服務(wù)很大程度上依然在掙扎。會(huì)想起一個(gè)詞“浴血奮戰(zhàn)中”。但是Jini已經(jīng)在全球最大的銀行機(jī)構(gòu)甚至美國軍隊(duì)得到使用。
底線:對于巨型的企業(yè)級的程序,J2EE在市場上是十分流行的。Web服務(wù)是不成熟的但具有很大潛力,明年當(dāng)J2EE整合了Web服務(wù)時(shí)我們將會(huì)看到。但是Jini是更酷。畢竟這只是在雞尾酒會(huì)上的談話,而不是你下個(gè)幻燈片的演示。
作者簡介:
Kathy SierraSUN公司的專業(yè)訓(xùn)練師, 教SUN的講師如何講授最新的java技術(shù)她也是世界上最大的java社區(qū)網(wǎng)站javaranch.com.的創(chuàng)始人。
Bert Bates 是具有20年編程經(jīng)驗(yàn)的軟件開發(fā)人員,java講師, 是Sun即將推出的EJB考試 (Sun Certified Business Component Developer)的出題人員之一.
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
企業(yè)版JavaBean討論
J2EE企業(yè)級開發(fā)學(xué)習(xí)筆記(9)
漫談EJB(1)
Observer模式在J2EE中的實(shí)現(xiàn)
J2EE的客戶端
Java RMI與RPC,JMS的比較
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服