久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Jini,,J2EE和Web服務(wù)

 世事無絕對 2009-11-26
作者: Kathy Sierra 和Bert Bates, Head First Java, 2nd Edition的作者

翻譯:kelvincheng

寫于:06/15/2005


版權(quán)聲明:可以任意轉(zhuǎn)載,,轉(zhuǎn)載時請務(wù)必以超鏈接形式標明文章原始出處和作者信息及本聲明
原文地址:
http://www./pub/a/onjava/2003/08/27/cocktails.html
中文地址:
http://www./resource/article/43/43781_Jini_J2EE.html
關(guān)鍵詞: Jini J2EE Web

  

編輯說明:Kathy Sierra 和Bert Bates是O’Reilly的Head First系列的后臺智囊。他們第一次寫這篇文章是在2003年Head First Java發(fā)行的那時候,。這本書變得十分流行,,我們現(xiàn)在仍然收到訂單。如此多的訂單讓我們決定重新帶給讀者,,這就導(dǎo)致Head First Java,2nd Edition的發(fā)行,。所以如果第一次發(fā)行的時候你沒趕上,現(xiàn)在就讓Kathy和Bert告訴你如何與Java初學(xué)者交談,。

這些都是可以預(yù)測到的:當(dāng)你在一個宴會中,,喝著次等的馬提尼酒,不可避免的就會談到分布式編程,。怎么辦,?放松點,因為在這里我們會解決3種最有意思的分布式編程,,就在用完的餐巾上畫圖,,你可以用來提高你的 whuffie. (不知道 whuffie是什么? 讀讀 Richard Koman's interview with Cory Doctorow.)

但是首先,萬一你真的現(xiàn)在就在某個宴會上,,我們首先從幾個即使你不懂Java也可以使用的短語,。然后,對于那些確實知道一些Java技術(shù)的人,,我們會談得更深入一點,。

image

“什么是動態(tài)發(fā)現(xiàn)?你知道,,它的含義就是在網(wǎng)絡(luò)上,,盡管客戶端和服務(wù)事先對對方一無所知,但能動態(tài)地發(fā)現(xiàn)對方,。這所有都是基于IP廣播的,。”

“什么是自動診斷網(wǎng)絡(luò) (self-healing network) 呢,?它指Jini網(wǎng)絡(luò)總是能夠反映當(dāng)前所有可用的服務(wù)的狀態(tài)--就像這樣:‘OK,這個服務(wù)起來了,,那個服務(wù)當(dāng)?shù)袅恕瘺]有任何人的管理!”

當(dāng)然,,大多數(shù)路由器禁止了IP廣播,,所以你不準備在web上用Jini。但是Jini是為本地網(wǎng)絡(luò)的工作,,或者本地網(wǎng)絡(luò)的集合而設(shè)計的,,所以這并不是個大問題。

“J2EE最酷的東西是提供商獨立,你可以專心于你的商業(yè)邏輯,將那些重擔(dān)交給廠商,。你可以在你特殊的商業(yè)規(guī)則上工作,,把那些安全,事務(wù),,并行,,持久化,甚至網(wǎng)絡(luò)代碼實現(xiàn)的任務(wù)交給服務(wù)器,。而你只需要去學(xué)一個API,,你可以重新部署你的J2EE程序給所有廠商的與J2EE兼容的服務(wù)器。所以現(xiàn)在廠商必須改變以前那種將你鎖起來,,并且你必須乞求廠商添加新的功能以解決bugs的方式,。”

“Web服務(wù)中酷的東西是…嗯,,OK,也許現(xiàn)在的情況Web services沒有什么真正酷的東西,。但是會變的,就在不久的未來,,當(dāng)所有標準都提出,工具成熟了,,以及….”

“但是如果要說Web 服務(wù)酷,,這也許因為你可以采用你已有的商業(yè)程序,甚至舊的程序,,讓他們通過XML那樣的接口暴露在Web上,。客戶端通過可互操作的方式發(fā)送一個XML信息(通過一種叫SOAP的格式)給服務(wù),?!?br/>

“安全和事務(wù)是現(xiàn)在Web服務(wù)的兩個明顯的缺陷,這意味著所有人必須加入自己的解決方案,。在Web上沒有足夠的事務(wù)管理設(shè)置,,而你所擁有的唯一的安全是互動驗證 (mutual authentication) 的Https?!?br/>
“Jini和J2EE都是Java技術(shù),。通過J2EE,就像規(guī)格說明說的那樣:“哦,,你不需要擔(dān)心你這個小程序員去解決那些巨大的困難的東西,。廠商會考慮這些問題,而你可專注于自己的特殊領(lǐng)域的需要(比如,,如何賣出更多的婦女內(nèi)衣),。但是,通過Jini,就好像規(guī)格說明說的那樣:‘你必須靠自己,別指望其他人使用許多基礎(chǔ)設(shè)施來救你,。這是貧乏而又簡陋的,,寶貝,但你可以做最令人驚訝和體面的事情,。當(dāng)你在那時,,檢驗一下JavaSpaces?!?br/>

