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

分享

漫談EJB(1)

 Ding_GY 2010-05-30
本文面向的觀眾是對(duì)J2EE技巧有愛(ài)好的進(jìn)門(mén)者,。

Java語(yǔ)言

          Java語(yǔ)言最早被稱(chēng)為Oak,,它是為了實(shí)現(xiàn)嵌進(jìn)式的消費(fèi)類(lèi)電子產(chǎn)品利用而產(chǎn)生的,,它的作者是James Gosling,。Ed Frank, Patrick Naughton, Jonathan Payne, Chris Warth在隨后的幾年時(shí)間中為Java語(yǔ)言加進(jìn)了大批的特征,并把Java語(yǔ)言的目標(biāo)做了一個(gè)重新的定位,,定位于合適Internet的語(yǔ)言,。

          Java語(yǔ)言是一種多用處的語(yǔ)言、并發(fā)的語(yǔ)言,、以類(lèi)為基礎(chǔ),,面向對(duì)象的語(yǔ)言。它的設(shè)計(jì)盡可能的做到和把持系統(tǒng)是無(wú)關(guān)的,,也就是Java所宣傳的那句話:“一次編寫(xiě),到處運(yùn)行,?!盝ava的設(shè)計(jì)參考了C和C++語(yǔ)言,因此熟悉C和C++的程序員對(duì)Java語(yǔ)言上手很快,,而Java設(shè)計(jì)的原則是能夠利用Java語(yǔ)言快捷的編寫(xiě)利用,,所以我們可以創(chuàng)造,在Java語(yǔ)言中,,并沒(méi)有那些C和C++中的復(fù)雜的機(jī)制,。最明顯的就是C中被大批應(yīng)用的指針,由于它的隨便性,,被Java以引用來(lái)代替了,。而C++中的把持符重載、模板,、泛型的特征也由于應(yīng)用比較復(fù)雜,,Java也不予采用。但是目前Java仍然不斷的推出新的特征,,以滿(mǎn)足利用的發(fā)展,。例如在新推出的JDK1.4中,Java語(yǔ)言就能夠支撐Assertment機(jī)制和Perl語(yǔ)言中最有用的正則表達(dá)式機(jī)制,。

  Java語(yǔ)言重要由以下五種元素組成:標(biāo)識(shí)符,、要害字、文字,、運(yùn)算符和分隔符,。這五種元素有著不同的語(yǔ)法含義和組成規(guī)矩,它們互相配合,,共同完成Java語(yǔ)言的語(yǔ)意表達(dá),。

1:標(biāo)識(shí)符。變量,,類(lèi)和方法都需要必定的名稱(chēng),,我們將這種名稱(chēng)叫做標(biāo)識(shí)符,。

2:要害字。要害字是Java語(yǔ)言本身應(yīng)用的標(biāo)識(shí)符,,它有其特定的語(yǔ)法含義,。所有的Java要害字將不能被用作標(biāo)識(shí)符。

3:數(shù)據(jù)類(lèi)型,。Java有著不同的數(shù)據(jù)類(lèi)型,。比較值得一提的是字符串?dāng)?shù)據(jù)類(lèi)型,字符串?dāng)?shù)據(jù)類(lèi)型是用一對(duì)雙引號(hào)括起來(lái)的字符序列,,字符串?dāng)?shù)據(jù)實(shí)際上是由String類(lèi)所實(shí)現(xiàn),,而不是C語(yǔ)言中所用的字符數(shù)組。每一個(gè)字符串?dāng)?shù)據(jù)將產(chǎn)生一個(gè)String類(lèi)的新的實(shí)例,,用戶(hù)不必對(duì)字符串與類(lèi)這個(gè)概念產(chǎn)生關(guān)系而感到擔(dān)心,,由于類(lèi)的特征,你不必?fù)?dān)心如何往實(shí)現(xiàn)它們,,它們會(huì)自己照顧好自己,,需要闡明的是字符串在Java里作為類(lèi)只是出于安全的考慮。

4:運(yùn)算符,。任何語(yǔ)言都有自己的運(yùn)算符,,Java語(yǔ)言也不例外,如+,、-,、*、/等都是運(yùn)算符,,運(yùn)算符的作用是與必定的運(yùn)算數(shù)據(jù)組成表達(dá)式來(lái)完成相應(yīng)的運(yùn)算,。對(duì)不同的數(shù)據(jù)類(lèi)型,有著不同的運(yùn)算符,。

5:分隔符,。分隔符用來(lái)使編譯器確認(rèn)代碼在何處分隔?!?’‘:’都是Java語(yǔ)言的分隔符,。

        學(xué)習(xí) Java 語(yǔ)言很簡(jiǎn)略,畢竟 Java 語(yǔ)言也只包含五十多個(gè)要害詞(keyword)與幾十個(gè)算符(operator),,再加上 Java 語(yǔ)法(syntax)也很簡(jiǎn)略,,所以一般人可以很快就學(xué)會(huì) Java 語(yǔ)言。危險(xiǎn)的是,,很多人認(rèn)為已經(jīng)完整掌控 Java 語(yǔ)言,,但實(shí)在對(duì)于內(nèi)部的運(yùn)作機(jī)制仍不能把握,這些盲點(diǎn)有時(shí)候會(huì)讓你無(wú)法完整掌控 Java 語(yǔ)言,??朔@些盲點(diǎn)的方法是看「The Java Language Specification, 2nd Ed.」(沒(méi)有中文版)來(lái)徹底弄懂 Java 程序語(yǔ)言,,并看「Inside the Java Virtual Machine, 2nd Ed.」來(lái)徹底把握 Java 虛擬機(jī)器的運(yùn)作方法。學(xué)會(huì)了語(yǔ)言,,并不代表就可以設(shè)計(jì)出好的對(duì)象導(dǎo)向系統(tǒng)架構(gòu),。想要成為對(duì)象導(dǎo)向的專(zhuān)家,往往需要:(1) 多看相干的書(shū),,特別是 Design Pattern 和 Refactoring 的書(shū),。(2) 多觀摩別人的程序(例如 Java API 的 design 與 implementation)(3) 多寫(xiě)程序。學(xué)會(huì) Java 語(yǔ)言之后,,還需要學(xué)會(huì)一些 API 才干寫(xiě)出有用的程序,。Java 的 API 非常多,必須方案好一個(gè)學(xué)習(xí)路徑,,才不會(huì)在浩瀚的 API 大海中迷失,。必備的 API 包含了:IO、New IO,、Collection Framework,、Network,、RMI,、JAXP... 等。至于其它的 API,,就看你的需求而定,,大致上分成:

* GUI 類(lèi):JavaBean -> Swing -> JavaHelp -> Java2D -> Image IO -> JAI -> Java 3D ...
* Enterprise 類(lèi):JDBC -> JDO -> Servlet -> JSP -> EJB -> JMS -> JTA/JTS...
* J2ME 類(lèi)(這一類(lèi)不是我的專(zhuān)長(zhǎng),無(wú)法供給學(xué)習(xí)次序建議)

        Java語(yǔ)言通常都是根據(jù)Java虛擬機(jī)規(guī)范(The Java Virtual Machine Specification)中的定義,,編譯為字節(jié)碼指令集和二進(jìn)制格式,。因此我們接下來(lái)就討論Java虛擬機(jī)(JVM)

JVM

        我們已經(jīng)談過(guò)Java語(yǔ)言的語(yǔ)法類(lèi)似于C和C++,但是摒棄了C和C++中復(fù)雜,、困惑和不安全的特征,。Java語(yǔ)言最早是用來(lái)構(gòu)建消費(fèi)類(lèi)網(wǎng)絡(luò)設(shè)備的軟件的,因此它要支撐多主機(jī)的架構(gòu),,并請(qǐng)求能夠供給安全的軟件組件,。為了滿(mǎn)足這些需求,編譯好的代碼就必須能夠通過(guò)網(wǎng)絡(luò)來(lái)流傳,,能夠在任何客戶(hù)端上運(yùn)行,,同時(shí)還要保證客戶(hù)端是足夠安全的。

      Java虛擬機(jī)是Java和Java 2 平臺(tái)的基石,。它能夠保證Java語(yǔ)言和硬件,、把持系統(tǒng)無(wú)關(guān),保證編譯后的代碼最小,,并掩護(hù)用戶(hù)不受惡意程序的攻擊,。Java虛擬機(jī)到底是什么呢,。實(shí)在它就是一臺(tái)不實(shí)際存在的盤(pán)算機(jī)。和真實(shí)的盤(pán)算機(jī)類(lèi)似,,它也有自己的指令集,,并可以在運(yùn)行環(huán)境中分配內(nèi)存區(qū)域。應(yīng)用虛擬機(jī)機(jī)制來(lái)實(shí)現(xiàn)編程語(yǔ)言并不是Java的創(chuàng)舉,,這已經(jīng)是非常廣泛的做法了,,最著名的許你就莫過(guò)于UCSD Pascal的P-Code機(jī)。

        只要瀏覽器檢測(cè)到目前所處理的Web文件內(nèi)容含有一個(gè)Java Applet,,瀏覽器將會(huì)為這個(gè)Java小程序另外開(kāi)一個(gè)JVM,,履行這個(gè)Java利用小程序。在JVM中履行的Java小程序可以得到充分安全的掩護(hù),。如同我們上面所說(shuō),,JVM是一個(gè)自給自足的作業(yè)環(huán)境,就像是一臺(tái)獨(dú)立的盤(pán)算機(jī)一樣,。例如,,在JVM運(yùn)作的Applet,無(wú)法存取主機(jī)把持系統(tǒng),。優(yōu)點(diǎn)是:

1. 系統(tǒng)中立,。Java利用程序可以在任何JVM中運(yùn)作,不論該系統(tǒng)應(yīng)用何種硬件,、軟件,。

