JAVABEAN

出自 华夏文化百科
於 2014年8月16日 (六) 06:48 由 Test 32(對話 | 貢獻) 所做的修訂 (1個修訂:HDwiki 数据迁移 - 批次 863)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
前往: 導覽、 搜尋


用戶可以使用JavaBean將功能、處理、值、數據庫訪問和其他任何可以用java代碼創造的對象進行打包,並且其他的開發者可以通過內部的JSP頁面、Servlet、其他JavaBean、applet程序或者應用來使用這些對象。用戶可以認為JavaBean提供了一種隨時隨地的複製和粘貼的功能,而不用關心任何改變。


JavaBean是Sun微系统的一个面向对象的编程接口,它可以让你建可重用应用程序或能在网络中任何主流操作系统平台上配置的程序块,称作组件。像Java applet一样,JavaBeans组件(或“Beans”)能够给予万维网页面交互的能力,例如:计算感兴趣的比率或是根据用户或浏览器的特性改变页面内容。


從用戶的觀點來看,一個組件可以是一個與你交互的按鈕或是一個當你按下按鈕它便開始的小計算程序。從一個開發者的觀點來看,那個按鈕組件和計算器組件是分別被創建的,並且他們可以一起使用或是在不同的應用程序或情況下和不同的組件產生不同的組合來使用。


当组件或Beans在使用过程中,Bean的性质(比如,一个窗口的背景色)对于其他Bean来说是可见的,并且,之前没“碰到”过的Bean也可以动态地获悉彼此的特性并从而进行交互。 


Bean是隨Sun的Bean開發包(BDK)開發出來的,並且能在任何主流操作系統平台的許多應用程序環境(人們所說的「容器」,container)中運行,包括瀏覽器,文字處理軟件,以及一些其他應用。 


要想用JavaBeans建一个组件,你必须用Sun的Java编程语言来写程序,并且在程序中包括描述组件特性的JavaBeans语句,这些组件特性例如:用户接口的特性,以及触发一个bean和在同一个容器中或网络其他地方的其他的bean交流的事件。  


Bean也有持續性,持續性就是一種把一個組件的狀態存在一個安全處的機制。有了這種持續性,它能使,比如說,一個組件(bean)「記住」某個特定用戶在早些時候的用戶對話中所輸入的數據。 


JavaBeans给Java应用程序提供了OpenDoc和ActiveX接口已提供的这种复合文档的能力。


一、JavaBean的歷史


最初,JavaBean的目的是为了将可以重复使用的软件代码打包标准。特别是用与帮助厂家开发在综合开发环境(IDE)下使用的java软件部件。这些包括如Grid控件,用户可以将该部件拖放到开发环境中。从此,JavaBean就可以扩展为一个java web 应用的标准部件,并且JavaBean部件框架已经扩展为企业版的 Bean(EJB)。 


二、JavaBean和企業Bean的區別


JavaBean 和 Server Bean(通常称为 Enterprise JavaBean (EJB))有一些基本相同之处。它们都是用一组特性创建,以执行其特定任务的对??获得其它特性的能力。这使得 bean 的行为根据特定任务和所在环境的不同而有所不同。 


Enterprise Bean 與 JavaBean 不同。JavaBean 是使用 java.beans 包開發的,它是 Java 2 標準版的一部分。JavaBean 是一台機器上同一個地址空間中運行的組件。JavaBean 是進程內組件。Enterprise Bean 是使用 javax.ejb 包開發的,它是標準 JDK 的擴展,是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多台機器上跨幾個地址空間運行的組件。因此 Enterprise Bean 是進程間組件。JavaBean 通常用作 GUI 窗口小部件,而 Enterprise Bean 則用作分布式商業對象.


三、JavaBean 的發展


最初,JavaBean的目的是為了將可以重複使用的軟件代碼打包標準。特別是用與幫助廠家開發在綜合開發環境(IDE)下使用的java軟件部件。這些包括如Grid控件,用戶可以將該部件拖放到開發環境中。從此,JavaBean就可以擴展為一個java web 應用的標準部件,並且JavaBean部件框架已經擴展為企業版的 Bean(EJB)。


四、JavaBean需求