“Web服務(wù)不是針對于java的技術(shù),,但是java可以讓其更容易的使用,特別是如果你去使用J2EE 1.4,。不,你說的對,。J2EE 1.4還沒發(fā)布,但是會在今年年底發(fā)布,,你將在2004年初見到許多廠商支持,。”

(在我們繼續(xù)下去之前,,先提出一些免責(zé)聲明:首先,,如果你對于這篇文章的高級含義有任何問題,重新讀一下標題,。對于這些內(nèi)容我們有酒吧侍應(yīng)的牌照,,我們不會告訴你什么是錯的,但是你也不會試圖去了解整個故事,。每個主題都需要相應(yīng)的一本書(但如果我們不說出任意一本書來,,這是很可恨的。比如,,Head First EJB,,或是哪一本呢?)讓我們僅僅通過雞尾酒會的觀點來看這個問題并不是你想來操縱你的下個結(jié)構(gòu),。(我們知道你知道這些,,但對于那些可能會誤解這篇文章是篇嚴肅的技術(shù)論文的人,我感到有必要談?wù)勎覀兊腶**es).)[原文如此]

所以現(xiàn)在是時候進入下一個層次了,。我們將首先開始看看什么是服務(wù),,而且更重要的是如何向別人顯現(xiàn)你自己。換種說法,,你如何將你的服務(wù)告訴你潛在的客戶呢,?

image

通過Jini,J2EE,和Web service,目的是讓客戶去訪問服務(wù)。什么是服務(wù)呢,?你所能做的事就是將消息從一個軟件傳遞給另一軟件(也許包含人工指向,,也許也不包含),。你也許有一個為基因匹配進行大規(guī)模計算的服務(wù)?;蛘咭粋€玩簡陋的Go游戲的服務(wù),。或者一個讓你買演唱會門票的程序,?;蛘哳A(yù)定異國熱帶風(fēng)情的巡游?;蛘呱踔翆⒛愕奈淖謧鬟f給一臺高容量(high-volume)打印機,。換種說法,服務(wù)就是所有像軟件一樣開始但是結(jié)果并不一定留存在軟件中的東西,。

你也許有個服務(wù)來移動攝像機,,利用打印機打印,撥電話,。沒關(guān)系,。或者至少沒關(guān)系,。主要目標之一,,就像OO的任何情況下的目標一樣,盡可能減少耦合,,—此例中,,即客戶端和服務(wù)器端之間的耦合。換種說法就是我們要讓那些參與者(客戶端和服務(wù)端)盡可能地少了解對方,。

但是讓我們說說你有一個服務(wù)…現(xiàn)在怎么辦?客戶端如何找到你,?如果他們找到你,,他們怎么知道你的服務(wù)可以干什么?換種說法,,他們?nèi)绾沃浪麄冋{(diào)用你的服務(wù)的方法,?這樣,你必須將你自己暴露給客戶,,我們的3種技術(shù)在這方面稍有不同,。不考慮我們在討論Jini,J2EE,或者Web服務(wù),可是必須在某個地方有個接口。這個接口說明了你可以做的東西,。

服務(wù)接口

作為一個服務(wù)開發(fā)人員,,你必須告訴人們你的服務(wù)可以做什么?;蛘哒f,,你必須聲明你的服務(wù)的方法,。這包括聲明客戶端傳遞給你的方法什么(參數(shù))以及服務(wù)返回什么(返回類型)。

image

上面這個接口是為一個叫Advice的服務(wù),。它具有一個方法,,getAdvice()。你可以調(diào)用這個方法,,得到一個字符串,,里面包含極好的有用的隨機選擇的建議。(我們選擇不在我們假的小類似于UML的圖中顯示返回類型,。這是非常小的事),。

對于Jini和EJB(Enterprise JavaBeans---J2EE的核心和靈魂),接口通常是Remote,。一個Remote的接口通常意味著開發(fā)者寫一個基于java.rmi.Remote的擴展java接口,。耶,Remote所有方法(意思是Remote接口中的所有方法)必須聲明一個java.rmi.RemoteException的異常,。一個強制性的異常(checked exception),,告訴客戶端:“事情變得很糟糕,小心準備,?!?br/>
image

對于Web Services,接口被定義在一個WSDL中(讀作“wizdle”,與“fizdle”押韻)----一種特殊格式的XML文檔,。所以總括來說,,你可以在隨意的談話中說以下這段話:

“可以說,在Jini和EJB中,,你通過java接口暴露你自己,,但是在Web服務(wù)中,你通過XML接口暴露你自己,?!?/strong>

(準確地說,如果你是一個java開發(fā)者,,你通過寫一個java接口來創(chuàng)建WSDL,,按那個在你的開發(fā)工具中神奇的紅色按鈕,將你的java接口變成XML WSDL,。這就夠了,,像他們說的,這超過了一個雞尾酒會談話的范圍,。)

image

OK,,現(xiàn)在我們有了服務(wù),有了暴露我們服務(wù)的接口?,F(xiàn)在呢,?客戶端如何知道這個接口,?他們?nèi)绾握嬲〉眠@個接口,他們還需要和我們服務(wù)交流些什么呢,?這要看服務(wù)的類型,。這3種類型是不同的。你訪問Jini,J2EE和Web服務(wù)將有少許不同,,文章的其他部分將著重于一些細節(jié)和主要不同之處,。

