JavaBean是一種JAVA語言寫成的可重用組件。為寫成JavaBean,類必須是具體的和公共的,并且具有無參數(shù)的構(gòu)造器。JavaBean通過提供符合一致性設(shè)計(jì)模式的公共方法將內(nèi)部域暴露稱為屬性。眾所周知,屬性名稱符合這種模式,其他Java 類可以通過自省機(jī)制發(fā)現(xiàn)和操作這些JavaBean的屬性。
功能特點(diǎn)
用戶可以使用JavaBean將功能、處理、值、數(shù)據(jù)庫訪問和其他任何可以用java代碼創(chuàng)造的對象進(jìn)行打包,并且其他的開發(fā)者可以通過內(nèi)部的JSP頁面、Servlet、其他JavaBean、applet程序或者應(yīng)用來使用這些對象。用戶可以認(rèn)為JavaBean提供了一種隨時(shí)隨地的復(fù)制和粘貼的功能,而不用關(guān)心任何改變。JavaBean可分為兩種:一種是有用戶界面(UI,User?Interface)的JavaBean;還有一種是沒有用戶界面,主要負(fù)責(zé)處理事務(wù)(如數(shù)據(jù)運(yùn)算,操縱數(shù)據(jù)庫)的JavaBean。JSP通常訪問的是后一種JavaBean。JavaBean是可復(fù)用的平臺獨(dú)立的軟件組件,開發(fā)者可以在軟件構(gòu)造器工具中對其直接進(jìn)行可視化操作。軟件構(gòu)造器工具可以是Web頁面構(gòu)造器、可視化應(yīng)用程序構(gòu)造器、GUI設(shè)計(jì)構(gòu)造器或服務(wù)器應(yīng)用程序構(gòu)造器。有時(shí),構(gòu)造器工具也可以是一個(gè)包含了一些bean的復(fù)合文檔的文檔編輯器。JavaBean可以是簡單的GUI要素,如按鈕或滾動條;也可以是復(fù)雜的可視化軟件組件,如數(shù)據(jù)庫視圖,有些JavaBean是沒有GUI表現(xiàn)形式的,但這些JavaBean仍然可以使用應(yīng)用程序構(gòu)造器可視化地進(jìn)行組合。一個(gè)JavaBean和一個(gè)Applet相似,是一個(gè)非常簡單的遵循某種嚴(yán)格協(xié)議的Java類。每個(gè)JavaBean的功能都可能不一樣,但它們都必須支持以下特征。一個(gè)bean沒有必須繼承的特定的基類或接口。可視化的bean必須繼承的類是java.awt.Component,這樣它們才能添加到可視化容器中去,非可視化bean則不需要繼承這個(gè)類。有許多bean,無論是在應(yīng)用程序構(gòu)造器工具中,還是在最后創(chuàng)建好的應(yīng)用程序中,都具有很強(qiáng)的可視化特征,但這并非每個(gè)bean必須的特征。在使用Java編程時(shí),并不是所有軟件模塊都需要轉(zhuǎn)換成bean。Bean比較適合于那些具有可視化操作和定制特性的軟件組件。從基本上說,JavaBean可以看成是一個(gè)黑盒子,即只需要知道其功能而不必管其內(nèi)部結(jié)構(gòu)的軟件設(shè)備。黑盒子只介紹和定義其外部特征和與其他部分的接口,如按鈕、窗口、顏色、形狀、句柄等。通過將系統(tǒng)看成使用黑盒子關(guān)聯(lián)起來的通訊網(wǎng)絡(luò),我們可以忽略黑盒子內(nèi)部的系統(tǒng)細(xì)節(jié),從而有效地控制系統(tǒng)的整體性能。作為一個(gè)黑盒子的模型,JavaBean有3個(gè)接口面,可以獨(dú)立進(jìn)行開發(fā)。1.?JavaBean可以調(diào)用的方法。2.?JavaBean提供的可讀寫的屬性。3.?JavaBean向外部發(fā)送的或從外部接收的事件。
組成
一個(gè)JavaBean由3部分組成:
(1)屬性(properties)
JavaBean提供了高層次的屬性概念,屬性在JavaBean中不只是傳統(tǒng)的面向?qū)ο蟮母拍罾锏膶傩裕瑫r(shí)還得到了屬性讀取和屬性寫入的API的支持。屬性值可以通過調(diào)用適當(dāng)?shù)腷ean方法進(jìn)行。比如,可能bean有一個(gè)名字屬性,這個(gè)屬性的值可能需要調(diào)用StringgetName()方法讀取,而寫入屬性值可能要需要調(diào)用voidsetName(Stringstr)的方法。
每個(gè)JavaBean屬性通常都應(yīng)該遵循簡單的方法命名規(guī)則,這樣應(yīng)用程序構(gòu)造器工具和最終用戶才能找到JavaBean提供的屬性,然后查詢或修改屬性值,對bean進(jìn)行操作。JavaBean還可以對屬性值的改變作出及時(shí)的反應(yīng)。比如一個(gè)顯示當(dāng)前時(shí)間的JavaBean,如果改變時(shí)鐘的時(shí)區(qū)屬性,則時(shí)鐘會立即重畫,顯示當(dāng)前指定時(shí)區(qū)的時(shí)間。
(2)方法(method)
JavaBean中的方法就是通常的Java方法,它可以從其他組件或在腳本環(huán)境中調(diào)用。默認(rèn)情況下,所有bean的公有方法都可以被外部調(diào)用,但bean一般只會引出其公有方法的一個(gè)子集。
由于JavaBean本身是Java對象,調(diào)用這個(gè)對象的方法是與其交互作用的唯一途徑。JavaBean嚴(yán)格遵守面向?qū)ο蟮念愒O(shè)計(jì)邏輯,不讓外部世界訪問其任何字段(沒有public字段)。這樣,方法調(diào)用是接觸Bean的唯一途徑。
但是和普通類不同的是,對有些Bean來說,采用調(diào)用實(shí)例方法的低級機(jī)制并不是操作和使用Bean的主要途徑。公開Bean方法在Bean操作中降為輔助地位,因?yàn)閮蓚€(gè)高級Bean特性--屬性和事件是與Bean交互作用的更好方式。
因此Bean可以提供要讓客戶使用的public方法,但應(yīng)當(dāng)認(rèn)識到,Bean設(shè)計(jì)人員希望看到絕大部分Bean的功能反映在屬性和事件中,而不是在人工調(diào)用和各個(gè)方法中。
(3)事件(event)
Bean與其他軟件組件交流信息的主要方式是發(fā)送和接受事件。我們可以將bean的事件支持功能看作是集成電路中的輸入輸出引腳:工程師將引腳連接在一起組成系統(tǒng),讓組件進(jìn)行通訊。有些引腳用于輸入,有些引腳用于輸出,相當(dāng)于事件模型中的發(fā)送事件和接收事件。
事件為JavaBean組件提供了一種發(fā)送通知給其他組件的方法。在AWT事件模型中,一個(gè)事件源可以注冊事件監(jiān)聽器對象。當(dāng)事件源檢測到發(fā)生了某種事件時(shí),它將調(diào)用事件監(jiān)聽器對象中的一個(gè)適當(dāng)?shù)氖录幚矸椒▉硖幚磉@個(gè)事件。
由此可見,JavaBean確實(shí)也是普通的Java對象,只不過它遵循了一些特別的約定而已。
范圍
JavaBean 的范圍 Scope 是一個(gè)具有生命時(shí)間的變量。JavaBean的范圍在標(biāo)志中右邊進(jìn)行表示。將產(chǎn)生一個(gè)JavaBean的快捷參考。
說明:jsp服務(wù)器引擎將剝離
存在下面四種范圍:頁面page、請求request、對話session、應(yīng)用application。
對話范圍
對話范圍的JavaBean 主要應(yīng)用于跨多個(gè)頁面和時(shí)間段:例如填充 用戶信息。添加信息并且接受回饋,保存用戶最近執(zhí)行頁面的軌跡。對話范圍JavaBean保留一些和用戶對話 ID 相關(guān)的信息。這些信息來自臨時(shí)的對話cookie,并在當(dāng)用戶關(guān)閉瀏覽器時(shí),這個(gè)cookie將從客戶端和服務(wù)器刪除。
請求范圍
頁面和請求范圍的JavaBean有時(shí)類似表單的bean,這是因?yàn)?他們大都用于處理表單。表單需要很長的時(shí)間來處理用戶的輸入,通常情況下用于頁面接受HTTP/POST或者GET請求。另外頁面和請求范圍的bean可以用于減少大型站點(diǎn)服務(wù)器上的負(fù)載,如果使用對話bean,耽擱的處理就可能會消耗掉很多資源。
應(yīng)用范圍
應(yīng)用范圍通常應(yīng)用于服務(wù)器的部件,例如 Java數(shù)據(jù)庫連接連接池、應(yīng)用監(jiān)視、用戶計(jì)數(shù)和其他參與用戶行為的類。
在Bean中限制HTML的產(chǎn)生:
理論上,JavaBean 將不會產(chǎn)生任何HTML,因?yàn)檫@是jsp層負(fù)責(zé)的工作;然而,為動態(tài)消息提供一些預(yù)先準(zhǔn)備的格式是非常有用的。產(chǎn)生的HTML將被標(biāo)注的 JavaBean方法返回。
這里有一些非常重要的事情:
1. 不要試圖在JavaBean返回的HTML中放置任何字體尺寸。
并不是所有的瀏覽器都相同。很多瀏覽器無法處理完整的字體尺寸。
2. 不要試圖在JavaBean返回的HTML中放置任何腳本或者DHTML。
向頁面直接輸出腳本或者DHTML相當(dāng)于自我毀滅,因?yàn)槟承g覽器版本在處理不正確的腳本時(shí)會崩潰(非常少但是有)。如果用戶的JavaBean在運(yùn)行時(shí)是動態(tài)的推出復(fù)雜的HTML語言,用戶將陷入調(diào)試的噩夢。另外,復(fù)雜的HTML將限制JavaBean的壽命和靈活性。
3. 不要提供任何的選擇。
如果用戶使用不同的系統(tǒng)瀏覽頁面,可以提供一種可以替換的方法。
按著Sun公司的定義,JavaBean是一個(gè)可重復(fù)使用的軟件組件。實(shí)際上JavaBean是一種Java類,通過封裝屬性和方法成為具有某種功能或者處理某個(gè)業(yè)務(wù)的對象,簡稱bean。由于javabean是基于java語言的,因此javabean不依賴平臺,具有以下特點(diǎn):
1. 可以實(shí)現(xiàn)代碼的重復(fù)利用
2. 易編寫、易維護(hù)、易使用
3. 可以在任何安裝了Java運(yùn)行環(huán)境的平臺上的使用,而不需要重新編譯。
編寫javabean就是編寫一個(gè)java的類,所以你只要會寫類就能編寫一個(gè)bean,這個(gè)類創(chuàng)建的一個(gè)對象稱做一個(gè)bean。為了能讓使用這個(gè)bean的應(yīng)用程序構(gòu)建工具(比如JSP引擎)知道這個(gè)bean的屬性和方法,只需在類的方法命名上遵守以下規(guī)則:
1. 如果類的成員變量的名字是xxx,那么為了更改或獲取成員變量的值,即更改或獲取屬性,在類中可以使用兩個(gè)方法:
getXxx(),用來獲取屬性xxx。
setXxx(),用來修改屬性xxx.。
2. 對于boolean類型的成員變量,即布爾邏輯類型的屬性,允許使用"is"代替上面的"get"。
3. 類中訪問屬性的方法都必須是public的,一般屬性是private的。
4. 類中如果有構(gòu)造方法,那么這個(gè)構(gòu)造方法也是public的并且是無參數(shù)的。
任務(wù)
JavaBean的任務(wù)就是:“Write?once,?run?anywhere,?reuse?everywhere”,即“一次性編寫,任何地方執(zhí)行,任何地方重用”。這個(gè)任何實(shí)際上就是要解決困擾軟件工業(yè)的日益增加的復(fù)雜性,提供一個(gè)簡單的、緊湊的和優(yōu)秀的問題解決方案。1.?一個(gè)開發(fā)良好的軟件組件應(yīng)該是一次性地編寫,而不需要再重新編寫代碼以增強(qiáng)或完善功能。因此,JavaBean應(yīng)該提供一個(gè)實(shí)際的方法來增強(qiáng)現(xiàn)有代碼的利用率,而不再需要在原有代碼上重新進(jìn)行編程。除了在節(jié)約開發(fā)資源方面的意義外,一次性地編寫JavaBean組件也可以在版本控制方面起到非常好的作用。開發(fā)者可以不斷地對組件進(jìn)行改進(jìn),而不必從頭開始編寫代碼。這樣就可以在原有基礎(chǔ)上不斷提高組件功能,而不會犯相同的錯(cuò)誤。2.?JavaBean組件在任意地方運(yùn)行是指組件可以在任何環(huán)境和平臺上使用,這可以滿足各種交互式平臺的需求。由于JavaBean是基于Java的,所以它可以很容易地得到交互式平臺的支持。JavaBean組件在任意地方執(zhí)行不僅是指組件可以在不同的操作平臺上運(yùn)行,還包括在分布式網(wǎng)絡(luò)環(huán)境中運(yùn)行。3.JavaBean組件在任意地方的重用說的是它能夠在包括應(yīng)用程序、其他組件、文檔、Web站點(diǎn)和應(yīng)用程序構(gòu)造器工具的多種方案中再利用。這也許是JavaBean組件的最為重要的任務(wù)了,因?yàn)樗荍avaBean組件區(qū)別于Java程序的特點(diǎn)之一。Java程序的任務(wù)就是JavaBean組件所具有的前兩個(gè)任務(wù),而這第3個(gè)任務(wù)卻是JavaBean組件獨(dú)有的。
設(shè)計(jì)目標(biāo)
現(xiàn)在我們來看一實(shí)現(xiàn)JavaBean的一些具體的主要設(shè)計(jì)目標(biāo):
1.緊湊而方便的創(chuàng)建和使用
JavaBean緊湊性的需求是基于JavaBean組件常常用于分布式計(jì)算環(huán)境中,這使得JavaBean組件常常需要在有限的帶寬連接環(huán)境下進(jìn)行傳輸。顯然,為了適應(yīng)傳送的效率和速度,JavaBean組件必須是越緊湊越好。另外,為了更好地創(chuàng)建和使用組件,就應(yīng)該使其越簡單越好。通常為了提高組件的簡易性和緊湊性,設(shè)計(jì)過程需要投入相對較大的功夫。
現(xiàn)在已有的組件軟件技術(shù)通常是使用復(fù)雜的API,這常常搞得開發(fā)者在創(chuàng)建組件時(shí)暈頭轉(zhuǎn)向。因此,JavaBean組件必須不僅容易使用,而且必須便于開發(fā)。這對于組件開發(fā)者而言是至關(guān)重要的,因?yàn)檫@可以使得開發(fā)者不必花大量功夫在使用API進(jìn)行程序設(shè)計(jì)上,從而更好地對組件進(jìn)行潤飾,提高組件的可觀賞性。
JavaBean組件大部分是基于已有的傳統(tǒng)Java編程的類結(jié)構(gòu)上的,這對于那些已經(jīng)可以熟練地使用Java語言的開發(fā)者非常有利。而且這可以使得JavaBean組件更加緊湊,因?yàn)镴ava語言在編程上吸收了以前的編程語言中的大量優(yōu)點(diǎn),已經(jīng)使開發(fā)出來的程序變得相當(dāng)有效率。
2.完全的可移植性
JavaBean API與操作基礎(chǔ)的獨(dú)立于平臺的Java系統(tǒng)相結(jié)合,提供了獨(dú)立于平臺的組件解決方案。因此,組件開發(fā)者就可以不必再為帶有Java applet平臺特有的類庫而擔(dān)心了。最終的結(jié)果都將是計(jì)算機(jī)界共享可重復(fù)使用的組件,并在任何支持Java的系統(tǒng)中無需修改地執(zhí)行。
3.繼承Java的強(qiáng)大功能
現(xiàn)有的Java結(jié)構(gòu)已經(jīng)提供了多種易于應(yīng)用于組件的功能。其中一個(gè)比較重要的是Java本身的內(nèi)置類發(fā)現(xiàn)功能,它可以使得對象在運(yùn)行時(shí)彼此動態(tài)地交互作用,這樣對象就可以從開發(fā)系統(tǒng)或其開發(fā)歷史中獨(dú)立出來。
對于JavaBean而言,由于它是基于Java語言的,所以它就自然地繼承了這個(gè)對于組件技術(shù)而言非常重要的功能,而不再需要任何額外開銷來支持它。
JavaBean繼承在現(xiàn)有Java功能中還有一個(gè)重要的方面,就是持久性,它保存對象并獲得對象的內(nèi)部狀態(tài)。通過Java提供的序列化(serialization)機(jī)制,持久性可以由JavaBean自動進(jìn)行處理。當(dāng)然,在需要的時(shí)候,開發(fā)者也可以自己建立定制的持久性方案。
4.應(yīng)用程序構(gòu)造器支持
JavaBean的另一個(gè)設(shè)計(jì)目標(biāo)是設(shè)計(jì)環(huán)境的問題和開發(fā)者如何使用JavaBean創(chuàng)建應(yīng)用程序。JavaBean體系結(jié)構(gòu)支持指定設(shè)計(jì)環(huán)境屬性和編輯機(jī)制以便于JavaBean組件的可視化編輯。這樣開發(fā)者可以使用可視化應(yīng)用程序構(gòu)造器無縫地組裝和修改JavaBean組件。就像Windows平臺上的可視化開發(fā)工具VBX或OCX控件處理組件一樣。通過這種方法,組件開發(fā)者可以指定在開發(fā)環(huán)境中使用和操作組件的方法。
5.分布式計(jì)算支持
支持分布式計(jì)算雖然不是JavaBean體系結(jié)構(gòu)中的核心元素,但也是JavaBean中的一個(gè)主要問題。
JavaBean使得開發(fā)者可以在任何時(shí)候使用分布式計(jì)算機(jī)制,但不使用分布式計(jì)算的核心支持來給自己增加額外負(fù)擔(dān)。這正是出于JavaBean組件的緊湊性考慮的,無疑分布式計(jì)算需要大量的額外開銷。
需求
JavaBean是java類,屬于某些特定的譯碼指導(dǎo)方針,并且擴(kuò)展了適應(yīng)性和范圍,允許用戶訪問內(nèi)部的屬性和方法。通過這些,JavaBean類可以用于下列方法:1.?在IDE中,JavaBean的功能允許應(yīng)用開發(fā)者瀏覽其中的方法,即JavaBean是被編譯的,并且無法利用原始的源文件。2.?在?Remote?Method?Invocation(RMI)?的分布式風(fēng)格中,這項(xiàng)功能聽起來并不讓人興奮,但是在未來的包含企業(yè)版的JavaBean后,將改變這種情況。3.?為了JavaBean的屬性值和狀態(tài)可以保存到磁盤上。
界限
雖然JavaBean和Java之間已經(jīng)有了明確的界限,但在某些方面JavaBean和Java之間仍然存在著非常明顯的混淆。Java確實(shí)是能夠?yàn)橛脩魟?chuàng)建可重用的對象,但它卻沒有管理這些對象相互作用的規(guī)則或標(biāo)準(zhǔn)。JavaBean通過指定定義對象之間交互作用的機(jī)制,以及大部分對象需要支持的常用行為,如持久性和實(shí)際處理等,建立了自己需要的組件模型。雖然當(dāng)前的Java組件模型也可以運(yùn)行得很好,但在傳送真正的可重用性和交互操作性上仍然非常有限,Java用戶需要做的最多的一件事就是創(chuàng)建Applet并使得它們在Web?頁面上相互通訊,這并非易事。JavaBean提供了一個(gè)框架包,使用這個(gè)包進(jìn)行通訊就容易得多了。JavaBean組件能夠通過定義好的標(biāo)準(zhǔn)屬性改進(jìn)性能。總體而言,JavaBean充分發(fā)展了Java?applet的功能,并結(jié)合了JavaAWT組件的緊湊性和可重用性。
三大構(gòu)件
Java bean:編程語言java中的術(shù)語,行業(yè)內(nèi)通常稱為java豆,帶點(diǎn)美哩口味,飄零著咖啡的味道,在計(jì)算機(jī)編程中代表java構(gòu)件(EJB的構(gòu)件),通常有Session bean,Entity bean,MessageDrivenBean三大類。
Session bean:會話構(gòu)件,是短暫的對象,運(yùn)行在服務(wù)器上,并執(zhí)行一些應(yīng)用邏輯處理,它由客戶端應(yīng)用程序建立,其數(shù)據(jù)需要自己來管理。分為無狀態(tài)和有狀態(tài)兩種。
Entity bean:實(shí)體構(gòu)件,是持久對象,可以被其他對象調(diào)用。在建立時(shí)指定一個(gè)唯一標(biāo)示的標(biāo)識,并允許客戶程序,根據(jù)實(shí)體bean標(biāo)識來定位beans實(shí)例。多個(gè)實(shí)體可以并發(fā)訪問實(shí)體bean,事務(wù)間的協(xié)調(diào)由容器來完成。
MessageDriven Bean:消息構(gòu)件,是專門用來處理JMS(Java Message System)消息的規(guī)范(EIB2.0)。JMS是一種與廠商無關(guān)的API,用來訪問消息收發(fā)系統(tǒng),并提供了與廠商無關(guān)的訪問方法,以此來訪問消息收發(fā)服務(wù)。JMS客戶機(jī)可以用來發(fā)送消息而不必等待回應(yīng)。
發(fā)展
最初,JavaBean的目的是為了將可以重復(fù)使用的軟件代碼打包標(biāo)準(zhǔn)。特別是用于幫助廠家開發(fā)在綜合開發(fā)環(huán)境(IDE)下使用的java軟件部件。這些包括如Grid控件,用戶可以將該部件拖放到開發(fā)環(huán)境中。從此,JavaBean就可以擴(kuò)展為一個(gè)java web 應(yīng)用的標(biāo)準(zhǔn)部件,并且JavaBean部件框架已經(jīng)擴(kuò)展為企業(yè)版的 Bean(EJB)。
開發(fā)環(huán)境
普通JavaBean組件是要分布在各自環(huán)境中,所以它們應(yīng)該能夠適應(yīng)各種環(huán)境。雖然我們無法事先預(yù)知JavaBean要運(yùn)行的確切環(huán)境,但以下兩點(diǎn)是可以確定的:
1. bean必須能夠在一個(gè)應(yīng)用程序 構(gòu)造器工具中運(yùn)行。
2. bean必須可以在產(chǎn)生的應(yīng)用程序的運(yùn)行環(huán)境中使用。
設(shè)計(jì)環(huán)境
第一點(diǎn)說明的是bean必須可以在設(shè)計(jì)環(huán)境(設(shè)計(jì) environment)中運(yùn)行。在設(shè)計(jì)環(huán)境中,bean應(yīng)該提供設(shè)計(jì)信息給應(yīng)用程序 構(gòu)造器工具并允許終端用戶制定bean的外觀和行為。
在傳統(tǒng)的軟件構(gòu)造活動中,必須通過編譯、鏈接之后才能看到應(yīng)用程序的最終運(yùn)行結(jié)果;而利用JavaBean設(shè)計(jì)的軟件中,則沒有這種明確的界限。使用JavaBean,就可以非常直觀地設(shè)計(jì)應(yīng)用程序軟件,在設(shè)計(jì)過程中賦予軟件生機(jī)。而且,這個(gè)過程更加容易重復(fù)開發(fā),設(shè)計(jì)思想更加容易變成原型。
運(yùn)行環(huán)境
第二點(diǎn)說明的是bean必須可以在運(yùn)行環(huán)境(run-時(shí)間 environment)中使用。在這個(gè)環(huán)境中,對設(shè)計(jì)信息和定制的需求并不重要。一個(gè)組件的設(shè)計(jì)環(huán)境信息和設(shè)計(jì)環(huán)境中編寫的代碼通常可能是非常巨大的。
因此,我們可能需要在bean的設(shè)計(jì)環(huán)境方面和運(yùn)行環(huán)境方面作一個(gè)明確的區(qū)分,這樣,就可能需要在運(yùn)行環(huán)境中不使用bean的任何設(shè)計(jì)環(huán)境代碼來配置這個(gè)bean。所以,JavaBean就必須分別支持運(yùn)行環(huán)境接口的類庫和設(shè)計(jì)環(huán)境接口的類庫。
入門
一般要求
首先,您必須有一個(gè)不帶有參數(shù)的公用構(gòu)造器。此構(gòu)造器也應(yīng)該通過調(diào)用各個(gè)特性的設(shè)置方法來設(shè)置特性的缺省值,例如: public Fireworks()
{
setAutoStart(true);
setBackground(Color.黑色);
setSpeed(10);
setRadius(40);
.
.
.
}
如果 bean 是一個(gè)從 java.awt.Component 類繼承而來的可視 bean,您就應(yīng)該為 bean 定義一個(gè)缺省的首選大小,例如:
public Dimension getPreferredSize()
{
return (new Dimension(radius*3, radius*3));
}
public Dimension getMinimumSize()
{
return getPreferredSize();
}
特性
對于您需要的每個(gè)特性,您應(yīng)該有一個(gè)帶有匹配公用 getter 和 setter 方法的專用實(shí)例變量,例如: private int speed;
.
.
.
public int getSpeed()
{
return speed;
}
public void setSpeed(int s)
{
speed = s;
}
此 get 和 set 方法必須有與實(shí)例變量相同的名稱,但是第一個(gè)字母要大寫并以 get 和 set 開頭。
由于連接而在任何時(shí)候更改它們的特性時(shí),確認(rèn) Bean 在運(yùn)行時(shí)行為正確也是很重要的。如果特性的更改影響到 Bean 的可視外觀,您應(yīng)該以此特性設(shè)置的方法來調(diào)用
repaint();。
同樣,如果特性的更改影響到 bean 的大小和位置,您需要確認(rèn)獲得驗(yàn)證的事物。我們建議編寫您自己的 validateAll 方法,如下所示:
private void validateAll()
{
if (isValid())
{
Component self = this;
self.invalidate();
Component myParent = self.getParent();
if (myParent != null)
{
myParent.invalidate();
self = myParent;
}
self.validate();
}
}
然后以此特性設(shè)置的方法調(diào)用
validateAll();。
bean 類將無法進(jìn)行關(guān)于調(diào)用特性設(shè)置方法命令的假設(shè)。您應(yīng)該寫 bean 以便可以初始構(gòu)造它,然后在不引起錯(cuò)誤的同時(shí)在任何命令中設(shè)置其特性。
操作
對于每個(gè)您需要的操作,您應(yīng)該有一個(gè)公用方法,例如: public void start()
{
if(thread==null)
{
thread=new Thread(this);
thread.start();
}
}
您為操作寫的方法應(yīng)該在無須期待用戶創(chuàng)建連接或設(shè)置很多特性的情況下獨(dú)立操作。例如,如果您寫了一個(gè)音頻 Bean,您希望通過播放操作處理打開聲音的所有步驟、完成您需要的所有設(shè)置并播放聲音。同樣,即使聲音未播放,停止操作也應(yīng)起作用。
事件
對于您需要的每個(gè)事件或事件設(shè)置,您應(yīng)該定義事件和偵聽器類。對于此例,查看 FireworksEvent.java 源文件以及 Fireworks.java 文件。此事件類的源應(yīng)該如同這樣:
import java.awt.*;
import java.util.*;
publicclassFireworksEvent extends EventObject
{
public static final int EXPLODED = 1;
int id = 0;
public FireworksEvent(Component source, int id)
{
super(source);
= id;
}
public int getID()
{
return id;
}
}
您應(yīng)該為此事件設(shè)置中的每個(gè)事件定義一個(gè)公用靜態(tài)結(jié)束事件標(biāo)識符,例如在此例子中的 EXPLODED。
對于偵聽器類的源,查看 FireworksListener.java源文件:
import java.util.*;
public interface FireworksListener extends EventListener
{
public abstract void exploded(FireworksEvent e);
}
您應(yīng)該為此事件設(shè)置中的每個(gè)事件定義一個(gè)公用抽象方法,例如在此例子中的 exploded。而且,偵聽器類必須擴(kuò)展 EventListener ,以使 JAR 向?qū)軌蛘业剿?/p>
然后,如果由 bean 類播送事件,它必須跟蹤偵聽事件的對象。要這樣做,您需要定義偵聽器實(shí)例變量以及 addListener 和 removeListener 方法。返回 Fireworks.java 源,例如,您將查看到:
private Vector listeners = new Vector();
public void addFireworksListener(FireworksListener f)
{
listeners.addElement(f);
}
public void removeFireworksListener(FireworksListener f)
{
listeners.removeElement(f);
}
最后,bean 類需要以正確的次數(shù)將事件實(shí)際播送到所有的偵聽器。要這樣做,您需要定義 processEvent 方法并以適當(dāng)?shù)拇螖?shù)調(diào)用它,例如:
public void processFireworksEvent(FireworksEvent e)
{
for (Enumeration enum = listeners.elements(); enum.hasMoreElements(); )
((FireworksListener)enum.nextElement()).exploded(e);
}
public void run()
{
processFireworksEvent(new FireworksEvent(this, FireworksEvent.EXPLODED));
}
注意事項(xiàng)
實(shí)際應(yīng)用中,在表現(xiàn)對象或者處理前擴(kuò)展JavaBean的設(shè)計(jì)非常有用。通常認(rèn)為如果提供信息,web開發(fā)者將在功能上滿足用戶對JavaBean的需求。例如: HTML中顯示敏感的數(shù)據(jù)時(shí),用戶可以屏蔽的條目,如密碼、電話號碼等。
良好規(guī)劃設(shè)計(jì)的JavaBean是值得信賴的。
Java 中的 null 不同于SQL中的 null
看這樣一道測試程序:
publicclassNullTest
{
public static void main(String[] args)
{
int I = 0;
// int I = null;// not a valid initialization;
String str = null;
String strZeroOutValue = "";
StringBuffer sb = new StringBuffer("ull test: String initializedasnull =");
sbappend(str);
sb.append(" String representing a Zero Out Value:")
sb.append(strZeroOutValue);
System.out.println(sb.toString());
}
}
這個(gè)程序?qū)a(chǎn)生下面的結(jié)果:
Null test: String initialized as null = null
n String representing a Zero Out Value:
在JavaBean中,我們將 I變量聲明為一個(gè) int,我們必須處理與該變量相關(guān)的值,因?yàn)镮 默認(rèn)的沒有值,int類型無法初始化為 null,如果int 值沒有進(jìn)行明確的初始化,編譯器將提示錯(cuò)誤。
執(zhí)行 NullTest程序,將驗(yàn)證在文本中空字符串是空值的替代,用于顯示 SQL 的插入和更新。如果我們需要?jiǎng)h除一些信息,通過刪除表單區(qū)域的文本,需要將數(shù)據(jù)庫發(fā)送長度為0的字符串。
盡管大多數(shù)數(shù)據(jù)庫將空字符串作為空值進(jìn)行操作,如果我們使用的數(shù)據(jù)庫不支持處理空字符串的話,我們必須寫入附加的java代碼,來創(chuàng)建自己的SQL插入聲明。
例如:
if(test.length==0)
{
sbappend("null");
}
else
{
sb.append(test);
}
區(qū)別EJB
JavaBean?和?Server?Bean(通常稱為Enterprise?JavaBean(EJB))有一些基本相同之處。它們都是用一組特性創(chuàng)建,以執(zhí)行其特定任務(wù)的對象,獲得其它特性的能力。這使得?bean?的行為根據(jù)特定任務(wù)和所在環(huán)境的不同而有所不同。Enterprise?Bean?與?JavaBean?不同。JavaBean?是使用java.beans包開發(fā)的,它是?Java?2?標(biāo)準(zhǔn)版的一部分。JavaBean?是一臺機(jī)器上同一個(gè)地址空間中運(yùn)行的組件。JavaBean?是進(jìn)程內(nèi)組件。Enterprise?Bean?是使用?javax.ejb?包開發(fā)的,它是標(biāo)準(zhǔn)JDK的擴(kuò)展,是?Java?2?Enterprise?Edition?的一部分。Enterprise?Bean?是在多臺機(jī)器上跨幾個(gè)地址空間運(yùn)行的組件。因此?Enterprise?Bean?是進(jìn)程間組件。JavaBean?通常用作?GUI?窗口小部件,而?Enterprise?Bean?則用作分布式商業(yè)對象。
參考資料 >