2. 安全。正因JVM跟把持系統(tǒng)沒(méi)有任何接觸,,Java程序很難侵害到其它檔案或利用程序,。

         毛病是,由于在JVM運(yùn)作的程序獨(dú)立在把持系統(tǒng)之外,,也就無(wú)法享受把持系統(tǒng)各項(xiàng)特別功效,。

         Java技巧之所以在今天得到了如此廣闊的利用,其中它的安全性是不能不提的,。不同于其它技巧(例如Microsoft的ActiveX)中安全性作為附加設(shè)計(jì)和補(bǔ)丁,,Java從設(shè)計(jì)之初便考慮到了安全性。因此Java的安全性是在語(yǔ)言層次實(shí)現(xiàn)的,。Java的安全性由下列三個(gè)方面保證:

  1,、 語(yǔ)言特征(包含數(shù)組的邊界檢查、類(lèi)型轉(zhuǎn)換,、取消指針型變量),。

  2、 資源訪問(wèn)把持(包含本地文件系統(tǒng)訪問(wèn),、Socket連接訪問(wèn)),。

  3,、 代碼數(shù)字簽名(通過(guò)數(shù)字簽名來(lái)確認(rèn)代碼源以及代碼是否完整)。

  Java的源代碼是先編譯成為一種字節(jié)碼的中間代碼,,存放這種代碼的文件就是.class的文件,。真正履行的時(shí)候是將class文件裝載到JVM(虛擬機(jī))中,然后由JVM解釋履行的,。所以數(shù)組的高低界檢查及正當(dāng)?shù)念?lèi)型轉(zhuǎn)換是通過(guò)JVM得到保證的,。Java通過(guò)一個(gè)類(lèi)裝載器類(lèi)(ClassLoader)將虛擬機(jī)代碼文件(即class文件)裝載到JVM中,當(dāng)完成裝載后,,一個(gè)被稱(chēng)做安全治理器(SecurityManager)的類(lèi)開(kāi)端運(yùn)行,,例如當(dāng)一個(gè)Applet的class文件被缺省的類(lèi)裝載器裝載到JVM中后,JVM會(huì)立即為它裝載一個(gè)SecurityManager的子類(lèi)AppletSecurity,,由這個(gè)治理器來(lái)驗(yàn)證把持,。代碼的所有動(dòng)作(例如文件讀寫(xiě))都要先經(jīng)過(guò)驗(yàn)證,只有被該安全治理器吸收的動(dòng)作才干完成,,否則就會(huì)拋出SecurityException異常,。

  對(duì)于JDK1.0,權(quán)限被籠統(tǒng)的劃分為兩大塊,。一是擁有所有的權(quán)限,,一個(gè)是僅擁有"沙箱"(sandBox)權(quán)限,這也是普通的Applet所擁有的權(quán)限,。這時(shí)本地文件讀寫(xiě)或是與源主機(jī)(Orignal Server)以外的主機(jī)連接都是被禁止的,。這種劃分的最大標(biāo)題就是缺乏機(jī)動(dòng)性,。例如我們??匆粋€(gè)Applet在用戶(hù)信任的情況下能夠?qū)Ρ镜匚募到y(tǒng)的某個(gè)目錄進(jìn)行讀寫(xiě),但并不要通過(guò)Socket與其它主機(jī)連接,。這是JDK1.0的權(quán)限劃分就不能達(dá)到請(qǐng)求,。JDK1.1后改良了權(quán)限的劃分,引進(jìn)了權(quán)限集(PermissionSet)的概念,。

        由于我們的文章并不是討論JVM,,因此,我們只是對(duì)JVM做一個(gè)簡(jiǎn)略的先容,。假如需要具體懂得的,,可以參考『The JavaTM TMVirtual Machine Specification』。

客觀的看待Java

        相對(duì)于其他編程語(yǔ)音,,Java有一個(gè)無(wú)庸置疑的優(yōu)點(diǎn):用戶(hù)以及編譯器第一次不必懂得天生可履行代碼的特定CPU細(xì)節(jié),。Java引進(jìn)了一個(gè)編譯代碼中間層,叫做字節(jié)代碼,,并應(yīng)用一個(gè)虛擬抽象的機(jī)器,,而不是一個(gè)真實(shí)的機(jī)器,。當(dāng)Java編譯器結(jié)束了一個(gè)源文件的編譯后,你所得到的不是可以立即在一個(gè)給定平臺(tái)上運(yùn)行的代碼,,而是可以在任何真實(shí)的平臺(tái)上運(yùn)行的字節(jié)代碼,,唯一的條件就是這個(gè)平臺(tái)要懂得和支撐Java。這些發(fā)展包含著一個(gè)文化的變更,。作為一個(gè)開(kāi)發(fā)職員,,你只需要斷定Java虛擬機(jī)(JVM)供給的抽象層,不同的OS銷(xiāo)售商負(fù)責(zé)履行代碼層,,從而將中立于平臺(tái)的字節(jié)代碼映射到主機(jī)平臺(tái)的機(jī)構(gòu)中,。在這種情況下,Java似乎是同一散布式盤(pán)算機(jī)世界的領(lǐng)袖候選人了,?!熬帉?xiě)一次,永遠(yuǎn)運(yùn)行”(并且無(wú)論在哪里)就成為Java誘人但卻真實(shí)的口號(hào),。

        但我們平心而論,,Java的跨平臺(tái)并不是一個(gè)非常誘人的特征?跨平臺(tái)理論的發(fā)展很好地證實(shí)了這一點(diǎn),。我們看到,,將Java代碼從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)?Java這個(gè)語(yǔ)言最重要和最受吹捧的特點(diǎn)?并不象宣傳的那樣輕易。任何Java平臺(tái)都有其自己的虛擬機(jī),,它可以懂得通用的字節(jié)代碼,,并且及時(shí)地將其編譯為本地代碼。抵觸由此產(chǎn)生,,不同虛擬機(jī)的履行也很不雷同,,這一點(diǎn)足以使代碼的移植比預(yù)期耗費(fèi)多得多的時(shí)間,而且基礎(chǔ)上不是主動(dòng)的,。在企業(yè)用戶(hù)的角度上來(lái)說(shuō),,也很少會(huì)有企業(yè)會(huì)頻繁的調(diào)換平臺(tái),因此這個(gè)特征是否能夠帶來(lái)高價(jià)值是很難評(píng)價(jià)的,。

       那么,,Java模型的利益在哪里呢?首先,,Java是一種先進(jìn)的,、面向?qū)ο蟮恼Z(yǔ)言,包含了預(yù)防常見(jiàn)毛病的內(nèi)置功效,,并在僅僅一兩個(gè)對(duì)象中攜帶了很多經(jīng)常需要用到的功效,。與C++相比,Java更易于讀寫(xiě),不輕易出錯(cuò),,而且更加雅觀,,但是它速度較慢也不太機(jī)動(dòng)。想實(shí)現(xiàn)在任何軟件和硬件平臺(tái)上都可虛擬移植,,Java盡可能少地應(yīng)用了公分母模型,,也就是說(shuō)放棄了將每個(gè)平臺(tái)開(kāi)發(fā)到極限的能力。第二,,虛擬機(jī)的概念本身就是可移植和可共用的,,因此對(duì)于散布式環(huán)境來(lái)說(shuō)是理想的。Java對(duì)于為非Windows平臺(tái)開(kāi)發(fā)代碼是最好的語(yǔ)言,。

       那么對(duì)于Windows平臺(tái)來(lái)說(shuō),,Java又怎么樣呢?讓Java適應(yīng)Windows是不可能的,,這是由于Sun的允許束縛標(biāo)題,。但是Java實(shí)在是太吸引人了,Microsoft比誰(shuí)都能更明確這一點(diǎn),。Microsoft在以前推出的Visual J++證實(shí)了這一點(diǎn),,但是惋惜的是,Microsoft又犯了霸權(quán)的老弊病,,Visual J++并不好用,。因此,Microsoft又一次采用了“拿來(lái)主義”的伎倆,,很好地利用了Java 的眾多特征,,隆重推出了Windows平臺(tái)的新銳力量,它就是相當(dāng)簡(jiǎn)略但十分壯大的面向?qū)ο蟮腃#編程語(yǔ)言,。C#超過(guò)了C++,,它天生就包含了.NET框架類(lèi)庫(kù)中的所有類(lèi),并使語(yǔ)法簡(jiǎn)略化,。說(shuō)到這里已經(jīng)有一些離題了,,不過(guò)Java也不是說(shuō)在Windows平臺(tái)上就不能夠應(yīng)用,,JDK和大部分的IDE都支撐Windows平臺(tái),。

      Java技巧的架構(gòu)--J2ME、J2SE和J2EE

        通常我們以 JDK(Sun 所開(kāi)發(fā)的一套 Java 開(kāi)發(fā)工具)的版本來(lái)定義 Java 的版本,。JDK 1.0 版于 1996 年初公然,,JDK 1.1 版于 1997 年初公然,JDK 1.2 版于 1998 年底公然,?;谑袌?chǎng)行銷(xiāo)的考量,Sun 在 JDK 1.2 版公然后旋即將 Java 改名為「Java 2」,,將 JDK 改名為「Java 2 Software Development Kit(以下簡(jiǎn)稱(chēng) J2SDK)」,。J2SDK(原稱(chēng) JDK)1.3 于 2000 年 4 月公然,,此版本仍稱(chēng)做「Java 2」。目前 J2SDK 1.4 也已經(jīng)公然了,,大家可以到Sun的官方Java站點(diǎn)上查閱到大批的JDK1.4的信息,。

        Java 技巧根據(jù)硬件平臺(tái)與實(shí)用環(huán)境的差別,分成幾個(gè)分支,。JDK 1.1 的時(shí)代,,實(shí)用于一般消費(fèi)性電子產(chǎn)品等,嵌進(jìn)式系統(tǒng)的 Java 平臺(tái)是 PersonalJava 與 EmbeddedJava,,此二者并無(wú)明確的界限,,大致上來(lái)說(shuō),運(yùn)算資源,、內(nèi)存,、以及顯示裝置比較豐富者,應(yīng)用 PersonalJava,,例如 Set-Top Box,、視訊電話 ... 等;反之,,資源較有限者應(yīng)用 EmbeddedJava,,例如召喚器、舉動(dòng)電話 ... 等,。除了 PC 應(yīng)用的 Java 平臺(tái),、IA 應(yīng)用的 PersonalJava 與 EmbeddedJava 平臺(tái)之外,JavaCard 也是一個(gè) Java 平臺(tái),,應(yīng)用于 Smart Card(IC Card)上,。

        Java 2 涌現(xiàn)后,顛覆了先前的 PersonalJava 與 EmeddedJava 的分法,,改分成 Java 2 Platform Enterprise Edition(簡(jiǎn)稱(chēng) J2EE),、Java 2 Platform Standard Edition(簡(jiǎn)稱(chēng) J2SE)、Java 2 Platform Micro Edition(簡(jiǎn)稱(chēng) J2ME),。J2EE 實(shí)用于服務(wù)器,,目前已經(jīng)成為企業(yè)運(yùn)算、電子商務(wù)等領(lǐng)域中相當(dāng)熱門(mén)的技巧,;J2SE 實(shí)用于一般的盤(pán)算機(jī),;J2ME 實(shí)用于消費(fèi)性電子產(chǎn)品。除了這三者之外,,JavaCard 依然是獨(dú)立的一套標(biāo)準(zhǔn),。

      目前,Java技巧的架構(gòu)包含三個(gè)方面:

J2EE(Java 2 Platform Enterprise Edition )?企業(yè)版 (J2EE) 是為面向以企業(yè)為環(huán)境而開(kāi)發(fā)利用程序的解決方案。
J2SE(Java 2 Platform Stand Edition)?標(biāo)準(zhǔn)版 (J2SE) 為桌面開(kāi)發(fā)和低端商務(wù)利用供給了可行的解決方案,。
J2ME(Java 2 Platform Micro Edition )?小型版(J2ME)是致力于消費(fèi)產(chǎn)品和嵌進(jìn)式設(shè)備的最佳解決方案