首先,讓我們從一些Java的Remote Method Invocation(RMI)的背景開始,。這是大部分的java分布式技術(shù)的主干,,Jini和EJB都基于此。事實上,,自從所有分布式技術(shù)在概念上如RMI的技術(shù)上運行時,,你在這里了解的東西將幫助你弄清楚整個分布式的世界,Java或者非Java的,。

image

通過RMI,,你寫你的服務(wù)并將此變成為Remote對象。讓其成為Remote僅是小菜一碟---寫分布式接口,,創(chuàng)建Remote類來實現(xiàn)它,。

創(chuàng)建Remote接口
1.        擴展 java.rmi.Remote
2.        為每個方法聲明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.        實現(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,所以代碼對于雞尾酒會有點多,,因為在這都是初學(xué)者….)
所有東西的關(guān)鍵:The Stub

當(dāng)你已經(jīng)有了接口和類,,你通過RMI編譯器(rmic)運行你的類,RMI編譯器已在J2SE中(如果你已經(jīng)有javac,,你就有rmic了),。那個程序建立了stub這個你可以幾乎在所有現(xiàn)代分布式編程模型中發(fā)現(xiàn)的東西。Stub僅是客戶端的助手,,通過像服務(wù)那樣實現(xiàn)遠程接口來扮演遠程對象的角色,。但是事實上,Stub僅是一個取得方法調(diào)用,,打包,并通過網(wǎng)線傳遞給真正的遠程對象的小對象,?;蛘哒f, stub知道如何打電話回家并叫真正的服務(wù)去做真正的工作,。

Stub所有方法都是虛假的,。他們是方法,有一大堆代碼,,包括用于服務(wù)聯(lián)系的網(wǎng)絡(luò)和I/O內(nèi)容,。但是他們并不是真正的商業(yè)代碼,。所以對于Advice服務(wù), stub有g(shù)etAdvice()方法,,但是這個方法僅僅從客戶的請求傳遞給在服務(wù)器上真正的AdviceImplementation,。

那邊,客戶端假裝他在調(diào)用遠程對象,,但是我們知道由于遠程對象運行于不同的JVM堆中這并不真正發(fā)生,。

(是的,在服務(wù)器端依然有些東西接受來自客戶的Socket連接,,解包方法調(diào)用,,打包并裝載返回值等等。但是我們并不準備在這篇文章中談?wù)撨@些,。那是個更微不足道的過程,,因為你不需要擔(dān)心傳遞功能給客戶。所以在服務(wù)器上Stub的功能有同伴,,但是你并不需要擔(dān)心這個,。)

RMI基本結(jié)構(gòu)

籍由RMI,遠程對象是一個服務(wù),。

image

暴露RMI


如果你有個客戶端,,你想通過遠程服務(wù)(或者說遠程對象)做些東西,你必須有遠程服務(wù)的接口(在編譯時和運行時),,而且你必須有stub對象(運行時),。記住,是Stub真正知道如何傳遞你的方法調(diào)用給遠程對象(并傳遞回返回值),,所以你可不能沒有它,。很多時候,你將從服務(wù)開發(fā)者那得到接口和stub .class文件,。

但是有個更酷的方式運行時取得stub類而不需要在運行前取得,,那就是通過一個叫動態(tài)代碼下載(Dynamic code downloading)的進程。這是你在java中可以使用的最強大的東西之一,,而且也不難,。但是,你也可以以守舊的方式從開發(fā)者的Email中取得stub類文件,,或者從別人那里下載到你的電腦,。

查找服務(wù)(例如擁有stub,這樣你可以調(diào)服務(wù)中的商業(yè)方法)

在RMI中,,你通過RMI登記(附在J2SE中)查找到stub,。RMI登記就像一本小的電話簿,你找到名字,,然后就得到stub,。記得當(dāng)stub對象過來的時候是串行化的,。這意味著在其來到客戶端時要使其反串行化。同時為了讓其工作,,the stub類必須在當(dāng)前的classpath中或者可以用動態(tài)代碼下載來找到,。這是java基本知識---一個實例不能在沒有其類時反串行化。