avaBean是java類,屬於某些特定的譯碼知道方針,並且擴展了適應性和範圍,允許用戶訪問內部的屬性和方法。通過這些,JavaBean類可以用於下列方法:


1.在IDE中,JavaBean的功能允许应用开发者浏览其中的方法,即使JavaBean是被编译的,并且无法利用原始的源文件。 2.在 Remote Method Invocation(RMI) 的分布式风格中,这项功能听起来并不让人兴奋,但是在未来的包含企业版的JavaBean后,将改变这种情况。 3.为了JavaBean的属性值和状态可以保存到磁盘上。


這裡說的有些簡單,如果想了解更多的東西,可以查閱一些資料。


五、JavaBean設計注意事項


實際應用中,在表現對象或者處理前擴展JavaBean的設計非常有用。通常認為如果提供信息,web開發者將在功能上滿足擁護對JavaBean的需求。例如: HTML中顯示敏感的數據時,用戶可以屏蔽的條目,如密碼、電話號碼等。


良好规划设计的JavaBean是值得信赖的。


Java 中的 null 不同於 SQL 中的 null


看这样一道测试程序:


public class NullTest{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(「Null test: String initialized as null = 「);sb.append(str);sb.append(「n String representing a Zero Out Value:」);sb.append(strZeroOutValue);System.out.println(sb.toString());}} 這個程序將產生下面的結果:


Null test: String initialized as null = nullString representing a Zero Out Value:


在JavaBean中, 我們將 I 變量聲明為一個 int, 我們必須處理與該變量相關的值,因為I 默認的沒有值,int 類型無法初始化為 null, 如果int 值沒有進行明確的初始化,編譯器將提示錯誤。 執行 NullTest 程序,將驗證在文本中空字符串是空值的替代,用於顯示 SQL 的插入和更新。如果我們需要刪除一些信息,通過刪除表單區域的文本,需要將數據庫發送長度為0的字符串。儘管大多數數據庫將空字符串作為空值進行操作,如果我們使用的數據庫不支持處理空字符串的話,我們必須寫入附加的java代碼,來創建自己的SQL插入聲明。例如:if(test.length==0){sb.append(「null」);}else{sb.append(test);}


JavaBean 的范围:


JavaBean 的範圍。 Scope 是一個具有生命時間的變量。JavaBean的範圍在標誌中右邊進行表示。將產生一個JavaBean的快捷參考。


说明:jsp服务器引擎将剥离 


存在下面四種範圍: 頁面、 請求、 對話、 應用。


对话范围: 对话范围的JavaBean 主要应用与跨多个页面和时间段: 例如填充 用户信息。 添加信息并且接受回馈,保存用户最近执行页面的轨迹。对话范围JavaBean保留一些和用户对话 ID 相关的信息。这些信息来自临时的对话cookie,并在当用户关闭浏览器时,这个cookie将从客户端和服务器删除。


頁面/請求範圍: 頁面和請求範圍的JavaBean有時類似表單 的bean , 這是因為 他們大豆用與處理表單。表單需要很長的時間來處理用戶的輸入??外頁面和請求範圍的bean可以用於減少大型站點服務器上的負載,如果使用對話bean,耽擱的處理就可能會消耗掉很多資源。


应用: 


應用範圍通常應用於服務器的部件,例如 JDBC 連接池、應用監視、擁護計數和其他參與用戶行為的類。


在Bean中限制HTML的产生:


理論上,JavaBean 將不會產生任何HTML,因為這是jsp層負責的工作;然而,為了動態消息提供一些預先準備的格式是非常有用的。產生的HTML將被標註的 JavaBean方法返回。


这里有一些非常重要的事情:


1.不要試圖在JavaBean返回的HTML中放置任何字體尺寸。 並不是所有的瀏覽器都相同。很多瀏覽器無法處理完整的字體尺寸。 2.不要試圖在JavaBean返回的HTML中放置任何腳本或者DHTML。 向頁面直接輸出腳本或者DHTML相當於自我毀滅,因為某些瀏覽器版本在處理不正確的腳本時會崩潰(非常少但是有)。如果用戶的JavaBean在運行時是動態的推出複雜的HTML語言,用戶將陷入調試的噩夢。另外,複雜的HTML將限制JavaBean的壽命和靈活性。 3.不要提供任何的選擇。 如果用戶使用不同的系統瀏覽頁面,可以提供一種可以替換的方法。