J2EE

        J2EE已經(jīng)成為開(kāi)發(fā)商創(chuàng)立電子商務(wù)利用的事實(shí)標(biāo)準(zhǔn),。正是熟悉到J2EE平臺(tái)作為一種可擴(kuò)大的、全功效的平臺(tái),,可以將要害的企業(yè)利用擴(kuò)大到任何Web瀏覽器上并可合適多種不同的Internet數(shù)據(jù)流,、可連接到幾乎任何一種傳統(tǒng)數(shù)據(jù)庫(kù)和解決方案、使企業(yè)經(jīng)理根據(jù)多家企業(yè)所供給的產(chǎn)品和技巧開(kāi)發(fā)和安排最佳的解決方案進(jìn)而降低開(kāi)發(fā)網(wǎng)絡(luò)化利用的用度和復(fù)雜性這一宏大上風(fēng),,很多廠家都表現(xiàn)將對(duì)J2EE給予支撐,,并將J2EE技巧作為大型BtoB市場(chǎng)和海量交易處理的安全穩(wěn)固的端到端平臺(tái)。J2EE技巧的基礎(chǔ)就是J2SE標(biāo)準(zhǔn)版,,它鞏固了標(biāo)準(zhǔn)版中的很多優(yōu)點(diǎn),。其終極目標(biāo)就是成為一個(gè)能夠使企業(yè)開(kāi)發(fā)者大幅縮短投放市場(chǎng)時(shí)間的系統(tǒng)結(jié)構(gòu)。它為機(jī)動(dòng)配置各種多層企業(yè)利用軟件,特別是B2B,、B2C等電子商務(wù)利用,供給了壯大的服務(wù)功效,。最近又新加了Connector API服務(wù),使企業(yè)利用的開(kāi)發(fā)和安排有了一系列成熟的技巧。

J2SE

        J2SE是Java 2平臺(tái)的標(biāo)準(zhǔn)版, 它實(shí)用于桌面系統(tǒng),,供給CORBA標(biāo)準(zhǔn)的ORB技巧,聯(lián)合Java的RMI支撐散布式互把持環(huán)境,。它運(yùn)行在Java虛擬機(jī)上。在引進(jìn)了Java IDL后, J2SE支撐IIOP通信,。它是高可移植性,、異構(gòu)性的實(shí)現(xiàn)環(huán)境和硬朗平臺(tái),也是實(shí)現(xiàn)可伸縮性,、可移植性,、散布式異構(gòu)互把持利用軟件開(kāi)發(fā)的標(biāo)準(zhǔn)平臺(tái)。

J2ME

      J2ME供給了HTTP高級(jí)Internet協(xié)議,,使移動(dòng)電話能以Client/Server方法直接訪問(wèn)Internet的全部信息,,不同的Client訪問(wèn)不同的文件,此外還能訪問(wèn)本地存儲(chǔ)區(qū),,供給最高效率的無(wú)線交換,。J2ME是Java 2平臺(tái)的微型版,它分成CDC(connected device configuration)和CLDC(connected limited device configuration)兩部分。CDC運(yùn)行在連接虛擬機(jī)上,為手提式盤(pán)算機(jī)一類(lèi)較復(fù)雜的移動(dòng)設(shè)備供給給用平臺(tái),;CLDC運(yùn)行在核心虛擬機(jī)(KVM)上,它實(shí)現(xiàn)MIDP(Mobile Information Device Profile)移動(dòng)信息設(shè)備利用平臺(tái),,即針對(duì)手機(jī)之類(lèi)的設(shè)備建立移動(dòng)盤(pán)算平臺(tái)。

      在小型的J2ME(Java 2 Micro Edition)方面,,重要是利用在內(nèi)存容量小,、體積也較小的電子裝置上。小至智能卡,、舉動(dòng)電話,個(gè)人數(shù)字助理都是運(yùn)用J2ME的最佳平臺(tái)。Java在Palm的利用上,,PalmOS 4.0內(nèi)含KJava,,Sun也推出針對(duì)PalmOS應(yīng)用的J2ME版本。所以,,以既有的Java程序設(shè)計(jì)知識(shí),,就可以在Palm PDA上開(kāi)發(fā)出Palm的各式各樣利用系統(tǒng)。Java和Palm這兩個(gè)標(biāo)準(zhǔn)平臺(tái)的聯(lián)合,,將是下一波PDA利用的趨勢(shì),。Java在手機(jī)的利用上,Nokia,、Motorola,、Ericsson 都將推出利用J2ME技巧的新手機(jī),所以Java程序設(shè)計(jì)師有更多的平臺(tái)可供施展,。此種聯(lián)合J2ME及無(wú)線通信技巧的無(wú)線開(kāi)放利用平臺(tái),,將供給舉動(dòng)商務(wù)極佳的解決方案。

       在中型的J2SE(Java 2 Standard Edition)方面,,Sun推出一個(gè)新的解決方案,,稱(chēng)為Java Web Start。本來(lái)的Java Applet是在WebBrowser 中間開(kāi)出一塊方形區(qū)域來(lái)履行Java程序,,但是這樣在履行效能和兼容性上都受限于原有的 Web Browser?,F(xiàn)在新推出的Java Web Start則是在把持系統(tǒng)上直接履行的Java Application,但是可以在網(wǎng)頁(yè)上激活,。如此一來(lái)既可和網(wǎng)頁(yè)聯(lián)合,,在履行上也更快、更有效率,。并且,,Sun和IBM都將推出支撐64位運(yùn)算的Java版本,這對(duì)一般盤(pán)算機(jī)上履行的客戶(hù)端Java利用系統(tǒng)的開(kāi)發(fā)將會(huì)是一大利器,。

       另外在大型的J2EE(Java 2 Enterprise Edition)利用上,,可以說(shuō)"J2EE"已經(jīng)成為服務(wù)器運(yùn)算環(huán)境的標(biāo)準(zhǔn)。Java Servlets,、JSP(Java ServerPages),、EJB(Enterprise JavaBeans)、JavaMail,、JDBC,、JMS等,都是各家廠商產(chǎn)品開(kāi)發(fā)的重點(diǎn)方向,。J2EE兼容的是一般Intel個(gè)人盤(pán)算機(jī)(Linux,、Windows.....),、麥金塔以及各家高效能高穩(wěn)固度的UNIX伺服主機(jī),未來(lái)必定成為服務(wù)器運(yùn)算市場(chǎng)上的重要選擇之一,。

       除了以上這三大Java組合之外,,Java和XML的整合也是未來(lái)的重點(diǎn)。Sun公司已經(jīng)推出Java處理XML的標(biāo)準(zhǔn)延伸API - Java API for XML Parsing (JAXP),,可以讓各家所制作的XML解析器有接口上的標(biāo)準(zhǔn),。所以在Java程序中,只要懂得一套API(JAXP)就可以完整處理XML文件,,讓XML的利用更加方便,。Java這個(gè)跨平臺(tái)的開(kāi)發(fā)環(huán)境,加上XML這個(gè)跨平臺(tái)的材料格式,,此種跨平臺(tái)上風(fēng)組合勢(shì)將成為未來(lái)訊息傳遞及材料交換的重要利用技巧,,如虎添翼地聯(lián)合成一個(gè)最佳的跨平臺(tái)解決方案。

        藉由J2SE (Java 2 Standard Edition)可以開(kāi)發(fā)在PC上的利用軟件,,藉由J2ME (Java 2 Micro Edition) 可以跨足更寬大的家電,、智能卡、電子裝置等市場(chǎng),,再藉由J2EE (Java 2 Enterprise Edition ) 可以整合伺服主機(jī)運(yùn)算環(huán)境,。Java技巧的利用領(lǐng)域幾乎已經(jīng)無(wú)所不在,Java技巧更可以在網(wǎng)際網(wǎng)絡(luò)及電子商務(wù)各領(lǐng)域中,,供給全方位的解決方案,。

        隨著利用領(lǐng)域的不同,Java 有很多 API(Application Programming Interface),,這些 API 分成三大類(lèi):

Java Core API:由 Sun 制定的基礎(chǔ) API,,任何 Java 平臺(tái)都必須供給。

Java Standard Extension API (javax):由 Sun 制定的擴(kuò)充 API,,Java 平臺(tái)可以選擇性地供給或加裝,。

廠商或組織所供給的 API:由各家公司或組織所供給。

       其中 Core API 和 Standard Extension API 已經(jīng)逐漸涵蓋了大部份的信息利用領(lǐng)域,,例如多媒體,、數(shù)據(jù)庫(kù)、Web,、企業(yè)運(yùn)算,、語(yǔ)音、實(shí)時(shí)系統(tǒng),、網(wǎng)絡(luò),、電話、影像處理,、加解密,、GUI,、散布式運(yùn)算 ......。假如你有某項(xiàng)需求尚未有標(biāo)準(zhǔn)的 Java API 可遵守,,你可以向 Sun 提出制定新 API 的懇求,。經(jīng)過(guò)審核之后,,你的請(qǐng)求可能會(huì)通過(guò),、駁回 ...... 等。假如通過(guò),,就會(huì)開(kāi)端進(jìn)進(jìn)制定 API 的程序,。Java API 的制定過(guò)程由于公然,且經(jīng)過(guò)很多業(yè)界技巧領(lǐng)先公司的共同參與,,所以相當(dāng)完善而優(yōu)良,。


EJB的生態(tài)環(huán)境

   在sun公司供給的EJB規(guī)范中,我們一個(gè)完整的基于EJB的散布式盤(pán)算結(jié)構(gòu)由六個(gè)角色組成,,這六個(gè)角色可以由不同的開(kāi)發(fā)商供給,,每個(gè)角色所作的工作必須遵守Sun公司供給的EJB規(guī)范,以保證彼此之間的兼容性,。