image

發(fā)現(xiàn)查找服務(wù)(RMI Registry)

通過RMI,,你必須知道the stub在哪里,?你必須為RMI Registry知道IP地址和TCP端口號(同時也恰好是遠程對象/服務(wù)所在的服務(wù)器那里)。事實上我們大概并不一定要知道端口號,,因為有默認的端口號,,但是如果服務(wù)部署人員更改了,你則需要知道,??蛻舳酥蛔隽撕唵蔚膯涡械牟檎遥渺o態(tài)方法(java.rmi.Naming.lookup()),這時奇跡發(fā)生了,,它有了一個即時的反串行化的stub,。對象知道如何打電話回家了。

image

現(xiàn)在我們已經(jīng)注意RMI,,這部分將會更有意義,。Jini就像是Extreme RMI。我們這里用Extreme這個詞是指其運動含義,,而不是XP中的意思,。

動態(tài)發(fā)現(xiàn):服務(wù)和查找服務(wù)如何發(fā)現(xiàn)對方

這是普通的RMI與Jini差別最多的地方。在RMI中,,客戶端必須知道很多東西,,服務(wù)必須通過RMI Registry清楚地登記(用邏輯名稱),注冊必須在與服務(wù)的同個機器中,。

但是通過Jini,所有東西僅是在那兒,,在某處。沒有人知道除了接口外的其他東西,。這里有句話關(guān)于這個的,,我們發(fā)現(xiàn)這放在這個對話中的戰(zhàn)略時刻相當(dāng)有意義。

“通過Jini,,服務(wù)通常嘗試去發(fā)現(xiàn)查找服務(wù),,客戶端也通常發(fā)現(xiàn)查找服務(wù),而查找服務(wù)通常在讓服務(wù)和客戶端知道他們(查找服務(wù))就在這,。所有都是自動的?!?/strong>

image
image
image
image

雖然在Jini中你也可以將整個服務(wù)發(fā)送給客戶端本身,,而不是讓服務(wù)變成服務(wù)器上100%的遠程對象,,但是基本的Jini結(jié)構(gòu)采用RMI。當(dāng)客戶端要求服務(wù)的參考時,,將取得遠程對象的stub(如果服務(wù)被實現(xiàn)為一個遠程對象),,或者重新得到整個該死的服務(wù),在上面進行簡單的舊的本地調(diào)用,。事實上,,通過Jini,客戶端甚至可以一個混合體或者“智能代理”(公開說這句話會有特別的聲望)。--那樣,,一個非遠程java對象包含一個遠程對象的stub(就好像,,實例變量)。那樣,,客戶端直接對服務(wù)進行本地調(diào)用,,但是服務(wù)本身可能會將其跳轉(zhuǎn),讓遠程調(diào)用到其他地方,?!爸悄艽怼笨梢酝ㄟ^在客戶端做某些工作提高在客戶端和服務(wù)上的表現(xiàn)。


Jini架構(gòu)

Jini和其他所有分布式技術(shù)(普通的RMI,EJB和Web services)有另外一個主要不同點是Jini利用分布式租約幫助建立自愈網(wǎng)絡(luò),。如果Jini服務(wù)是遠程的,,例如,他給客戶端一個租約并說:“這是你的租約,。如果你不更新它,,我將假設(shè)你已經(jīng)離開,我將停止你在這里代表的任何資源,?!弊钚碌木W(wǎng)絡(luò)如何保持依賴于這些租約的時長。例如,,一個兩小時的租約將意味著客戶端可能斷開將近兩個小時,,而你(服務(wù))卻不知道。多么浪費,!另一方面,,一個一秒鐘的租約意味著最近的網(wǎng)絡(luò),但是所有人花費其所有的周期和帶寬去更新租約,!所以那是筆交易,,這依賴于服務(wù)的類型以及其他服務(wù)質(zhì)量問題。

自愈型網(wǎng)絡(luò)另一個很酷的東西是:既然Jini查找服務(wù)是一個Jini服務(wù),,查找服務(wù)給Jini服務(wù)一個租約,。所以在這種情況下,Jini服務(wù)對于Jini查找服務(wù)是個客戶。那樣,,當(dāng)一個普通客戶端(或者說,,一個本身不是Jini服務(wù)的客戶端,而是想用Jini服務(wù)的程序)來查找一個服務(wù),,比如打印機,,如果服務(wù)沒有通過查找服務(wù)更新客戶端將不視其為“可用”。此外,,租約時間越短,,就越是最近的網(wǎng)絡(luò)的寫照,越不可能會令到一個客戶選擇一個不再可用的服務(wù),。

image
image


Jini暴露