六、JavaBean的任務


JavaBean的任務就是: 「Write once, run anywhere, reuse everywhere」,即「一次性編寫,任何地方執行,任何地方重用」。這個任何實際上就是要解決困擾軟件工業的日益增加的複雜性,提供一個簡單的、緊湊的和優秀的問題解決方案。


1. 一个开发良好的软件组件应该是一次性地编写,而不需要再重新编写代码以增强或完善功能。因此,JavaBean应该提供一个实际的方法来增强现有代码的利用率,而不再需要在原有代码上重新进行编程。除了在节约开发资源方面的意义外,一次性地编写JavaBean组件也可以在版本控制方面起到非常好的作用。开发者可以不断地对组件进行改进,而不必从头开始编写代码。这样就可以在原有基础上不断提高组件功能,而不会犯相同的错误。


2. JavaBean組件在任意地方運行是指組件可以在任何環境和平台上使用,這可以滿足各種交互式平台的需求。由於JavaBean是基於Java的,所以它可以很容易地得到交互式平台的支持。JavaBean組件在任意地方執行不僅是指組件可以在不同的操作平台上運行,還包括在分布式網絡環境中運行。


3.JavaBean组件在任意地方的重用说的是它能够在包括应用程序、其他组件、文档、Web站点和应用程序构造器工具的多种方案中再利用。这也许是JavaBean组件的最为重要的任务了,因为它正是JavaBean组件区别于Java程序的特点之一。Java程序的任务就是JavaBean组件所具有的前两个任务,而这第3个任务却是JavaBean组件独有的。


七、JavaBean的設計目標及其如何被實現


现在我们来看一实现JavaBean的一些具体的主要设计目标: 


1.緊湊而方便的創建和使用


JavaBean紧凑性的需求是基于JavaBean组件常常用于分布式计算环境中,这使得JavaBean组件常常需要在有限的带宽连接环境下进行传输。显然,为了适应传送的效率和速度,JavaBean组件必须是越紧凑越好。另外,为了更好地创建和使用组件,就应该使其越简单越好。通常为了提高组件的简易性和紧凑性,设计过程需要投入相对较大的功夫。


現在已有的組件軟件技術通常是使用複雜的API,這常常搞得開發者在創建組件時暈頭轉向。因此,JavaBean組件必須不僅容易使用,而且必須便於開發。這對於組件開發者而言是至關重要的,因為這可以使得開發者不必花大量功夫在使用API進行程序設計上,從而更好地對組件進行潤飾,提高組件的可觀賞性。


JavaBean组件大部分是基于已有的传统Java编程的类结构上的,这对于那些已经可以熟练地使用Java语言的开发者非常有利。而且这可以使得JavaBean组件更加紧凑,因为Java语言在编程上吸收了以前的编程语言中的大量优点,已经使开发出来的程序变得相当有效率。


2.完全的可移植性


JavaBean API与操作基础的独立于平台的Java系统相结合,提供了独立于平台的组件解决方案。因此,组件开发者就可以不必再为带有Java applet平台特有的类库而担心了。最终的结果都将是计算机界共享可重复使用的组件,并在任何支持Java的系统中无需修改地执行。


3.繼承Java的強大功能


现有的Java结构已经提供了多种易于应用于组件的功能。其中一个比较重要的是Java本身的内置类发现功能,它可以使得对象在运行时彼此动态地交互作用,这样对象就可以从开发系统或其开发历史中独立出来。


對於JavaBean而言,由於它是基於Java語言的,所以它就自然地繼承了這個對於組件技術而言非常重要的功能,而不再需要任何額外開銷來支持它。


JavaBean继承在现有Java功能中还有一个重要的方面,就是持久性,它保存对象并获得对象的内部状态。通过Java提供的序列化(serialization)机制,持久性可以由JavaBean自动进行处理。当然,在需要的时候,开发者也可以自己建立定制的持久性方案。


4.應用程序構造器支持