EJB組件開(kāi)發(fā)者: 開(kāi)發(fā)并銷(xiāo)售 EJB,。
利用組合者: 將不同的 EJB 搭建成利用。
安排者: 應(yīng)用相應(yīng)工具在運(yùn)行環(huán)境下配置 EJB,。
EJB 服務(wù)器供給者: 開(kāi)發(fā)并銷(xiāo)售 EJB 服務(wù)器
EJB 容器供給商: 開(kāi)發(fā)并銷(xiāo)售 EJB 容器
系統(tǒng)治理員: 監(jiān)督運(yùn)行時(shí)情況

         1,、EJB組件開(kāi)發(fā)者(Enterprise Bean Provider)

  EJB組件開(kāi)發(fā)者負(fù)責(zé)開(kāi)發(fā)履行貿(mào)易邏輯規(guī)矩的EJB組件,開(kāi)發(fā)出的EJB組件打包成ejb-jar文件,。EJB組件開(kāi)發(fā)者負(fù)責(zé)定義EJB的remote和home接口,,編寫(xiě)履行貿(mào)易邏輯的EJB class,供給安排EJB的安排文件(deployment descriptor)。安排文件包含EJB的名字,,EJB用到的資源配置,,如JDBC等。EJB組件開(kāi)發(fā)者是范例的貿(mào)易利用開(kāi)發(fā)領(lǐng)域?qū)<摇?

  EJB組件開(kāi)發(fā)者不需要精通系統(tǒng)級(jí)的編程,,因此,,不需要知道一些系統(tǒng)級(jí)的處理細(xì)節(jié),如事務(wù),、同步,、安全、散布式盤(pán)算等,。

  2,、利用組合者(Application Assembler)

  利用組合者負(fù)責(zé)利用各種EJB組合一個(gè)完整的利用系統(tǒng)。利用組合者有時(shí)需要供給一些相干的程序,,如在一個(gè)電子商務(wù)系統(tǒng)里,,利用組合者需要供給JSP(Java Server Page)程序,。

  利用組合者必須把握所用的EJB的home和remote接口,但不需要知道這些接口的實(shí)現(xiàn),。

  3,、安排者(Deployer)

  安排者負(fù)責(zé)將ejb-jar文件安排到用戶(hù)的系統(tǒng)環(huán)境中。系統(tǒng)環(huán)境包含某種EJB Server和EJB Container,。安排者必須保證所有由EJB組件開(kāi)發(fā)者在安排文件中聲明的資源可用,,例如,安排者必須配置好EJB所需的數(shù)據(jù)庫(kù)資源,。

  安排過(guò)程分兩步:安排者首先利用EJB Container供給的工具天生一些類(lèi)和接口,,使EJB Container能夠利用這些類(lèi)和接口在運(yùn)行狀態(tài)治理EJB。 安排者安裝EJB組件和其他在上一步天生的類(lèi)到EJB Container中,。 安排者是某個(gè)EJB運(yùn)行環(huán)境的專(zhuān)家,。

  某些情況下,安排者在安排時(shí)還需要懂得EJB包含的業(yè)務(wù)方法,,以便在安排完成后,,寫(xiě)一些簡(jiǎn)略的程序測(cè)試。

  4,、EJB 服務(wù)器供給者(EJB Server Provider)

  EJB 服務(wù)器供給者是系統(tǒng)領(lǐng)域的專(zhuān)家,,精通散布式交易治理,散布式對(duì)象治理及其它系統(tǒng)級(jí)的服務(wù),。EJB 服務(wù)器供給者一般由把持系統(tǒng)開(kāi)發(fā)商,、中間件開(kāi)發(fā)商或數(shù)據(jù)庫(kù)開(kāi)發(fā)商供給。

  在目前的EJB規(guī)范中,,假定EJB 服務(wù)器供給者和EJB 容器供給者來(lái)自同一個(gè)開(kāi)發(fā)商,,所以,沒(méi)有定義EJB 服務(wù)器供給者和EJB容器供給者之間的接口標(biāo)準(zhǔn),。

  5,、EJB 容器供給者(EJB Container Provider)

  EJB 容器供給者供給以下功效:

  供給EJB安排工具為安排好的EJB組件供給運(yùn)行環(huán)境 。EJB容器負(fù)責(zé)為EJB供給交易治理,,安全治理等服務(wù),。

  EJB 容器供給者必須是系統(tǒng)級(jí)的編程專(zhuān)家,還要具備一些利用領(lǐng)域的經(jīng)驗(yàn),。EJB 容器供給者的工作重要集中在開(kāi)發(fā)一個(gè)可伸縮的,,具有交易治理功效的集成在EJB 服務(wù)器中的容器。EJB 容器供給者為EJB組件開(kāi)發(fā)者供給了一組標(biāo)準(zhǔn)的,、易用的API訪問(wèn)EJB 容器,,使EJB組件開(kāi)發(fā)者不需要懂得EJB服務(wù)器中的各種技巧細(xì)節(jié)。

  EJB容器供給者負(fù)責(zé)供給系統(tǒng)監(jiān)測(cè)工具用來(lái)實(shí)時(shí)監(jiān)測(cè)EJB容器和運(yùn)行在容器中的EJB組件狀態(tài),。

  6,、系統(tǒng)治理員(System Administrator)

  系統(tǒng)治理員負(fù)責(zé)為EJB服務(wù)器和容器供給一個(gè)企業(yè)級(jí)的盤(pán)算和網(wǎng)絡(luò)環(huán)境,。

  系統(tǒng)治理員負(fù)責(zé)利用EJB 服務(wù)器和容器供給的監(jiān)測(cè)治理工具監(jiān)測(cè)EJB組件的運(yùn)行情況。

        將責(zé)任分別的另一個(gè)利益是在代碼級(jí)上,,可以將基于EJBs的系統(tǒng)邏輯的分派給更合適的專(zhuān)家,。SUN的EJB規(guī)范建議應(yīng)用幾個(gè)獨(dú)立的角色,對(duì)于斷定運(yùn)作環(huán)境的責(zé)任鏈?zhǔn)欠浅V匾?。舉例說(shuō),,EJB供給者是由貿(mào)易專(zhuān)家和分析職員扮演的角色,他們斷定一個(gè)組織內(nèi)的最佳信息流程,。但是仍然有Second Domain Expert,,如利用程序匯編職員,,他們集成不同的EJB組件并確保它可以確保滿(mǎn)足利用程序的需求,。

       還有兩種角色回進(jìn)到系統(tǒng)級(jí)的部分,第一個(gè)是配置職員,,他們負(fù)責(zé)實(shí)際的安裝和配置基于EJB的系統(tǒng),。這需要有設(shè)置目錄服務(wù)和集成現(xiàn)有利用程序的經(jīng)驗(yàn)。第二個(gè)是系統(tǒng)治理員,,他們要供給全天的監(jiān)督和支撐,,確保利用程序正常運(yùn)作。盡管系統(tǒng)治理員這個(gè)角色不需要是Java編程專(zhuān)家,,但是他需要能夠搪塞以下標(biāo)題:

設(shè)置Java Virtual Machine (JVM)并關(guān)接洽統(tǒng)環(huán)境參數(shù)(如:CLASSPATH)
應(yīng)用Java Archive (jar)命令保存類(lèi)文件
懂得WEB服務(wù)器和Servlet的工作原理,。
要能通過(guò)監(jiān)督運(yùn)行中程序的狀態(tài)斷定優(yōu)化方法。

        很明顯,,有些角色是可以交叉的,,比如系統(tǒng)治理員和配置職員。盡管配置職員可能是將類(lèi)文件復(fù)制到服務(wù)器而系統(tǒng)治理員需要斷定配置職員是否復(fù)制到了正確的地位,。

       相關(guān)網(wǎng)址:http://www./support/showfom.jsp?i=2984

  EJB技巧的基礎(chǔ)是另外兩種技巧:RMI-IIOP和JNDI,。要想懂得EJB,必定要先懂得RMI-IIOP和JNDI,。因此,,我們?cè)谙热軪JB細(xì)節(jié)之前,,先懂得這兩項(xiàng)技巧。我們的先容比較基礎(chǔ),,因此大多數(shù)組織只要懂得這些就已經(jīng)夠了。
 
Java RMI-IIOP

  Java RMI-IIOP(Java Remote Method Invocation over the Internet Inter-ORB Protocol)是J2EE的網(wǎng)絡(luò)機(jī)制,。Java RMI-IIOP答應(yīng)你編寫(xiě)散布式對(duì)象,,使得對(duì)象的通信領(lǐng)域能夠在內(nèi)存中,跨Java虛擬機(jī),,跨物理設(shè)備,。

Remote Method Invocation

  RPC(remote procedure call)是一臺(tái)機(jī)器的過(guò)程調(diào)用另一臺(tái)機(jī)器的過(guò)程的過(guò)程,。而remote method invocation則比RPC的概念更進(jìn)一步,答應(yīng)散布式對(duì)象間的通信,。RMI-IIOP答應(yīng)調(diào)用遠(yuǎn)程對(duì)象的方法,,而不僅僅是過(guò)程。這有利于面向?qū)ο缶幊?。Java RMI (Remote Method Invocation 遠(yuǎn)程方法調(diào)用)是用Java在JDK1.1中實(shí)現(xiàn)的,,它大大加強(qiáng)了Java開(kāi)發(fā)散布式利用的能力。Java作為一種風(fēng)靡一時(shí)的網(wǎng)絡(luò)開(kāi)發(fā)語(yǔ)言,,其宏大的威力就體現(xiàn)在它壯大的開(kāi)發(fā)散布式網(wǎng)絡(luò)利用的能力上,,而RMI就是開(kāi)發(fā)百分之百純Java的網(wǎng)絡(luò)散布式利用系統(tǒng)的核心解決方案之一。實(shí)在它可以被看作是RPC的Java版本,。但是傳統(tǒng)RPC并不能很好地利用于散布式對(duì)象系統(tǒng),。而Java RMI 則支撐存儲(chǔ)于不同地址空間的程序級(jí)對(duì)象之間彼此進(jìn)行通信,實(shí)現(xiàn)遠(yuǎn)程對(duì)象之間的無(wú)縫遠(yuǎn)程調(diào)用,。

remote method invocation決不簡(jiǎn)略,,需要考慮幾個(gè)標(biāo)題:

  marshalling和unmarshalling.在不同機(jī)器間通過(guò)網(wǎng)絡(luò)傳遞變量(包含Java基礎(chǔ)類(lèi)型和對(duì)象),假如目標(biāo)機(jī)器表現(xiàn)數(shù)據(jù)的方法和原機(jī)器不同該怎么辦,?例如二進(jìn)制庫(kù)不同,。因此marshalling和unmarshalling就是傳遞變量的過(guò)程。

  變量傳遞方法.變量有兩種傳遞方法:pass-by-value和pass-by-reference,。對(duì)于前者,,你的目標(biāo)方法只需應(yīng)用一份copy,但對(duì)于后者,,遠(yuǎn)程方法對(duì)變量的任何修正都會(huì)影響到源數(shù)據(jù),。

  網(wǎng)絡(luò)和機(jī)器的不穩(wěn)固.需要有一種機(jī)制保證一個(gè)JVM崩潰之后,不會(huì)影響系統(tǒng)的正常運(yùn)作,。

  在 Java 散布式對(duì)象模型中,,remote object 是這樣一種對(duì)象:它的方法可以從其它 Java 虛擬機(jī)(可能在不同的主機(jī)上)中調(diào)用。該類(lèi)型的對(duì)象由一種或多種 remote interfaces(它是聲明遠(yuǎn)程對(duì)象方法的 Java 接口)描寫(xiě),。遠(yuǎn)程方法調(diào)用 (RMI) 就是調(diào)用遠(yuǎn)程對(duì)象上遠(yuǎn)程接口的方法的動(dòng)作,。更為重要的是,遠(yuǎn)程對(duì)象的方法調(diào)用與本地對(duì)象的方法調(diào)用語(yǔ)法雷同,。

Remote Interface

  RMI-IIOP遵守了接口和實(shí)現(xiàn)的原則,。你寫(xiě)的所有網(wǎng)絡(luò)代碼都是利用于接口,而不是實(shí)現(xiàn),。實(shí)際上,,你必須應(yīng)用RMI-IIOP中的范例,沒(méi)有其它的選擇。直接在你的對(duì)象實(shí)現(xiàn)上履行遠(yuǎn)程調(diào)用是不可能的,,你只能在對(duì)象類(lèi)的接口上單獨(dú)進(jìn)行這一把持,。

  所以我們?cè)趹?yīng)用RMI-IIOP時(shí),你必須建立一個(gè)客戶(hù)接口,,叫做remote interface,。這個(gè)遠(yuǎn)程接口應(yīng)當(dāng)擴(kuò)大java.rmi.Remote接口。

Remote Object Implementation

  遠(yuǎn)程對(duì)象和客戶(hù)機(jī)的物理地位并不是很重要,??梢赃\(yùn)行在同一地址空間或是跨Internet運(yùn)行。

  為了使對(duì)象成為一個(gè)遠(yuǎn)程對(duì)象,,你需要履行一下步驟:

  持續(xù)javax.rmi.PortableRemoteObject,。PortableRemoteObject是進(jìn)行遠(yuǎn)程調(diào)用的基類(lèi),當(dāng)你的遠(yuǎn)程對(duì)象調(diào)用結(jié)構(gòu)器時(shí),,PortableRemoteObject對(duì)象的結(jié)構(gòu)器也會(huì)主動(dòng)被調(diào)用,。

  不持續(xù)javax.rmi.PortableRemoteObject。假如你的遠(yuǎn)程對(duì)象需要持續(xù)其它的類(lèi),,而Java不答應(yīng)多重持續(xù),,因此你不能持續(xù)PortableRemoteObject。這時(shí),,你需要手動(dòng)調(diào)用javax.rmi.PortableRemoteObject.exportObject()。