如果你是一個客戶端,,你想從Jini服務(wù)中取得某些東西,你必須有對于這個服務(wù)的接口,。不想RMI,,Jini具有更靈活性,因為你除了接口外不需要知道其他東西,。你并不需要知道注冊的名字或者Service的位置,。只要你知道接口以及你在一個可以發(fā)現(xiàn)查找服務(wù)的網(wǎng)絡(luò),你就可以工作了,。


今天,,幸運的是開發(fā)者給你接口。但是有少量的接口到處漂浮,,變成某種標準,,包括Bill Venner的名聲不好的ServiceUI.

發(fā)現(xiàn)服務(wù)類

不像RMI,在Jini中你將不可以選擇是否使用動態(tài)代碼下載,。你幾乎被迫使用它,。(你也可以不使用它,但是這違背了Jini的本來目的,。)通過Jini,,你不需要知道網(wǎng)絡(luò)中內(nèi)容的位置,你也不需要知道誰建立這個服務(wù),。記著,,所有你要的只是接口,而且在很多情況下,,你需要擔(dān)心的你需要去實現(xiàn)服務(wù)的接口(也許是個stub,,也許是真正的服務(wù),或者集合體…),。

記著,,在RMI中,你在客戶端中需要的類通常是Stub類,而不是服務(wù)本身,。在Jini中,,如果服務(wù)被實現(xiàn)為遠程對象,或者是真實的服務(wù),,你調(diào)用方法的應(yīng)該在stub中---例如,一個實現(xiàn)了接口并真正工作的類就在客戶端本地,。

查找服務(wù)

通過Jini,,你使用Jini 查找服務(wù)(lookup service),而不是RMI Registry,。Jini查找服務(wù)更靈活和強大,,而且它可以像服務(wù)對象那樣提供信息給你,哪個,,是或者不是遠程對象stub,,這依賴于服務(wù)是否是個服務(wù)器上的遠程對象或者是轉(zhuǎn)載在客戶端上的非遠程對象。最好的東西是你不需要知道查找服務(wù)在哪,!在RMI中,,你必須知道遠程服務(wù)的IP地址和端口號來找到服務(wù)stub所在的RMI Registry。而在Jini中,,你僅知道大概在某處,,在那兒的網(wǎng)絡(luò)上有不少于一個的查找服務(wù),通過IP廣播達到,。

這就是Jini,。但是Jini是個瘋狂的邊緣,這里沒有人知道任何東西,,而你就在你自己的模型上,,J2EE正好是相反的東西。

image

J2EE的主要思想就是服務(wù)器(通過容器)給你一堆額外的服務(wù),,否則這些服務(wù)你也許要自己寫,,或者將不同的部分拼湊起來,或者從私人廠商那購買,。我們現(xiàn)在談?wù)摰氖蔷扌偷姆?wù),,像事務(wù)管理,并行管理,,安全,,資源/生命周期管理,查找服務(wù),,持久化,,信息服務(wù)等等。

那樣,你開始專注于你的自己的商業(yè)規(guī)則,,而不是重新去做那些繁瑣的重復(fù)的事情,。其他應(yīng)用服務(wù)器已經(jīng)存在了一段時間了---如CICS和TUXEDO都是經(jīng)典的例子。但是在那種環(huán)境下你必須學(xué)私有的API,,你被廠商鎖住了,。J2EE是企業(yè)級商業(yè)中間層的標準,所以你僅僅需要學(xué)一個API,,無需考慮你要選擇的服務(wù)器,。其中最好的就是你可以部署你的應(yīng)用到任何符合J2EE標準的服務(wù)器,所以你可以對廠商的枷鎖說拜拜了,。

當(dāng)然,,事實上由于各種原因,將J2EE程序部署在不同的服務(wù)器上并不容易,。但是你可以,。而且如果你有足夠的錢換掉你現(xiàn)在的提供商,知道這個不更好,?更好的是,,讓廠商知道你可以這樣做。

首先,,澄清一下J2EE和EJB的不同:J2EE是一個為可運行EJB的服務(wù)器設(shè)立的規(guī)范,。但是J2EE服務(wù)器同樣要支持servlets和JSP。你可以認為J2EE就像一個整合的服務(wù)器—將servlet和支持JSP的Web服務(wù)器以及EJB服務(wù)器整合在一起的服務(wù)器,。在J2EE領(lǐng)域,,我們叫它子服務(wù)容器。所以我們在J2EE服務(wù)器中擁有Web容器和EJB容器,。因為beans比servlets和JSP更吸引人,,我們在這里專注于EJB方面。同時在EJB的世界,,服務(wù)就是bean,。