JavaBean的另一个设计目标是设计环境的问题和开发者如何使用JavaBean创建应用程序。JavaBean体系结构支持指定设计环境属性和编辑机制以便于JavaBean组件的可视化编辑。这样开发者可以使用可视化应用程序构造器无缝地组装和修改JavaBean组件。就像Windows平台上的可视化开发工具VBX或OCX控件处理组件一样。通过这种方法,组件开发者可以指定在开发环境中使用和操作组件的方法。


5.分布式計算支持


支持分布式计算虽然不是JavaBean体系结构中的核心元素,但也是JavaBean中的一个主要问题。


JavaBean使得開發者可以在任何時候使用分布式計算機制,但不使用分布式計算的核心支持來給自己增加額外負擔。這正是出於JavaBean組件的緊湊性考慮的,無疑分布式計算需要大量的額外開銷。


八、JavaBean和Java


雖然JavaBean和Java之間已經有了明確的界限,但在某些方面JavaBean和Java之間仍然存在着非常明顯的混淆。Java確實是能夠為用戶創建可重用的對象,但它卻沒有管理這些對象相互作用的規則或標準。JavaBean通過指定定義對象之間交互作用的機制,以及大部分對象需要支持的常用行為,如持久性和實際處理等,建立了自己需要的組件模型。


虽然当前的Java组件模型也可以运行得很好,但在传送真正的可重用性和交互操作性上仍然非常有限,Java用户需要做的最多的一件事就是创建applet并使得它们在Web 页面上相互通讯,这并非易事。JavaBean提供了一个框架包,使用这个包进行通讯就容易得多了。


JavaBean組件能夠通過定義好的標準屬性改進性能。總體而言,JavaBean充分發展了Java applet的功能,並結合了Java AWT組件的緊湊性和可重用性。


九、JavaBean組件的基本概念


JavaBean是可復用的平台獨立的軟件組件,開發者可以在軟件構造器工具中其直接進行可視化操作。 軟件構造器工具可以是Web頁面構造器、可視化應用程序構造器、CUI設計構造器或服務器應用程序構造器。有時,構造器工具也可以是一個包含子一些bean的複合文檔的文檔編輯器。 JavaBean可以是簡單的CUI要素,如按鈕或滾動條;也可以是複雜的可視化軟件組件,如數據庫視圖,有些JavaBean是沒有GUI表現形式的,但這些JavaBean仍然可以使用應用程序構造器可視化地進行組合。 一個JavaBean和一個Javaapplet相似,是一個非常簡單的遵循某種嚴格協議的Java類。每個JavaBean的功能都可能不一樣,但它們都必須支持以下特徵。 一個bean沒有必須繼承的特定的基類或接口。可視化的bean必須繼承的類是java.awt.Component,這樣它們才能添加到可視化容器中去,非可視化bean則不需要繼承這個類。有許多bean,無論是在應用程序構造器工具中,還是在最後創建好的應用程序中,都具有很強的可視化特徵,但這並非每個bean必須的特徵。 在使用Java編程時,並不是所有軟件模塊都需要轉換成bean。Bean比較適合於那些具有可視化操作和定製特性的軟件組件。 從基本上說,JavaBean可以看成是一個黑盒子,即只需要知道其功能而不必管其內部結構的軟件設備。黑盒子只介紹和定義其外部特徵和與其他部分的接口,如按鈕、窗口、顏色、形狀、句柄等。 通過將系統看成使用黑盒子關聯起來的通訊網絡,我們可以忽略黑盒子內部的系統細節,從而有效地控制系統的整體性能。作為一個黑盒子的模型,JavaBean有3個接口面,可以獨立進行開發。 1. JavaBean可以調用的方法。 2. JavaBean提供的可讀寫的屬性。 3. JavaBean向外部發送的或從外部接收的事件。


九、JavaBean組件的開發環境


普通JavaBean組件是要分布在各自環境中,所以它們應該能夠適應各種環境。雖然我們無法事先預知JavaBean要運行的確切環境,但以下兩點是可以確定的: 1. bean必須能夠在一個應用程序構造器工具中運行。 2. bean必須可以在產生的應用程序的運行環境中使用。


设计环境


第一點說明的是bean必須可以在設計環境(design environment)中運行。在設計環境中,bean應該提供設計信息給應用程序構造器工具並允許終端用戶制定bean的外  觀和行為。在傳統的軟件構造活動中,必須通過編譯、鏈接之後才能看到應用程序的最終運行結果;而利用JavaBean設計的軟件中,則沒有這種明確的界限。使用JavaBean,就可以非常直觀地設計應用程序軟件,在設計過程中賦予軟件生機。而且,這個過程更加容易重複開發,設計思想更加容易變成原型。