Stub和Skeletons

  我們來(lái)看看在RMI-IIOP背后隱躲的網(wǎng)絡(luò)架構(gòu),。RMI-IIOP的一個(gè)利益就是你可以不用管你要調(diào)用的對(duì)象是本地的還是遠(yuǎn)程的,。這就叫做local/remote transparency。

  RMI利用程序通常包含兩個(gè)獨(dú)立的程序:服務(wù)器程序和客戶(hù)機(jī)程序,。范例的服務(wù)器利用程序?qū)?chuàng)立多個(gè)遠(yuǎn)程對(duì)象,,使這些遠(yuǎn)程對(duì)象能夠被引用,然后等候客戶(hù)機(jī)調(diào)用這些遠(yuǎn)程對(duì)象的方法,。而范例的客戶(hù)機(jī)程序則從服務(wù)器中得到一個(gè)或多個(gè)遠(yuǎn)程對(duì)象的引用,,然后調(diào)用遠(yuǎn)程對(duì)象的方法。RMI為服務(wù)器和客戶(hù)機(jī)進(jìn)行通信和信息傳遞供給了一種機(jī)制,。


  在與遠(yuǎn)程對(duì)象的通信過(guò)程中,,RMI應(yīng)用標(biāo)準(zhǔn)機(jī)制:stub和skeleton。遠(yuǎn)程對(duì)象的stub擔(dān)負(fù)遠(yuǎn)程對(duì)象的客戶(hù)本地代表或代理人角色,。調(diào)用程序?qū)⒄{(diào)用本地stub的方法,,而本地stub將負(fù)責(zé)履行對(duì)遠(yuǎn)程對(duì)象的方法調(diào)用。在RMI中,,遠(yuǎn)程對(duì)象的stub與該遠(yuǎn)程對(duì)象所實(shí)現(xiàn)的遠(yuǎn)程接口集雷同,。調(diào)用stub的方法時(shí)將履行下列把持:(1) 初始化與包含遠(yuǎn)程對(duì)象的遠(yuǎn)程虛擬機(jī)的連接;(2) 對(duì)遠(yuǎn)程虛擬機(jī)的參數(shù)進(jìn)行編組(寫(xiě)進(jìn)并傳輸);(3) 等候方法調(diào)用成果,;(4) 解編(讀?。┓祷刂祷蚍祷氐漠惓#?5) 將值返回給調(diào)用程序,。為了向調(diào)用程序展現(xiàn)比較簡(jiǎn)略的調(diào)用機(jī)制,,stub將參數(shù)的序列化和網(wǎng)絡(luò)級(jí)通信等細(xì)節(jié)隱躲了起來(lái)。在遠(yuǎn)程虛擬機(jī)中,,每個(gè)遠(yuǎn)程對(duì)象都可以有相應(yīng)的skeleton(在JDK1.2環(huán)境中無(wú)需應(yīng)用skeleton),。Skeleton負(fù)責(zé)將調(diào)用分配給實(shí)際的遠(yuǎn)程對(duì)象實(shí)現(xiàn)。它在吸收方法調(diào)用時(shí)履行下列把持:(1) 解編(讀?。┻h(yuǎn)程方法的參數(shù),;(2) 調(diào)用實(shí)際遠(yuǎn)程對(duì)象實(shí)現(xiàn)上的方法;(3) 將成果(返回值或異常)編組(寫(xiě)進(jìn)并傳輸)給調(diào)用程序,。stub和skeleton由rmic編譯器天生,。

  要實(shí)現(xiàn)local/remote transparency可沒(méi)有那么簡(jiǎn)略。為了屏蔽你調(diào)用的是遠(yuǎn)端主機(jī)上的對(duì)象,,RMI-IIOP需要模仿一個(gè)本地對(duì)象供你調(diào)用,。這個(gè)本地對(duì)象叫做stub。它負(fù)責(zé)吸收本地的方法調(diào)用懇求,,把這些懇求委托給真正實(shí)現(xiàn)它們的對(duì)象(可以通過(guò)網(wǎng)絡(luò)定位),。這樣就使得遠(yuǎn)程調(diào)用看起來(lái)就和本地調(diào)用一樣。

  利用RMI編寫(xiě)散布式對(duì)象利用程序需要完成以下工作:(1) 定位遠(yuǎn)程對(duì)象,。利用程序可應(yīng)用兩種機(jī)制中的一種得到對(duì)遠(yuǎn)程對(duì)象的引用,。它既可用RMI的簡(jiǎn)略命名工具rmiregistry來(lái)注冊(cè)它的遠(yuǎn)程對(duì)象,也可以將遠(yuǎn)程對(duì)象引用作為慣例把持的一部分來(lái)進(jìn)行傳遞和返回,。(2)與遠(yuǎn)程對(duì)象通信,。遠(yuǎn)程對(duì)象間通信的細(xì)節(jié)由RMI處理,對(duì)于程序員來(lái)說(shuō),,遠(yuǎn)程通信看起來(lái)就像標(biāo)準(zhǔn)的Java方法調(diào)用,。(3)給作為參數(shù)或返回值傳遞的對(duì)象加載類(lèi)字節(jié)碼。由于RMI答應(yīng)調(diào)用程序?qū)⒓僇ava對(duì)象傳給遠(yuǎn)程對(duì)象,,所以,,RMI將供給必要的機(jī)制,既可以加載對(duì)象的代碼又可以傳輸對(duì)象的數(shù)據(jù),。在RMI散布式利用程序運(yùn)行時(shí),,服務(wù)器調(diào)用注冊(cè)服務(wù)程序以使名字與遠(yuǎn)程對(duì)象相干聯(lián)??蛻?hù)機(jī)在服務(wù)器上的注冊(cè)服務(wù)程序中用遠(yuǎn)程對(duì)象的名字查找該遠(yuǎn)程對(duì)象,,然后調(diào)用它的方法。

  定位遠(yuǎn)程對(duì)象。利用程序可應(yīng)用兩種機(jī)制中的一種得到對(duì)遠(yuǎn)程對(duì)象的引用,。它既可用 RMI 的簡(jiǎn)略命名工具 rmiregistry 來(lái)注冊(cè)它的遠(yuǎn)程對(duì)象,;也可將遠(yuǎn)程對(duì)象引用作為慣例把持的一部分來(lái)進(jìn)行傳遞和返回。

  與遠(yuǎn)程對(duì)象通信,。遠(yuǎn)程對(duì)象間通信的細(xì)節(jié)由 RMI 處理,;對(duì)于程序員來(lái)說(shuō),遠(yuǎn)程通信看起來(lái)就象標(biāo)準(zhǔn)的 Java 方法調(diào)用,。給作為參數(shù)或返回值傳遞的對(duì)象加載類(lèi)字節(jié)碼由于 RMI答應(yīng)調(diào)用程序?qū)⒓?Java 對(duì)象傳給遠(yuǎn)程對(duì)象,,所以 RMI 將供給必要的機(jī)制,既可以加載對(duì)象的代碼又可以傳輸對(duì)象的數(shù)據(jù),。服務(wù)器調(diào)用注冊(cè)服務(wù)程序以使名字與遠(yuǎn)程對(duì)象相干聯(lián),。客戶(hù)機(jī)在服務(wù)器注冊(cè)服務(wù)程序中用遠(yuǎn)程對(duì)象的名字查找該遠(yuǎn)程對(duì)象,,然后調(diào)用它的方法,。RMI 能用 Java系統(tǒng)支撐的任何 URL 協(xié)議(例如 HTTP、FTP,、file 等)加載類(lèi)字節(jié)碼,。

  stub只是解決了一半的標(biāo)題。我們還??催h(yuǎn)程對(duì)象也不用考慮網(wǎng)絡(luò)標(biāo)題,。因此遠(yuǎn)程對(duì)象也需要一個(gè)本地的skeleton來(lái)吸收調(diào)用。skeleton吸收網(wǎng)絡(luò)調(diào)用并把調(diào)用委托給遠(yuǎn)程對(duì)象實(shí)現(xiàn),。

  你的J2EE服務(wù)器應(yīng)當(dāng)供給一種方法來(lái)產(chǎn)生必須的stub和skeleton,,以減輕你的對(duì)網(wǎng)絡(luò)標(biāo)題考慮的累贅。范例的是通過(guò)命令行工具來(lái)完成,,例如sun的J2EE參考實(shí)現(xiàn)包就應(yīng)用了一個(gè)名為rmic(RMI compiler)的工具來(lái)產(chǎn)生stub和skeleton類(lèi)。你應(yīng)當(dāng)把stub安排在客戶(hù)機(jī)上,,并把skeleton安排在服務(wù)器上,。

對(duì)象序列化和變量傳遞

  在RMI散布式利用系統(tǒng)中,服務(wù)器與客戶(hù)機(jī)之間傳遞的Java對(duì)象必須是可序列化的對(duì)象,。不可序列化的對(duì)象不能在對(duì)象流中進(jìn)行傳遞,。對(duì)象序列化擴(kuò)大了核心Java輸進(jìn)/輸出類(lèi),同時(shí)也支撐對(duì)象,。對(duì)象序列化支撐把對(duì)象編碼以及將通過(guò)它們可訪問(wèn)到的對(duì)象編碼變成字節(jié)流,;同時(shí),它也支撐流中對(duì)象圖形的互補(bǔ)重結(jié)構(gòu),。序列化用于輕型持久性和借助于套接字或遠(yuǎn)程方法調(diào)用(RMI)進(jìn)行的通信,。序列化中現(xiàn)在包含一個(gè) API(Application Programming Interface,利用程序接口),答應(yīng)獨(dú)立于類(lèi)的域指定對(duì)象的序列化數(shù)據(jù),,并答應(yīng)應(yīng)用現(xiàn)有協(xié)議將序列化數(shù)據(jù)域?qū)戇M(jìn)流中或從流中讀取,,以確保與缺省讀寫(xiě)機(jī)制的兼容性。

  為編寫(xiě)利用程序,,除多數(shù)瞬態(tài)利用程序外,,都必須具備存儲(chǔ)和檢索 Java對(duì)象的能力。以序列化方法存儲(chǔ)和檢索對(duì)象的要害在于供給重新結(jié)構(gòu)該對(duì)象所需的足夠?qū)ο鬆顟B(tài),。存儲(chǔ)到流的對(duì)象可能會(huì)支撐 Serializable(可序列化)或 Externalizable(可外部化)接口,。對(duì)于Java對(duì)象,序列化情勢(shì)必須能標(biāo)識(shí)和校驗(yàn)存儲(chǔ)其內(nèi)容的對(duì)象所屬的 Java類(lèi),,并且將該內(nèi)容還原為新的實(shí)例,。對(duì)于可序列化對(duì)象,流將供給足夠的信息將流的域還原為類(lèi)的兼容版本,。對(duì)于可外部化對(duì)象,,類(lèi)將全權(quán)負(fù)責(zé)其內(nèi)容的外部格式。序列化 Java 對(duì)象的目標(biāo)是:供給一種簡(jiǎn)略但可擴(kuò)充的機(jī)制,,以序列化方法掩護(hù) Java對(duì)象的類(lèi)型及安全屬性,;具有支撐編組和解編的擴(kuò)大能力以滿(mǎn)足遠(yuǎn)程對(duì)象的需要;具有可擴(kuò)大性以支撐 Java 對(duì)象的簡(jiǎn)略持久性,;只有在自定義時(shí),,才需對(duì)每個(gè)類(lèi)供給序列化自實(shí)現(xiàn);答應(yīng)對(duì)象定義其外部格式,。