EJB有樣很酷的東西就是基于組件的開發(fā)模型。你建立可重用組件,,這些組件是可以在部署時定制而不需要改動java代碼,。組件比java類更易用,所以他是下一個層次的重用,。你利用XML文件來部署你的組件(例如beans),,而這些文件說明服務(wù)器應(yīng)該如何處理bean,所以你可以配置安全,事務(wù),,資源使用等等,,都聲明在XML文件中,,你只需要在開發(fā)工具中按幾個按鈕即可。(如果你真的想,,你當(dāng)然可以直接編寫XML文件,。但是現(xiàn)在的工具十分好,而你并不需要去做那些工作,。)

J2EE架構(gòu)

J2EE和普通RMI一個很大不同之處就是服務(wù)器必須介入客戶的調(diào)用和服務(wù)(例如bean)的被調(diào)用中,。如果客戶端遠程調(diào)用已開放的bean方法,服務(wù)器會介入并讓其隱蔽的過多的bean與客戶端直接聯(lián)系,。例如,,假如客戶端扮演特定的顧客調(diào)用bean中的getAddress()方法。首先,,服務(wù)器必須驗證客戶端是否經(jīng)授權(quán)去調(diào)用這個方法,但是假設(shè)客戶通過了安全檢查,,現(xiàn)在服務(wù)器必須去做其他東西讓bean準備好去接受調(diào)用,。如果bean返回客戶的地址,比方bean會重新去數(shù)據(jù)庫記錄中取得客戶的資料,。這需要變成事務(wù)的一部分,,而其他客戶也許準備好使用這個客戶,還有….

J2EE的解決方案是讓bean成為非遠程對象,被遠程對象保護,。所以即使bean真的是服務(wù)(或者說,,這里含有客戶想調(diào)用的商業(yè)邏輯服務(wù)方法),而bean在RMI方式中并非是遠程的,。但是客戶依然和RMI副本以及遠程對象相互作用,;就像和EJB相互作用那樣,遠程對象更像是bean的保鏢,。遠程對象(在J2EE中叫做EJB對象)接受客戶端遠程調(diào)用(例如,,客戶端在stub上的調(diào)用),并同時讓服務(wù)器加入來決定如何,,何時和調(diào)用是否到達bean,。

image

J2EE暴露

通過EJB,在RMI規(guī)劃圖(除了服務(wù)外)中加入另一層,。EJBObject是遠程對象,,但不像RMI中,EJBObject并不是個服務(wù),。所以那樣現(xiàn)在這里對于服務(wù)有兩個幫手,,而不像普通的RMI那樣子有一個(stub)。你的服務(wù)接口依然是遠程接口,,而不是直接實現(xiàn)java.rmi.Remote,,你的服務(wù)接口實現(xiàn)EJBObject---一個本身擴展自java.rmi.Remote的接口,。盡管bean不含有相同的方法,注意bean如何不擴展服務(wù)接口(Advice),。(不要過于拘謹擔(dān)心,,絕大多數(shù)注重EJB的開發(fā)工具確認bean和服務(wù)接口會匹配。)

image

找尋服務(wù)接口

通過J2EE,,你通常與客戶端開發(fā)者同在一個企業(yè)工作,,則你可發(fā)Email給他接口,或者你可以在內(nèi)部的知識庫中公布,。無論如何,,重要的是,就像RMI和Jini,,客戶端必須在編譯時有此接口,。

同樣,對stub類 ,,你可以選擇提前給客戶端或者用動態(tài)代碼下載,。但是這種情況下動態(tài)代碼下載依賴于你特定的J2EE服務(wù)器,也許不可行,,所以你也許會被困于自行將stub類傳遞給客戶端的情況,。大多數(shù)J2EE服務(wù)器為你部署bean準備了小而精的客戶JAR。

找到服務(wù)
警告:我們在這節(jié)擴展了雞尾酒會知識的限制,,所以這段人們就會說:”哇噢,,在你寫到這之前我都跟得上你。,。,。”這不是我的錯,,是我們的,。所以這里如果你想掠過,,你可以直接跳入Web服務(wù),,別人也不會知道。盡管如此,,如果你是單身而且想找對象,,你若想要到對方的號碼,你就要注意這部分啦,。

這與RMI的工作很像,,除了查找服務(wù)現(xiàn)在是JNDI而不是RMI Registry或者Jini查找服務(wù)。JNDI是一個工作在名字和目錄服務(wù)(Naming and Directory services)范圍中的接口,,需要J2EE支持,??蛻舳嗽赽ean的邏輯名上查找并取得個stub,就像RMI中,。

這里有些東西我們忘記談到了,。

