摘要:分析了授權事件模型及JavaBeans構件的組成,詳細描述了基于授權事件模型的Bean定制事件的實現,包括添加Bean事件,定義事件類,定義監聽器接口,監聽器及事件源類的實現,最后編寫實例驗證了構件的正確性。
關鍵詞:構件;授權事件模型;定制事件;事件處理
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)21-5831-03
Basing the Mode of Event-Delegation to Realized the Customizing Event of Component
WANG Hong-biao, ZHAO Shi-xia
(Section of Computer Teaching and Research, Henan Provincial Youth League School, Zhengzhou 450002, China)
Abstract: The article introduces the Event-Delegation pattern of the component and the composition of JavaBeans, and mainly gives a detailed analysis ofthe event model based on the authorization of Bean custom events, including the definition, adding Bean events of events, defining a monitor, monitor and interface of source, finally verified by examples written the correctness of the component.
Key words: component; event-delegation; customize-event; event-process
構件是應用程序可重復使用的部分,使用軟件構件類似像搭積木,能快速構造應用程序,實現功能的一些擴充。JavaBeans是JAVA語言寫成的可重用組件,在JSP中JavaBeans常用來封裝業務邏輯,數據庫操作或執行復雜的計算任務等等,JavaBeans的任務就是“一次性編寫,任何地方執行,任何地方重用”, JavaBeans使用授權事件模型。
1 授權事件模型
JAVA的授權事件模型包含三個概念:事件源,事件,事件監聽器,其中,事件源是產生事件的組件,當這個組件的內部狀態改變時,事件就會產生,一個事件源必須注冊一個事件監聽器已使監聽器能夠可以接受一個特定時間的通知。每一種事件都有它特定的注冊方法;事件是描述了一個事件源的狀態改變的對象,可能通過人機接口的交互產生。如輸入文字,點擊鼠標,也可在定時器中到期而產生,當然用戶也可以自由的定義自己的事件;事件監聽器是實現了事件處理,當事件發生時的時候被通知的對象,它必須有實現與事件對應的監聽接口,并在事件源中注冊且具有實現接受和處理事件通知的方法。圖1為單擊按鈕JButton的授權事件模型的工作過程,其中,JButton按鈕就是事件源,當點擊JButton按鈕后,生成一個用于存放該事件參數的ActionEvent的對象,原先已被告知對該類事件感興趣的偵聽器,調用了ActionListener接口中的actionPerformed()方法,并以事件對象作為實參,處理完成后,把結果交付業務邏輯層。
2 JavaBeans定制事件的實現
事件是由事件對象、事件源、事件監聽處理程序三部分組成。Bean與其他軟件組件交流信息的主要方式是發送和接受事件,當用戶點擊Bean構件內部的某個控件時,可以產生一個事件對象,事件為JavaBeans組件提供了一種發送通知給其他組件的方法,把這個產生事件Bean構件稱為事件源, 事件源就是事件的啟動者,由它觸發一個或多個事件目標,一個事件源可以注冊事件監聽器對象。按照授權事件模型需要把產生的事件以對象形式傳遞給監聽該事件的容器或組件,在事件發生時,事件源不再負責處理所發生的事件,而是將其委托給已注冊的事件監聽器對象調用一個適當的事件處理方法來進行處理。
2.1 添加JavaBeans事件
JavaBeans通過傳遞事件在JavaBeans之間通信,JavaBeans用一個事件告訴另一個JavaBeans采取一個動作或告訴其狀態發生了改變。事件從源聽眾注冊或發表并通過方法調用傳遞到一個或幾個目標聽眾。要為一個JavaBeans組件添加自定義事件的處理,應遵守以下開發步驟:
1)編寫自定義事件對象;
2)編寫自定義事件偵聽器接口;
3)為JavaBeans組件增加注冊,注銷事件監聽器的方法,和事件監聽的通知方法;
4)編寫自定義事件偵聽器的接口的實現類,對自定義事件進行處理;
5)在JavaBeans組件的使用類中,利用JavaBeans組件的注冊方法,將事件監聽器與JavaBeans組件進行關聯。
2.2 事件類
事件類就是定義事件對象的特征,所有的事件類必須繼承Java事件基類java.util.EventObject。EventObject定義了事件類的共有特征,其中,最重要的屬性是Object類型的source,這個屬性指明了事件源。EventObject類提供了getSource()方法來獲取事件源,事件源的設置是由構造方法EventObject(Object source)來實現的。下面舉例說明事件類DemoEvent的定義:
package eventdrivendemo;
import java.util.EventObjiect;// 繼承了事件基類EventObject
public class DemoEvent extends EventObject{
public DemoEvent(Object source){// 事件源的設置
super(source));
}
}
定義了事件類后,產生一個事件,若想引用事件類,可以通過new操作符實例化了DemoEvent類并將其賦值給De,DemoEvent event = new DemoEvent(this)。
2.3 監聽器接口
監聽器接口定義了一個類要成為監聽器必須具備的功能。每種事件類都有自己的監聽器接口,不同事件類的監聽器接口可以很不一樣,但所有的監聽器接口也都必須繼承監聽器接口基類java.util.EventListener, EventListener本身沒有定義任何方法,它只是一個標志接口,用來表明所有繼承自EventListener的接口屬于監聽器接口。
下面舉例說明事件類DemoEvent的監聽接口DemoListener的定義:
package eventdrivendemo;
import java.util.EventListener;//DemoListener接口繼承java.util.EventListener接口
public interface DemoEvent extends EventListener{
public void handleEvent (DemoEvent Event{//定義了一個事件處理方法handleEvent()
}
2.4 監聽器
監聽器是監聽器接口的實現者,提供監聽器接口中定義的所有方法的實現代碼。事件的處理由事件監聽器進行管理,任何事件處理程序首先都需要向事件監聽器注冊,事件監聽器好像是事件的客戶一樣,提供了一種普適的不經過繼承關系而進行通訊的方法。當系統監聽到事件后,就把事件的處理工作委托給事件監聽器來完成。事件監聽器通過分析事件的屬性信息,把事件交給已注冊的相應事件處理器來處理。下面介紹監聽器的實現。
package eventdrivendemo;
public class Mylistener inplements DemoListener{// MyListener是監聽器名稱, 實現了DemoListener接口, 能對DemoEvent事件作出響應
public void handleEvent (DemoEvent Event{//事件處理方法handleEvent()中,監聽器MyListener從入口參數即DemoEvent對象event中獲取了事件源
object eventsource=event.getsource();
system.out.println(eventsource+\"Demoevent事件觸發\");
system.out.println(\"\"+this+“響應\");//在系統標準輸出上顯示兩行文字,說明哪個對象觸發了消息,哪個對象作出了響應
}
}
2.5 事件源類
事件源是Java事件驅動模式的啟動者,只有事件源產生并發出事件,才能啟動監聽器對事件作出響應。作為事件源的類,必需滿足以下條件:
1)事件源必須在內部維護一個已注冊監聽器的列表。當某監聽器注冊時,該監聽器被添加到列表中,而監聽器注銷時,則從列表中刪除;
2)事件源必須提供注冊方法,以允許監聽器注冊為事件的接收者;
3)事件源必須提供注銷方法,以允許監聽器注銷,停止對事件的接收;
4)事件源必須能夠實例化事件類,即產生事件對象;
5)當事件對象被產生后,事件源必須向所有的注冊監聽器廣播該消息。事件的廣播,是通過逐個調用監聽器列表中所有監聽器的事件處理方法來實現的。
下面創建一個Java類并命名為DemoSource,作為DemoEvent事件的事件源,編寫必要的代碼,使其能滿足事件源的上述5個條件,篇幅有限,隱藏了所有的細節代碼,僅列出DemoSource類的框架。
public class DemoSource {
public DemoSource() {...}//DemoEvent事件的事件源
private int value;//// value字段
public int getValue() {...} value的getter方法
public void setValue(int value) {...}// value的setter方法。如果值改變,觸發DemoEvent事件。
private List
public void addListener(DemoListener listener) {...}// 監聽器注冊方法
public void removeListener(DemoListener listener) {...}// 監聽器注銷方法
public void broadcast(DemoEvent event) {...}// 事件廣播方法
2.6 編寫實例
public static void main(string[] args){//主類Main的靜態入口方法
DemoSource demoSource1=new Demosource();//產生事件源類DemoSource的一個實例demoSource1
Mylistener mylistener1=new MyListener();//產生監聽器類MyListener的實例myListener1
Mylistener mylistener2=new MyListener();//產生監聽器類MyListener的實例myListener2
demoSource1.addListener(mylistener1);//在demoSource1上注冊myListener1監聽器
demoSource1.addListener(mylistener2);//在demoSource1上注冊myListener2監聽器
demoSource1.setValue(8);//修改demoSource1的value屬性,以觸發DemoEvent事件
測試結果表明:DemoSource類的一個實例觸發了DemoEvent事件,MyListener的兩個實例對事件作出了響應,和期望一致。
3 結束語
運用授權事件模型能實現JavaBeans構件事件高效的傳遞和處理, 它按照事件源~監聽器的事件處理模型處理事件, 事件源發出事件,監聽器捕獲事件并作出響應的過程。在一個事件源產生事件時,系統就可以自動調用該事件監聽器的事件處理方法,將事件對象作為方法的參數傳入,執行該方法就可以完成對事件的處理。
參考文獻:
[1] 徐林林.Java Web 編程從入門到實踐[M].北京:清華大學出版社,2010.
[2] 溫尚書,陳石華,萬欣.Java Web編程入門與實戰[M].北京:人民郵電出版社,2010.
[3] 張興科.JSP動態網站設計項目教程[M].北京:中國人民大學出版社,2010.
[4] 方振宇.Java Web開發從初學到精通[M].北京:電子工業出版社,2010.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文