java.rmi.Remote 接口

  在 RMI 中,,遠(yuǎn)程接口是聲明了可從遠(yuǎn)程 Java 虛擬機(jī)中調(diào)用的方法集。遠(yuǎn)程接
口必須滿(mǎn)足下列請(qǐng)求:

遠(yuǎn)程接口至少必須直接或間接擴(kuò)大 java.rmi.Remote 接口,。
遠(yuǎn)程接口中的方法聲明必須滿(mǎn)足下列遠(yuǎn)程方法聲明的請(qǐng)求:
遠(yuǎn)程方法聲明在其 throws 子句中除了要包含與利用程序有關(guān)的異常(留心與利用程序有關(guān)的異常無(wú)需擴(kuò)大 java.rmi.RemoteException )之外,,還必須包含 java.rmi.RemoteException 異常(或它的超類(lèi),例如java.io.IOException 或 java.lang.Exception ),。
遠(yuǎn)程方法聲明中,,作為參數(shù)或返回值聲明的(在參數(shù)表中直接聲明或嵌進(jìn)到參數(shù)的非遠(yuǎn)程對(duì)象中)遠(yuǎn)程對(duì)象必須聲明為遠(yuǎn)程接口,而非該接口的實(shí)現(xiàn)類(lèi),。

java.rmi.Remote 接口是一個(gè)不定義方法的標(biāo)記接口:

public interface Remote

遠(yuǎn)程接口必須至少擴(kuò)大 java.rmi.Remote 接口(或其它擴(kuò)大java.rmi.Remote 的遠(yuǎn)程接口),。然而,遠(yuǎn)程接口在下列情況中可以擴(kuò)大非遠(yuǎn)程接口:

  遠(yuǎn)程接口也可擴(kuò)大其它非遠(yuǎn)程接口,,只要被擴(kuò)大接口的所有方法(假如有)滿(mǎn)足遠(yuǎn)程方法聲明的請(qǐng)求,。
  例如,下面的接口 BankAccount 即為訪問(wèn)銀行帳戶(hù)定義了一個(gè)遠(yuǎn)程接口,。它包含往帳戶(hù)存款,、使帳戶(hù)收支平衡和從帳戶(hù)取款的遠(yuǎn)程方法:

public interface BankAccount extends java.rmi.Remote
{
public void deposit(float amount)
throws java.rmi.RemoteException;
public void withdraw(float amount)
throws OverdrawnException, java.rmi.RemoteException;
public float getBalance()
throws java.rmi.RemoteException;
}

下例闡明了有效的遠(yuǎn)程接口 Beta,。它擴(kuò)大非遠(yuǎn)程接口 Alpha(有遠(yuǎn)程方法)和接口 java.rmi.Remote:
public interface Alpha
{
public final String okay = "constants are okay too";
public Object foo(Object obj)
throws java.rmi.RemoteException;
public void bar() throws java.io.IOException;
public int baz() throws java.lang.Exception;
}

public interface Beta extends Alpha, java.rmi.Remote {
public void ping() throws java.rmi.RemoteException;
}

RemoteException 類(lèi)

  java.rmi.RemoteException 類(lèi)是在遠(yuǎn)程方法調(diào)用期間由 RMI 運(yùn)行時(shí)所拋出的異常的超類(lèi)。為確保應(yīng)用 RMI 系統(tǒng)的利用程序的硬朗性,,遠(yuǎn)程接口中聲明的遠(yuǎn)程方法在其 throws 子句中必須指定 java.rmi.RemoteException(或它的超類(lèi),,例如 java.io.IOException 或 java.lang.Exception)。

  當(dāng)遠(yuǎn)程方法調(diào)用由于某種原因失敗時(shí),,將拋出 java.rmi.RemoteException 異常,。遠(yuǎn)程方法調(diào)用失敗的原因包含:

通信失敗(遠(yuǎn)程服務(wù)器不可達(dá)或拒盡連接,;連接被服務(wù)器封閉等,。)
參數(shù)或返回值傳輸或讀取時(shí)失敗
協(xié)議毛病

RemoteException 類(lèi)是一個(gè)已檢驗(yàn)的異常(必須由遠(yuǎn)程方法的調(diào)用程序處理并經(jīng)編譯器檢驗(yàn)的異常),而不是 RuntimeException,。

RemoteObject 類(lèi)及其子類(lèi)

  RMI 服務(wù)器函數(shù)由 java.rmi.server.RemoteObject 及其子類(lèi)java.rmi.server.RemoteServer,、java.rmi.server.UnicastRemoteObject和 java.rmi.activation.Activatable 供給。

  java.rmi.server.RemoteObject 為對(duì)遠(yuǎn)程對(duì)象敏感的 java.lang.Object方法,、hashCode,、 equals 和 toString 供給實(shí)現(xiàn)。

  創(chuàng)立遠(yuǎn)程對(duì)象并將其導(dǎo)出(使它們可為遠(yuǎn)程客戶(hù)機(jī)利用)所需的方法由類(lèi)UnicastRemoteObject 和 Activatable 供給,。子類(lèi)可以辨認(rèn)遠(yuǎn)程引用的語(yǔ)義,,例如服務(wù)器是簡(jiǎn)略的遠(yuǎn)程對(duì)象還是可激活的遠(yuǎn)程對(duì)象(調(diào)用時(shí)將履行的遠(yuǎn)程對(duì)象)。java.rmi.server.UnicastRemoteObject 類(lèi)定義了單體(單路傳送)遠(yuǎn)程對(duì)象,,其引用只有在服務(wù)器過(guò)程活著時(shí)才有效,。類(lèi) java.rmi.activation.Activatable 是抽象類(lèi),它定義的 activatable遠(yuǎn)程對(duì)象在其遠(yuǎn)程方法被調(diào)用時(shí)開(kāi)端履行并在必要時(shí)自己封閉,。

實(shí)現(xiàn)遠(yuǎn)程接口

  實(shí)現(xiàn)遠(yuǎn)程接口的類(lèi)的一般規(guī)矩如下:

該類(lèi)通常擴(kuò)大 java.rmi.server.UnicastRemoteObject,,因而將持續(xù)類(lèi)java.rmi.server.RemoteObject 和java.rmi.server.RemoteServer 供給的遠(yuǎn)程行動(dòng)。
該類(lèi)能實(shí)現(xiàn)任意多的遠(yuǎn)程接口,。
該類(lèi)能擴(kuò)大其它遠(yuǎn)程實(shí)現(xiàn)類(lèi),。
該類(lèi)能定義遠(yuǎn)程接口中不涌現(xiàn)的方法,但這些方法只能在本地應(yīng)用而不能在遠(yuǎn)程應(yīng)用,。

  例如,,下面的類(lèi) BankAcctImpl 實(shí)現(xiàn) BankAccount 遠(yuǎn)程接口并擴(kuò)大java.rmi.server.UnicastRemoteObject 類(lèi):

package mypackage;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class BankAccountImpl extends UnicastRemoteObject implements
BankAccount

{
private float balance = 0.0;

public BankAccountImpl(float initialBalance)
throws RemoteException
{
balance = initialBalance;
}

public void deposit(float amount) throws RemoteException
{
...
}

public void withdraw(float amount) throws OverdrawnException,
RemoteException
{
...
}

public float getBalance() throws RemoteException
{
...
}
}


  留心:必要時(shí),實(shí)現(xiàn)遠(yuǎn)程接口的類(lèi)能擴(kuò)大除java.rmi.server.UnicastRemoteObject 類(lèi)以外的其它一些類(lèi),。但實(shí)現(xiàn)類(lèi)此時(shí)必須承擔(dān)起必定的責(zé)任,即導(dǎo)出對(duì)象(由 UnicastRemoteObject 結(jié)構(gòu)函數(shù)負(fù)責(zé))和實(shí)現(xiàn)從 java.lang.Object 類(lèi)持續(xù)的 hashCode,、 equals 和toString 方法的正確遠(yuǎn)程語(yǔ)義(假如需要),。


遠(yuǎn)程方法調(diào)用中的參數(shù)傳遞

  傳給遠(yuǎn)程對(duì)象的參數(shù)或源于它的返回值可以是任意可序列化的 Java 對(duì)象。這包含 Java 基礎(chǔ)類(lèi)型, 遠(yuǎn)程?Java 對(duì)象和實(shí)現(xiàn) java.io.Serializable 接口的非遠(yuǎn)程 Java 對(duì)象,。有關(guān)如何使類(lèi)序列化的具體信息,,參見(jiàn) Java“對(duì)象序列化規(guī)范”,。本地得不到的作為參數(shù)或返回值的類(lèi),可通過(guò) RMI 系統(tǒng)進(jìn)舉動(dòng)態(tài)下載,。

傳遞非遠(yuǎn)程對(duì)象

  非遠(yuǎn)程對(duì)象將作為遠(yuǎn)程方法調(diào)用的參數(shù)傳遞或作為遠(yuǎn)程方法調(diào)用的成果返回時(shí),,是通過(guò)復(fù)制傳遞的;也就是應(yīng)用 Java 對(duì)象序列化機(jī)制將該對(duì)象序列化,。因此,,在遠(yuǎn)程對(duì)象調(diào)用過(guò)程中,當(dāng)非遠(yuǎn)程對(duì)象作為參數(shù)或返回值傳遞時(shí),,非遠(yuǎn)程對(duì)象的內(nèi)容在調(diào)用遠(yuǎn)程對(duì)象之前將被復(fù)制,。從遠(yuǎn)程方法調(diào)用返回非遠(yuǎn)程對(duì)象時(shí),將在調(diào)用的虛擬機(jī)中創(chuàng)立新對(duì)象,。

傳遞遠(yuǎn)程對(duì)象

  當(dāng)將遠(yuǎn)程對(duì)象作為遠(yuǎn)程方法調(diào)用的參數(shù)或返回值傳遞時(shí),,遠(yuǎn)程對(duì)象的 stub 程序即被傳遞出往。作為參數(shù)傳遞的遠(yuǎn)程對(duì)象僅能實(shí)現(xiàn)遠(yuǎn)程接口,。

引用的完整性

  假如一個(gè)對(duì)象的兩個(gè)引用在單個(gè)遠(yuǎn)程方法調(diào)用中以參數(shù)情勢(shì)(或返回值情勢(shì))從一個(gè)虛擬機(jī)傳到另一個(gè)虛擬機(jī)中,,并且它們?cè)诎l(fā)送虛擬機(jī)中指向同一對(duì)象,則兩個(gè)引用在吸收虛擬機(jī)中將指向該對(duì)象的同一副本,。進(jìn)一步說(shuō)就是:在單個(gè)遠(yuǎn)程方法調(diào)用中,,RMI 系統(tǒng)將在作為調(diào)用參數(shù)或返回值傳遞的對(duì)象中保持引用的完整性。