在EJB中,客戶端不可直接要求JNDI取得遠程對象(the EJBObject)的stub,?;蛘哒f,客戶端不可通過JNDI的服務(wù)方法取得stub,。在JNDI中,客戶只能取得bean的Home,。Home僅是bean的工廠;其生命的主要目的管理對EJBObjects的引用,。或者說,,Home給你EJBObject的stub---你可以藉此調(diào)用服務(wù)方法。但是Home本身是遠程對象,,所以當(dāng)客戶想調(diào)用bean中的服務(wù)方法時,必須跳過許多額外的步驟,,而直接通過RMI則不需要,。
1.        進行JNDI對bean的邏輯名(不管bean部署者如何稱呼它)進行查找。
2.        客戶取得遠程對象的stub,。
3.        客戶調(diào)用Homestub的遠程方法,請求服務(wù)本身的stub,。他不可能引用真正服務(wù)――the bean――但是客戶端可以有最接近的方式:bean的保衛(wèi)的副本,the EJBObject――實現(xiàn)bean服務(wù)接口的遠程對象。
image
image


對于整個EJB規(guī)劃有所放棄――從EJB2.0(最新版本J2EE的一部分)開始不是所有的客戶接口必須遠程,?;蛘哒f,the Home和 EJBObject對象可以在客戶端而不是RMI遠程對象,。這意味著客戶和bean運行在相同的JVM中,!覺得太過于分布式了,是嗎,?不是的,,因為你失去了最有價值的東西――位置獨立,。如果你將客戶端和bean放在一起,,的確可以由于減少了副本變成遠程對象的過程,,取得性能提高,但是你放棄了將你所謂的分布式程序的某些部分移到你的網(wǎng)絡(luò)的其他節(jié)點的機會,。這是強迫的,,甚至是命令式的原因來用本地Home和EJBObjects,但是必須通過持久實體bean實現(xiàn),,所以你僅僅在十分特別的情況下考慮它,。眼下,總之當(dāng)你是一位J2EE設(shè)計者,,你可以在你的休息時間考慮其細微之處,。)

現(xiàn)在我們已經(jīng)領(lǐng)會到RMI,Jini和J2EE,,我們都認為他們是比Web Services更好,,整潔,適量,,新鮮的技術(shù),。事實上我們并不過多的討論Web服務(wù),因為在Web服務(wù)領(lǐng)域粗糙且不清晰,。但我們也會討論下,,讓你度過喝東西的時間。

image

Java RMI,,Jini,,J2EE和EJB都是完全的java技術(shù),而Web服務(wù)不是,。Web服務(wù)取得你現(xiàn)有的程序(即使有些種類是建立針對于部署為Web Service的新建的程序,,但是比較少。),,將他們暴露在Web上,。大部分時候,是在企業(yè)內(nèi)部網(wǎng)中,。即使Amazon和Google提供Web services讓你可往你的站點添加Google或者Amazon的功能,,但現(xiàn)在很少有機會你可以找到在網(wǎng)絡(luò)上供公共訪問的Web服務(wù)。我們都認為那是特殊情況,。

今天,,大多數(shù)Web服務(wù)的案例是用于他們自己商業(yè)程序間的綜合。但是理想的情況是以B2B以及C2B(Business-to-Business and Consumer-to-Business)的方式有大量的WebService共同工作,,而不需要了解關(guān)于除了商業(yè)領(lǐng)域外其他程序的預(yù)先知識,。

例如,,最經(jīng)典*的例子是:你由于成為最新的銷售冠軍進行多個城市的巡回演講,“這不僅僅是移動”但是你要去的下一個站電量停電,,而現(xiàn)在你的整個計劃都是都要改變,。所以你使用你的手提電腦的程序,讓其幫你做好這些事情,。它更改機票,,預(yù)約好酒店并租了汽車。當(dāng)然你可以去很多個網(wǎng)站輪流更改那些,,那會是痛苦的,,但是記著你在一個網(wǎng)吧,你可以做更好的事,。

(*“經(jīng)典”在這里形容“web服務(wù)”是矛盾修飾法,。我們可以更改這個故事,比如是一個旅行銷售員,。)

Web服務(wù)存在的缺陷是它不可以沿著你過去寫企業(yè)程序的方式進行,,因為事務(wù)和安全只是基本的加入你的公開的web中。對于Web沒有事務(wù)管理,,而J2EE服務(wù)器中有,。同樣沒有任何部分管理安全。所有這些問題集合起來就是你不可以知道誰或什么將訪問你的web 服務(wù),。這樣將web 服務(wù)暴露會令到服務(wù)于客戶端不需要緊密地聯(lián)系(例如要求客戶端和服務(wù)使用相同的編程語言),。

在某些方面,Web services允諾是具有一些特性,,就像Jini中,,通過一定程度上的動態(tài)發(fā)現(xiàn),。事實上既難設(shè)計出來也難完成,。但是這些情況每天都在改變。記著,,這是互聯(lián)網(wǎng)時代,。

Web服務(wù)架構(gòu)

image