运行环境


第二點說明的是bean必須可以在運行環境(run-time environment)中使用。在這個環境中,對設計信息和定製的需求並不重要。一個組件的設計環境信息和設計環境中編寫的代碼通常可能是非常巨大的。 因此,我們可能需要在bean的設計環境方面和運行環境方面作一個明確的區分,這樣,就可能需要在運行環境中不使用bean的任何設計環境代碼來配置這個bean。所以,JavaBean就必須分別支持運行環境接口的類庫和設計環境接口的類庫。


十、JavaBean入門


一般要求首先,您必須有一個不帶有參數的公用構造器。此構造器也應該通過調用各個特性的設置方法來設置特性的缺省值,例如:


public Fireworks(){setAutoStart(true);setBackground(Color.black);setSpeed(10);setRadius(40);...}


如果 bean 是一個從 java.awt.Component 類繼承而來的可視 bean,您就應該為 bean 定義一個缺省的首選大小,例如:


public Dimension getPreferredSize(){return (new Dimension(radius*3, radius*3));}


public Dimension getMinimumSize(){return getPreferredSize();}


特性對於您需要的每個特性,您應該有一個帶有匹配公用 getter 和 setter 方法的專用實例變量,例如:


private int speed;...public int getSpeed(){return speed;}


public void setSpeed(int s){speed = s;}


此 get 和 set 方法必須有與實例變量相同的名稱,但是第一個字母要大寫並以 get 和 set 開頭。


由於連接而在任何時候更改它們的特性時,確認 Bean 在運行時行為正確也是很重要的。如果特性的更改影響到 Bean 的可視外觀,您應該以此特性設置的方法來調用


repaint();。


同樣,如果特性的更改影響到 bean 的大小和位置,您需要確認獲得驗證的事物。我們建議編寫您自己的 validateAll 方法,如下所示:


private void validateAll(){if (isValid()){Component self = this;self.invalidate();Component myParent = self.getParent();if (myParent != null){myParent.invalidate();self = myParent;}self.validate();}}


然後以此特性設置的方法調用


validateAll();。


 


bean 類將無法進行關於調用特性設置方法命令的假設。您應該寫 bean 以便可以初始構造它,然後在不引起錯誤的同時在任何命令中設置其特性。


操作對於每個您需要的操作,您應該有一個公用方法,例如:


public void start(){if(thread==null){thread=new Thread(this);thread.start();}}


您為操作寫的方法應該在無須期待用戶創建連接或設置很多特性的情況下獨立操作。 例如,如果您寫了一個音頻 Bean,您希望通過播放操作處理打開聲音的所有步驟、完成您需要的所有設置並播放聲音。同樣,即使聲音未播放,停止操作也應起作用。


事件對於您需要的每個事件或事件設置,您應該定義事件和偵聽器類。對於此例,查看 FireworksEvent.java 源文件以及 Fireworks.java 文件。此事件類的源應該如同這樣:


import java.awt.*;import java.util.*;


public class FireworksEvent extends EventObject{public static final int EXPLODED = 1;


int id = 0;


public FireworksEvent(Component source, int id){super(source);this.id = id;}


public int getID(){return id;}}


您應該為此事件設置中的每個事件定義一個公用靜態結束事件標識符,例如在此例子中的 EXPLODED。


對於偵聽器類的源,查看 FireworksListener.java 源文件:


import java.util.*;


public interface FireworksListener extends EventListener{public abstract void exploded(FireworksEvent e);}


您應該為此事件設置中的每個事件定義一個公用抽象方法,例如在此例子中的 exploded。 而且,偵聽器類必須擴展 EventListener ,以使 JAR 嚮導能夠找到它。


然後,如果由 bean 類播送事件,它必須跟蹤偵聽事件的對象。要這樣做,您需要定義偵聽器實例變量以及 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 類需要以正確的次數將事件實際播送到所有的偵聽器。要這樣做,您需要定義 processEvent 方法並以適當的次數調用它,例如:


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));}