類(lèi)注解

  當(dāng)對(duì)象在遠(yuǎn)程調(diào)用中被從一個(gè)虛擬機(jī)發(fā)送到另一個(gè)虛擬機(jī)中時(shí),,RMI 系統(tǒng)在調(diào)用流中用類(lèi)的信息 (URL) 給類(lèi)描寫(xiě)符加注解,,以便該類(lèi)能在吸收器上加載。在遠(yuǎn)程方法調(diào)用期間,,調(diào)用可隨時(shí)下載類(lèi),。

參數(shù)傳輸

  為將 RMI 調(diào)用的參數(shù)序列化到遠(yuǎn)程調(diào)用的目標(biāo)文件里,需要將該參數(shù)寫(xiě)進(jìn)作為java.io.ObjectOutputStream 類(lèi)的子類(lèi)的流中,。ObjectOutputStream 子類(lèi)將籠罩 replaceObject 方法,,目標(biāo)是用其相應(yīng)的 stub 類(lèi)代替每個(gè)遠(yuǎn)程對(duì)象。對(duì)象參數(shù)將通過(guò) ObjectOutputStream 的 writeObject 方法寫(xiě)進(jìn)流中,。而ObjectOutputStream 則通過(guò) writeObject 方法為每個(gè)寫(xiě)進(jìn)流中的對(duì)象(包含所寫(xiě)對(duì)象所引用的對(duì)象)調(diào)用 replaceObject 方法,。RMIObjectOutputStream子類(lèi)的 replaceObject 方法返回下列值:

  假如傳給 replaceObject 的對(duì)象是 java.rmi.Remote 的實(shí)例,則返回遠(yuǎn)程對(duì)象的 stub 程序,。遠(yuǎn)程對(duì)象的 stub 程序通過(guò)對(duì)java.rmi.server.RemoteObject.toStub方法的調(diào)用而獲得,。假如傳給 replaceObject 的對(duì)象不是 java.rmi.Remote 的實(shí)例,則只返回該對(duì)象,。

  RMI 的 ObjectOutputStream 子類(lèi)也實(shí)現(xiàn) annotateClass 方法,,該方法用類(lèi)的地位注解調(diào)用流以便能在吸收器中下載該類(lèi)。有關(guān)如何應(yīng)用 annotateClass的具體信息,,參見(jiàn)“動(dòng)態(tài)類(lèi)加載”一節(jié),。由于參數(shù)只寫(xiě)進(jìn)一個(gè) ObjectOutputStream,,所以指向調(diào)用程序同一對(duì)象的引用將在吸收器那里指向該對(duì)象的同一副本。在吸收器上,,參數(shù)將被單個(gè)ObjectInputStream 所讀取,。

  用于寫(xiě)對(duì)象的 ObjectOutputStream(類(lèi)似的還有用于讀對(duì)象的ObjectInputStream )的所有其它缺省行動(dòng)將保存在參數(shù)傳遞中。例如,,寫(xiě)對(duì)象時(shí)對(duì) writeReplace 的調(diào)用及讀對(duì)象時(shí)對(duì) readResolve 的調(diào)用就是由 RMI的參數(shù)編組與解編流完成的,。

  與上述 RMI 參數(shù)傳遞方法類(lèi)似,返回值(或異常)將被寫(xiě)進(jìn)ObjectOutputStream的子類(lèi)并和參數(shù)傳輸?shù)恼{(diào)換行動(dòng)雷同,。

定位遠(yuǎn)程對(duì)象

  我們專(zhuān)門(mén)供給了一種簡(jiǎn)略的領(lǐng)導(dǎo)名字服務(wù)器,,用于存儲(chǔ)對(duì)遠(yuǎn)程對(duì)象的已命名引用。應(yīng)用類(lèi) java.rmi.Naming 的基于 URL 的方法可以存儲(chǔ)遠(yuǎn)程對(duì)象引用,??蛻?hù)機(jī)要調(diào)用遠(yuǎn)程對(duì)象的方法,則必須首先得到該對(duì)象的引用,。對(duì)遠(yuǎn)程對(duì)象的引用通常是在方法調(diào)用中以返回值的情勢(shì)取得,。RMI 系統(tǒng)供給一種簡(jiǎn)略的領(lǐng)導(dǎo)名字服務(wù)器,通過(guò)它得到給定主機(jī)上的遠(yuǎn)程對(duì)象,。java.rmi.Naming 類(lèi)供給基于同一資源定位符 (URL) 的方法,,用來(lái)綁定、再綁定,、解開(kāi)和列出位于某一主機(jī)及端口上的名字-對(duì)象對(duì),。

J2EE的十三種技巧

Java數(shù)據(jù)庫(kù)連接(JDBC

  JDBC API以一個(gè)同一的方法訪問(wèn)各種數(shù)據(jù)庫(kù)。與ODBC類(lèi)似,,JDBC將開(kāi)發(fā)者和私有數(shù)據(jù)庫(kù)之間的標(biāo)題隔離開(kāi)來(lái),。由于它建立在Java上,因此JDBC可以供給平臺(tái)無(wú)關(guān)的數(shù)據(jù)庫(kù)訪問(wèn),。

  JDBC定義了4種不同的驅(qū)動(dòng),,具體來(lái)說(shuō),包含有:

  類(lèi)型1:JDBC-ODBC橋

  在JDBC剛產(chǎn)生時(shí),,JDBC-ODBC橋是非常有用的,。通過(guò)它,開(kāi)發(fā)者可以應(yīng)用JDBC來(lái)訪問(wèn)一個(gè)ODBC數(shù)據(jù)源,。毛病是,,它需要在客戶(hù)機(jī)器上安裝有一個(gè)ODBC驅(qū)動(dòng),該機(jī)器通常是應(yīng)當(dāng)運(yùn)行微軟Windows系統(tǒng)的,。應(yīng)用這一類(lèi)的驅(qū)動(dòng)器,,你就會(huì)失往JDBC平臺(tái)無(wú)關(guān)的利益。此外,,ODBV驅(qū)動(dòng)器需要客戶(hù)真?zhèn)€治理,。

  類(lèi)型2:JDBC-native驅(qū)動(dòng)橋

  JDBC-native驅(qū)動(dòng)橋供給了一個(gè)建筑在本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)上的JDBC接口--沒(méi)有應(yīng)用ODBC。JDBC驅(qū)動(dòng)將標(biāo)準(zhǔn)的JDBC調(diào)用轉(zhuǎn)變?yōu)閷?duì)數(shù)據(jù)庫(kù)API的本地調(diào)用,。應(yīng)用類(lèi)型2的驅(qū)動(dòng)也會(huì)失往JDBC平臺(tái)無(wú)關(guān)性的利益,,并且需要安裝客戶(hù)真?zhèn)€本地代碼。

  類(lèi)型3:JDBC-network橋

  JDBC-network橋不需要客戶(hù)真?zhèn)€數(shù)據(jù)庫(kù)驅(qū)動(dòng),。它們應(yīng)用網(wǎng)絡(luò)-服務(wù)器中層來(lái)訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),。這會(huì)引出諸如負(fù)載均衡、連接池等技巧,,數(shù)據(jù)緩沖也是可能的,。由于類(lèi)型3的驅(qū)動(dòng)通常可帶來(lái)相對(duì)小的下載時(shí)間,,它是平臺(tái)無(wú)關(guān)的,,并且不需要客戶(hù)真?zhèn)€安裝和治理,因此很適實(shí)用作Internet的利用,。

  類(lèi)型4:純Java驅(qū)動(dòng)

  類(lèi)型4應(yīng)用純Java數(shù)據(jù)庫(kù)驅(qū)動(dòng)來(lái)供給直接的數(shù)據(jù)庫(kù)訪問(wèn),。由于類(lèi)型4驅(qū)動(dòng)運(yùn)行在客戶(hù)端,并且直接訪問(wèn)數(shù)據(jù)庫(kù),,因此運(yùn)行在這個(gè)模式暗示要應(yīng)用一個(gè)兩層的系統(tǒng),。要在一個(gè)n層的系統(tǒng)中應(yīng)用類(lèi)型4的驅(qū)動(dòng),可以通過(guò)一個(gè)包含有數(shù)據(jù)訪問(wèn)代碼的EJB,,并且讓該EJB為它的客戶(hù)供給一個(gè)數(shù)據(jù)庫(kù)無(wú)關(guān)的服務(wù),。

Java命名和目錄接口(Java Naming and Directory Interface,JNDI)

  JNDI是Java Naming and Directory Interface 的簡(jiǎn)寫(xiě),,中意為:Java命名及目錄接口,,它是為了對(duì)高級(jí)網(wǎng)絡(luò)利用開(kāi)發(fā)中的應(yīng)用的目錄基礎(chǔ)結(jié)構(gòu)的訪問(wèn)。實(shí)際上這個(gè)目錄是一個(gè)特別的數(shù)據(jù)庫(kù),,供給了對(duì)存儲(chǔ)數(shù)據(jù)的快速訪問(wèn),,不象傳統(tǒng)的目錄服務(wù)訪問(wèn)方法-你必須供給不同的API接口往訪問(wèn)不同的目錄服務(wù)(如:LDAP,NIS,,ADS等),,而它供給了一種標(biāo)準(zhǔn)的API來(lái)訪問(wèn)類(lèi)型不同的目錄。據(jù)說(shuō),,應(yīng)用完整的SDK可以開(kāi)發(fā)那些JNDI還不支撐的目錄服務(wù)供給者,。

  JNDI是J2EE的一個(gè)API,供給了一套標(biāo)準(zhǔn)的接口,,以定位用戶(hù),、機(jī)器、網(wǎng)絡(luò),、對(duì)象,、以及服務(wù),。例如,你可以應(yīng)用JNDI來(lái)定位內(nèi)部網(wǎng)中的一臺(tái)打印機(jī),,你也可以應(yīng)用它來(lái)定位Java對(duì)象或連接到一個(gè)數(shù)據(jù)庫(kù),。JNDI可以用于EJB、RMI-IIOP,、JDBC中,。它是網(wǎng)絡(luò)查找定位的標(biāo)準(zhǔn)方法?! NDI API被用來(lái)訪問(wèn)命名和目錄服務(wù),。它供給一個(gè)相容的模式來(lái)訪問(wèn)和把持企業(yè)領(lǐng)域大的資源,例如一個(gè)利用服務(wù)器中的DNS,、LDAP,、本地文件系統(tǒng)或者對(duì)象。

  在JNDI中,,一個(gè)目錄結(jié)構(gòu)中的每一個(gè)節(jié)點(diǎn)被稱(chēng)為context,。每一個(gè)JNDI的名字都是與一個(gè)context相對(duì)的,沒(méi)有一個(gè)盡對(duì)名字的概念,。一個(gè)利用可以應(yīng)用InitialContext類(lèi)來(lái)得到它的第一個(gè)context:

   Context ctx = new InitialContext();

  通過(guò)這個(gè)初始的context,,利用就可以經(jīng)過(guò)目錄樹(shù)定位到需要的資源或者對(duì)象。例如,,假定你已經(jīng)在WebLogic Server中配置了一個(gè)EJB,,并且在myApp.myEJB中綁定了home接口。EJB的客戶(hù)端,,在得到這樣一個(gè)初始的context后,,然后就可以應(yīng)用以下的代碼來(lái)定位到home接口:

   MyEJBHome home = ctx.lookup( "myApp.myEJB" );

  一旦你得到你所需對(duì)象的一個(gè)引用--在這個(gè)例子中,就是EJB的home接口--然后你可以調(diào)用它上面的方法,。為了在一個(gè)context中查找到一個(gè)對(duì)象,,JNDI還供給方法可以做到:

  插進(jìn)或者綁定一個(gè)對(duì)象到一個(gè)context中。在你配置一個(gè)EJB時(shí),,這是非常有效的方法,;
  
  從一個(gè)context中移往一個(gè)對(duì)象

  列出一個(gè)context中的所有對(duì)象

  創(chuàng)立和刪除subcontexts