這張圖片比以前的圖片更高層,所以這里包括了其他的所有成員包括了不同類型的stub(Web服務(wù)有他們自己的stub),,更多借口和更多進行XML處理的部分,。

RMI驅(qū)動的技術(shù)和Web服務(wù)最大的不同在于其他大都基于java方法調(diào)用。對stub的調(diào)用依然是java方法調(diào)用,。當(dāng)然,,stub建立socket和流,并用特定的協(xié)議來傳遞方法調(diào)用(通常是RMI-IIOP,,另一個令人印象深刻的縮寫),,當(dāng)時一旦其經(jīng)過服務(wù)所在的服務(wù)器后,,就會變成普通的方法調(diào)用,調(diào)用遠程服務(wù)對象,。

在Web services中,,利用SOAP協(xié)議以及XML來發(fā)送消息。SOAP就是消息的信封,,消息和事實上客戶端要求服務(wù)器執(zhí)行的“方法”調(diào)用沒有區(qū)別,。(雖然在我們談?wù)搄ava中的web services時,其的確轉(zhuǎn)換乘真正的含有參數(shù)和返回值的java對象的方法調(diào)用,,但我們在這里用泛義的“方法”,。)

Web 服務(wù)中的大部分繁重的工作是在所有地方進行的XML處理工作,而其解析XML是十分慢的,。這意味著性能是個很大的問題(你可加上其他web服務(wù)的問題例如沒有事務(wù)支持,,很少安全)。但是,,XML最美之處在于其與平臺,,編程語言以及其他的東西無關(guān)。這僅僅是包含標簽的文本,。所以在web 服務(wù)中具有協(xié)同和整合所有東西的潛力,。

你通過常規(guī)的java服務(wù)接口來暴露RMI,Jini和EJB服務(wù)。而你要通過叫WSDL(跟我讀:”wizdle”)的XML界面來暴露Web服務(wù),。WSDL描述服務(wù)并告訴客戶端去哪找到服務(wù),。但是WSDL如何暴露自己可以有很多種方法。

例如有一種叫做UDDI的用于Web services的注冊/查找服務(wù),,這里你同樣可以公布WSDL,。但是因為web服務(wù)通常在內(nèi)部網(wǎng)進行,UDDI并沒有很多大的用處,,但是如果當(dāng)Web 服務(wù)走出那里,,情況將有所變化。

所以Web服務(wù)和其他java 分布式技術(shù)很大的不同之處在于通過web服務(wù)技術(shù),,客戶端不需要重新得到真正的對象,。如果你得到WSDL,你也取得足夠的信息去建立你自己的SOAP消息,,向WSDL描述的Web服務(wù)提一連串的問題,。

記著,在Jini和EJB中,,通常只有stub知道遠程服務(wù)的IP地址和TCP端口,。Java接口通常聲明方法,而不是服務(wù)的位置。但是通過WSDL,,將會完全不同,。在java中,WSDL更像一個java接口,。WSDL不僅包括方法的說明(名字,,參數(shù),返回值,,等等),,還包括網(wǎng)絡(luò)位置。

J2EE 1.4和Web服務(wù)

J2EE1.4將在2003年底發(fā)布(譯者注:文章寫得比較早,,那時最新的版本是J2EE1.3)添加對Web服務(wù)支持,,方便正在用J2EE并想將J2EE程序變成web服務(wù)端點(現(xiàn)在我們認為真正的服務(wù)為端點)的開發(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ā)工具會更無縫的結(jié)合他們成為各種各樣你自己的web-service相關(guān)API,。

今日快照

好,讓我們來看看他們,。Jini不再是唯一的專業(yè)名詞了,,利用J2EE和Web services已經(jīng)應(yīng)用到很多領(lǐng)域了。J2EE的確包含事務(wù),,安全和其他的東西,,而Web 服務(wù)很大程度上依然在掙扎。會想起一個詞“浴血奮戰(zhàn)中”,。但是Jini已經(jīng)在全球最大的銀行機構(gòu)甚至美國軍隊得到使用,。

底線:對于巨型的企業(yè)級的程序,J2EE在市場上是十分流行的,。Web服務(wù)是不成熟的但具有很大潛力,,明年當(dāng)J2EE整合了Web服務(wù)時我們將會看到,。但是Jini是更酷,。畢竟這只是在雞尾酒會上的談話,而不是你下個幻燈片的演示,。

作者簡介:
Kathy SierraSUN公司的專業(yè)訓(xùn)練師, 教SUN的講師如何講授最新的java技術(shù)她也是世界上最大的java社區(qū)網(wǎng)站javaranch.com.的創(chuàng)始人,。
Bert Bates 是具有20年編程經(jīng)驗的軟件開發(fā)人員,java講師, 是Sun即將推出的EJB考試 (Sun Certified Business Component Developer)的出題人員之一.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多