企業(yè)Java Beans(Enterprise Java Beans,EJB)

  J2EE其中一個(gè)引人注視標(biāo)技巧是EJB,。它供給了一個(gè)架構(gòu)來(lái)開(kāi)發(fā)和配置到客戶(hù)真?zhèn)€散布式貿(mào)易邏輯,,因此可以明顯減少開(kāi)發(fā)擴(kuò)大性、高度復(fù)雜企業(yè)利用的難度,。EJB規(guī)范定義了EJB組件應(yīng)當(dāng)如何及何時(shí)與它們的容器交互,。由容器來(lái)負(fù)責(zé)供給普通的服務(wù),例如目錄服務(wù)、事務(wù)治理,、安全,、資源池和容錯(cuò)。

  EJB規(guī)范定義了三類(lèi)基礎(chǔ)的bean:

  會(huì)話beans(session beans):會(huì)話beans為業(yè)務(wù)流程建模,,由于他們通常表現(xiàn)履行某個(gè)動(dòng)作,,因此可以把它們當(dāng)作是動(dòng)詞。這個(gè)履行的動(dòng)作可以是任何事情,,例如增長(zhǎng)數(shù)目,訪問(wèn)數(shù)據(jù)庫(kù),,調(diào)用其它系統(tǒng),,調(diào)用其它企業(yè)Bean。我們可以舉出很多的例子,,包含一個(gè)計(jì)價(jià)引擎,,一個(gè)工作流引擎,一個(gè)目錄引擎,,一個(gè)信用卡認(rèn)證中心,,或一個(gè)網(wǎng)上證券交易引擎。

  實(shí)體beans(Entity beans):這是持久保存數(shù)據(jù)的代表--范例的是存儲(chǔ)在數(shù)據(jù)庫(kù)中--因此在服務(wù)器崩潰后數(shù)據(jù)仍然存在,。多個(gè)客戶(hù)端可以應(yīng)用EJB來(lái)表現(xiàn)同樣的數(shù)據(jù),。實(shí)體beans為企業(yè)數(shù)據(jù)建模,由于它們表現(xiàn)數(shù)據(jù)對(duì)象(就是緩存數(shù)據(jù)庫(kù)信息的Java對(duì)象),,因此可以把它們當(dāng)作名詞,。實(shí)體beans的例子包含一種產(chǎn)品,一項(xiàng)訂單,,一個(gè)雇員,,一張信用卡,或一支股票,。會(huì)話beans范例的方法是通過(guò)實(shí)體beans來(lái)實(shí)現(xiàn)業(yè)務(wù)目標(biāo)的,,例如一個(gè)證券交易引擎(會(huì)話beans)處理股票(實(shí)體beans)。

  Message-Driven beans:Message-Driven beans也表現(xiàn)動(dòng)作,,這一點(diǎn)上它類(lèi)似于會(huì)話beans,。它們之間的不同點(diǎn)在于你只能夠通過(guò)發(fā)送消息給Message-Driven beans的方法來(lái)調(diào)用它們。Message-Driven beans的例子包含了吸收股票交易消息的beans,,信用認(rèn)證消息,,或工作流消息。這些Message-Driven beans也可以調(diào)用其它的企業(yè)beans,。

  接著,,我們討論無(wú)狀態(tài)和有狀態(tài)

  無(wú)狀態(tài)的beans(Stateless beans):這是一個(gè)單一應(yīng)用的服務(wù),不掩護(hù)任何的狀態(tài),在服務(wù)器崩潰時(shí)也不再存在,,而且生存期也相對(duì)地短,。例如,一個(gè)無(wú)狀態(tài)的session bean可能用作履行溫度轉(zhuǎn)換,。

  有狀態(tài)的bean:它供給了一個(gè)傳統(tǒng)的與客戶(hù)端交互的方法,,存儲(chǔ)客戶(hù)真?zhèn)€狀態(tài)。在線購(gòu)物車(chē)就是這樣一個(gè)有狀態(tài)session ean的典范例子,。有狀態(tài)session beans在服務(wù)器崩潰時(shí)也不再存在,,而且生存期也相對(duì)地短,并且每個(gè)實(shí)例只可以用在一個(gè)單一的線程中,。

JavaServer Pages (JSPs)

  或許你已經(jīng)對(duì)微軟的Active Server Pages (ASPs)非常熟悉,;JSP也是類(lèi)似的技巧,不過(guò)它是平臺(tái)無(wú)關(guān)的,。它們都是設(shè)計(jì)來(lái)贊助web內(nèi)容開(kāi)發(fā)者應(yīng)用相對(duì)較少的代碼就可以創(chuàng)立動(dòng)態(tài)的網(wǎng)頁(yè),。web設(shè)計(jì)者即使不懂得編程,也可以應(yīng)用JSP來(lái)創(chuàng)立動(dòng)態(tài)的網(wǎng)頁(yè),。JavaServer Page是HTML代碼和Java代碼的混雜,。在客戶(hù)懇求頁(yè)面的時(shí)候,服務(wù)器就會(huì)處理Java代碼,,然后返回HTML頁(yè)面給瀏覽器,。

  你可以也聽(tīng)過(guò)JHTML,它是一個(gè)舊的標(biāo)準(zhǔn),,現(xiàn)在已經(jīng)被JSP代替了,。WebLogic Server不但支撐JSP,還支撐JHTML,。不過(guò),,在默認(rèn)設(shè)置下,WebLogic Server是不支撐JSP的(對(duì)于5.1版本),。你必須編輯weblogic.properties來(lái)激活web服務(wù)器,,對(duì)于JSPServlet來(lái)說(shuō),也是這樣,。

Java servlets

  servlets供給的功效大部分JSP雷同,,它采用的是一個(gè)有點(diǎn)不同的方法。JSP中大部分是HTML代碼,,其中只有少量的Java代碼,,而servlets則相反,它完整應(yīng)用Java編寫(xiě),,并且產(chǎn)生HTML代碼,。

  servlet是一個(gè)在服務(wù)器上運(yùn)行的Java小程序,,它可以擴(kuò)大Web服務(wù)器的功效。這些服務(wù)器真?zhèn)€利用可以在被懇求時(shí)動(dòng)態(tài)履行,,與傳統(tǒng)Web服務(wù)器上的CGI Perl腳本差未幾,。CGI腳本和servlet的一個(gè)重要不同是:CGI腳本對(duì)于每次懇求都啟動(dòng)一個(gè)全新的過(guò)程--需要額外的系統(tǒng)開(kāi)銷(xiāo)--而servlet的履行只要在servlet引擎內(nèi)啟動(dòng)一個(gè)獨(dú)立的線程就性了。因此Servlet的擴(kuò)大性也更好,。

  在開(kāi)發(fā)servlet時(shí),,你通常都要擴(kuò)大javax.servlet.http.HttpServlet類(lèi),并且籠罩它的一些方法,。感愛(ài)好的方法包含有:

  service(): 作為command-specific方法的一個(gè)調(diào)度程序

  doGet(): 處理來(lái)自一個(gè)客戶(hù)的HTTP GET懇求

  doPost(): 處理來(lái)自一個(gè)客戶(hù)的HTTP POST懇求

  還有一些其它的方法來(lái)處理不同類(lèi)型的HTTP懇求--可參考HttpServlet API的文本來(lái)得到更多相干的信息,。

Java IDL/CORBA

  通過(guò)Java的IDL支撐,開(kāi)發(fā)者可以將Java與CORBA集成,。他們可以創(chuàng)立能配置在一個(gè)CORBA ORB中的Java對(duì)象,,也可以創(chuàng)立作為配置在其它ORB內(nèi)的CORBA對(duì)象客戶(hù)真?zhèn)€Java類(lèi)。對(duì)于通過(guò)Java將你的新利用和以前的系統(tǒng)集成,,后者供給了一個(gè)另外的方法。

Java事務(wù)系統(tǒng)(JTA)/Java事務(wù)服務(wù)(JTS)

  JTA定義了一個(gè)標(biāo)準(zhǔn)的API,,利用可以通過(guò)它來(lái)訪問(wèn)事務(wù)監(jiān)控器,。

  JTS是CORBA OTS事務(wù)監(jiān)控器的一個(gè)基礎(chǔ)實(shí)現(xiàn)。JTS指定了一個(gè)事務(wù)治理器的實(shí)現(xiàn)(Transaction Manager),,這個(gè)治理器在一個(gè)高級(jí)別上支撐Java事務(wù)API(JTA)規(guī)范,,并且在一個(gè)低級(jí)別上實(shí)現(xiàn)了OMG OTS規(guī)范的Java映射。一個(gè)JTS事務(wù)治理器為利用服務(wù)器,、資源治理器,、standalone利用和通信資源治理器供給事務(wù)服務(wù)。

JavaMail和JavaBeans激活架構(gòu)(JavaBeans Activation Framework,,JAF)

  JavaMail是一個(gè)用來(lái)訪問(wèn)郵件服務(wù)器的API,。JavaMail API供給了一套抽象類(lèi)來(lái)模型化一個(gè)郵件系統(tǒng)。支撐SMTP和IMAP服務(wù)器,。

  JavaMail通過(guò)應(yīng)用JavaBeans Activation Framework (JAF) 來(lái)處理MIME加密的郵件附件,。MIME字節(jié)流和Java對(duì)象間可以互相轉(zhuǎn)化。大多數(shù)的利用無(wú)需要直接應(yīng)用JAF,。

Java信使服務(wù)(Java Messaging Service,,JMS)

  JMS是一個(gè)用來(lái)和面向信息的中層通信的API。它不但支撐點(diǎn)對(duì)點(diǎn)的域,,也支撐發(fā)布/訂閱域,,并且供給對(duì)擔(dān)保信息傳送、事務(wù)信息傳送,、持久信息和durable subscribers的支撐,。對(duì)于將你的利用和以前的backend系統(tǒng)集成,JMS供給了另外一個(gè)方法。

擴(kuò)大標(biāo)記語(yǔ)言(Extensible Markup Language,,XML)

  XML是一個(gè)用來(lái)定義其它標(biāo)記語(yǔ)言的的語(yǔ)言,。它可被用作貿(mào)易之間的數(shù)據(jù)共享。XML的發(fā)展是與Java離開(kāi)的,;不過(guò),,它的目標(biāo)和Java類(lèi)似,都是為了與平臺(tái)無(wú)關(guān),。通過(guò)將Java與XML聯(lián)合,,你可以得到一個(gè)完整平臺(tái)無(wú)關(guān)的解決方案。多個(gè)公司都為在Java和XML間開(kāi)發(fā)一個(gè)緊密的集成而工作,。具體的信息,,可瀏覽Sun站點(diǎn)的Java-XML部分(http://java./xml),以及IBM的developerWorks的XML Zone部分(http://www.ibm.com/developer/xml/),。
 
 
 
 

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多